1.1. Entry Test

1.1.1. Assignments

Code 1.35. Entry Test Assignment A
"""
* Assignment: About EntryTest Warmup
* Complexity: easy
* Lines of code: 1 lines
* Time: 2 min

English:
    1. Define variable `result` with value 1
    2. Run doctests - all must succeed

Polish:
    1. Zdefiniuj zmienną `result` z wartością 1
    2. Uruchom doctesty - wszystkie muszą się powieść

Why:
    * Warmup before entry test
    * Verify that environment is set up correctly
    * Learn how to run doctests
    * Learn how to use IDE test runner
    * Learn how to read doctests output
    * Learn how to compare doctests output with results

Tests:
    >>> import sys; sys.tracebacklimit = 0
    >>> from pprint import pprint

    >>> assert result is not Ellipsis, \
    'Assign result to variable: `result`'
    >>> assert type(result) is int, \
    'Variable `result` has invalid type, should be int'

    >>> pprint(result)
    1
"""

# Define variable `result` with value 1
# type: int
result = ...


Code 1.36. Entry Test Assignment B
"""
* Assignment: About EntryTest ToListDict
* Complexity: easy
* Lines of code: 2 lines
* Time: 5 min

English:
    1. Define `result: list[dict]`:
    2. Convert `DATA` from `list[tuple]` to `list[dict]`
        a. key - name from the header
        b. value - numerical value or species name
    3. Run doctests - all must succeed

Polish:
    1. Zdefiniuj `result: list[dict]`:
    2. Przekonwertuj `DATA` z `list[tuple]` do `list[dict]`
        a. klucz - nazwa z nagłówka
        b. wartość - wartość numeryczna lub nazwa gatunku
    3. Uruchom doctesty - wszystkie muszą się powieść

Why:
    * Convert data from list[tuple] to list[dict]
    * list[tuple] is used to represent CSV data
    * list[tuple] is used to represent database rows
    * list[dict] is used to represent JSON data
    * CSV is the most popular format in data science

Tests:
    >>> import sys; sys.tracebacklimit = 0
    >>> from pprint import pprint

    >>> assert result is not Ellipsis, \
    'Assign result to variable: `result`'
    >>> result = list(result)
    >>> assert type(result) is list, \
    'Result must be a list'
    >>> assert len(result) > 0, \
    'Result cannot be empty'
    >>> assert all(type(element) is dict for element in result), \
    'All elements in result must be a dict'

    >>> pprint(result, sort_dicts=False)
    [{'sepal_length': 5.8,
      'sepal_width': 2.7,
      'petal_length': 5.1,
      'petal_width': 1.9,
      'species': 'virginica'},
     {'sepal_length': 5.1,
      'sepal_width': 3.5,
      'petal_length': 1.4,
      'petal_width': 0.2,
      'species': 'setosa'},
     {'sepal_length': 5.7,
      'sepal_width': 2.8,
      'petal_length': 4.1,
      'petal_width': 1.3,
      'species': 'versicolor'},
     {'sepal_length': 6.3,
      'sepal_width': 2.9,
      'petal_length': 5.6,
      'petal_width': 1.8,
      'species': 'virginica'},
     {'sepal_length': 6.4,
      'sepal_width': 3.2,
      'petal_length': 4.5,
      'petal_width': 1.5,
      'species': 'versicolor'},
     {'sepal_length': 4.7,
      'sepal_width': 3.2,
      'petal_length': 1.3,
      'petal_width': 0.2,
      'species': 'setosa'}]
"""

DATA = [
    ('sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'),
    (5.8, 2.7, 5.1, 1.9, 'virginica'),
    (5.1, 3.5, 1.4, 0.2, 'setosa'),
    (5.7, 2.8, 4.1, 1.3, 'versicolor'),
    (6.3, 2.9, 5.6, 1.8, 'virginica'),
    (6.4, 3.2, 4.5, 1.5, 'versicolor'),
    (4.7, 3.2, 1.3, 0.2, 'setosa'),
]


# Convert DATA from list[tuple] to list[dict]
# type: list[dict[str,float|str]]
result = ...


Code 1.37. Entry Test Assignment C
"""
* Assignment: About EntryTest ToListTuple
* Complexity: easy
* Lines of code: 5 lines
* Time: 5 min

English:
    1. Load `DATA` from `list[dict]` format (similar to JSON)
    2. Convert data to `result: list[tuple]`
    3. Add header as a first line
    4. Run doctests - all must succeed

Polish:
    1. Wczytaj `DATA` z formatu `list[dict]` (podobny do JSON)
    2. Przekonwertuj dane do `result: list[tuple]`
    3. Dodaj nagłówek jako pierwszą linię
    4. Uruchom doctesty - wszystkie muszą się powieść

Why:
    * Convert data from list[dict] to list[tuple]
    * list[dict] is used to represent JSON data
    * list[tuple] is used to represent CSV data
    * list[tuple] is used to represent database rows
    * JSON is the most popular format in web development

Tests:
    >>> import sys; sys.tracebacklimit = 0
    >>> from pprint import pprint

    >>> assert result is not Ellipsis, \
    'Assign result to variable: `result`'
    >>> result = list(result)
    >>> assert type(result) is list, \
    'Variable `result` has invalid type, should be list'
    >>> assert len(result) > 0, \
    'Variable `result` should not be empty'
    >>> assert all(type(row) is tuple for row in result), \
    'Variable `result` should be a list[tuple]'

    >>> pprint(result)
    [('sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'),
     (5.8, 2.7, 5.1, 1.9, 'virginica'),
     (5.1, 3.5, 1.4, 0.2, 'setosa'),
     (5.7, 2.8, 4.1, 1.3, 'versicolor'),
     (6.3, 2.9, 5.6, 1.8, 'virginica'),
     (6.4, 3.2, 4.5, 1.5, 'versicolor'),
     (4.7, 3.2, 1.3, 0.2, 'setosa')]
"""

DATA = [
    {'sepal_length': 5.8, 'sepal_width': 2.7, 'petal_length': 5.1, 'petal_width': 1.9, 'species': 'virginica'},
    {'sepal_length': 5.1, 'sepal_width': 3.5, 'petal_length': 1.4, 'petal_width': 0.2, 'species': 'setosa'},
    {'sepal_length': 5.7, 'sepal_width': 2.8, 'petal_length': 4.1, 'petal_width': 1.3, 'species': 'versicolor'},
    {'sepal_length': 6.3, 'sepal_width': 2.9, 'petal_length': 5.6, 'petal_width': 1.8, 'species': 'virginica'},
    {'sepal_length': 6.4, 'sepal_width': 3.2, 'petal_length': 4.5, 'petal_width': 1.5, 'species': 'versicolor'},
    {'sepal_length': 4.7, 'sepal_width': 3.2, 'petal_length': 1.3, 'petal_width': 0.2, 'species': 'setosa'},
]


# Convert DATA from list[dict] to list[tuple]
# type: header = tuple[str,...]
# type: row = tuple[float,float,float,float,str]
# type: list[tuple[header|row,...]]
result = ...

Code 1.38. Entry Test Assignment D
"""
* Assignment: About EntryTest Endswith
* Complexity: easy
* Lines of code: 5 lines
* Time: 5 min

English:
    1. Define `result: list[str]`
    2. Collect in `result` all email addresses from `DATA` -> `crew`
       with domain names mentioned in `DOMAINS`
    3. Run doctests - all must succeed

Polish:
    1. Zdefiniuj `result: list[str]`
    2. Zbierz w `result` wszystkie adresy email z `DATA` -> `crew`
       z nazwami domenowymi wymienionymi w `DOMAINS`
    3. Uruchom doctesty - wszystkie muszą się powieść

Why:
    * Check if you can filter data
    * Check if you know string methods
    * Check if you know how to iterate over list[dict]

Tests:
    >>> import sys; sys.tracebacklimit = 0
    >>> from pprint import pprint

    >>> assert result is not Ellipsis, \
    'Assign result to variable: `result`'
    >>> assert type(result) is list, \
    'Result must be a list'
    >>> assert len(result) > 0, \
    'Result cannot be empty'
    >>> assert all(type(element) is str for element in result), \
    'All elements in result must be a str'

    >>> pprint(result)
    ['mlewis@nasa.gov',
     'rmartinez@nasa.gov',
     'avogel@esa.int',
     'cbeck@nasa.gov',
     'bjohanssen@nasa.gov',
     'mwatney@nasa.gov']
"""

DATA = {
    'mission': 'Ares 3',
    'launch': '2035-06-29',
    'landing': '2035-11-07',
    'destination': 'Mars',
    'location': 'Acidalia Planitia',
    'crew': [
        {'name': 'Melissa Lewis', 'email': 'mlewis@nasa.gov'},
        {'name': 'Rick Martinez', 'email': 'rmartinez@nasa.gov'},
        {'name': 'Alex Vogel', 'email': 'avogel@esa.int'},
        {'name': 'Chris Beck', 'email': 'cbeck@nasa.gov'},
        {'name': 'Beth Johanssen', 'email': 'bjohanssen@nasa.gov'},
        {'name': 'Mark Watney', 'email': 'mwatney@nasa.gov'},
        {'name': 'Pan Twardowski', 'email': 'ptwardowski@polsa.gov.pl'},
        {'name': 'Ivan Ivanovich', 'email': 'iivanovich@roscosmos.ru'},
    ],
}

DOMAINS = ('esa.int', 'nasa.gov')

# Email addresses with top-level domain in DOMAINS
# type: list[str]
result = ...


Code 1.39. Entry Test Assignment E
"""
* Assignment: About EntryTest ListDict
* Complexity: hard
* Lines of code: 15 lines
* Time: 13 min

English:
    1. Define `result: list[dict]`, where each dict has keys:
       * ip: str
       * hosts: list[str]
    2. Iterate over lines in `DATA` skipping comments (`#`) and empty lines
    3. Extract from each line: `ip` and `hosts`
    4. Add `ip` and `hosts` to `result` as a dict, example:
       {'ip': '10.13.37.1', 'hosts': ['nasa.gov', 'esa.int']}
    5. Each line must be a separate dict
    6. Mind, that for 127.0.0.1 there will be two separate entries
    7. Run doctests - all must succeed

Polish:
    1. Zdefiniuj `result: list[dict]`, gdzie każdy dict ma klucze:
       * ip: str
       * hosts: list[str]
    2. Iteruj po liniach w `DATA` pomijając komentarze (`#`) i puste linie
    3. Wyciągnij z każdej linii: `ip` i `hosts`
    4. Dodaj `ip` i `hosts` do `result` jako słownik, przykład:
       {'ip': '10.13.37.1', 'hosts': ['nasa.gov', 'esa.int']}
    5. Każda linia ma być osobnym słownikiem
    6. Zwróć uwagę, że dla 127.0.0.1 będą dwa osobne wiersze
    7. Uruchom doctesty - wszystkie muszą się powieść

Why:
    * Check if you know how to parse files
    * Check if you can filter strings
    * Check if you know string methods
    * Check if you know how to iterate over list[dict]

Tests:
    >>> import sys; sys.tracebacklimit = 0
    >>> from pprint import pprint

    >>> assert result is not Ellipsis, \
    'Assign result to variable: `result`'
    >>> result = list(result)
    >>> assert len(result) > 0, \
    'Result cannot be empty'
    >>> assert type(result) is list, \
    'Variable `result` has invalid type, should be list'
    >>> assert all(type(x) is dict for x in result), \
    'All keys in `result` should be dict'

    >>> pprint(result, width=120, sort_dicts=False)
    [{'ip': '127.0.0.1', 'hosts': ['localhost']},
     {'ip': '127.0.0.1', 'hosts': ['astromatt']},
     {'ip': '10.13.37.1', 'hosts': ['nasa.gov', 'esa.int']},
     {'ip': '255.255.255.255', 'hosts': ['broadcasthost']},
     {'ip': '::1', 'hosts': ['localhost']}]
"""

DATA = """##
# `/etc/hosts` structure:
#   - IPv4 or IPv6
#   - Hostnames
 ##

127.0.0.1       localhost
127.0.0.1       astromatt
10.13.37.1      nasa.gov esa.int
255.255.255.255 broadcasthost
::1             localhost"""

# Dict keys: ip, hosts
# type: list[dict]
result = ...