Cesta k maturitě

Zadáno v pátek 14. 5.

K odevzdání v úterý 18. 5.

  1. Napište funkci to5 a from5, která bude převádět mezi pětkovou a desítkovou soustavou. Zopakujte sei převody do binárky.
  2. Napište funkci sublen, která dostane seznam seznamů a vrátí seznam jejich délek
> sublen([[1,2,3], [0], []])
[3, 1, 0]
  1. Napište funkci dropwhile, která se začátku seznamu bude vyhazovat prvky, dokud bude zadaný predikát pravdivý.
> dropwhile(lambda x: x > 2, [5, 6, 2, 0, 8])
[2, 0, 8]
  1. Napište funkci, která rozhodne, zda je zadané číslo číslem složeným?
> composite(10)
true
> composite(7)
false
  1. Spočítejte ve stringu počet slov se zadanou délkou.
> countw("j dv tři čtyř pěttt šesšes zase čtyř", 4)
3
  1. Vymažte ze seznamu duplikované prvky, které jsou bezprostředně za sebou.
> nub([1, 1, 1, 3, 3, 2, 1, 2, 2])
[1, 3, 2, 1, 2]
  1. Máte dán seznam 2D vektorů a stejně dlouhý seznam násobků. Každý z vektorů vynásobte příslušným číslem a všechny výsledky nálsedně odečtěte od sebe.
> diff([(0, 0), (1, 1), (2, 2)], [1, 0, 2])
(-4, -4)
  1. Napište funkci, která v seznamu nechá jen ty prvky, pro které je pravdivý nějaký predikát.
> myf([1, 2, 3, 4, 5], lambda x: x != 2)
[1, 3, 4, 5]
  1. Máte zadanou tabulku jako seznam řádků. Vraťe seznam průměrů všech sloupců.
> mass_mean([[1, 1, 2], [1, 2, 3], [1, 0, 1]])
[1, 1, 2]
  1. Spočítejte výskyt všech znaků ve stringu.
> countch("abracadabra")
{"a": 5, "b": 2, "r": 2, "c": "1", "d": 1}
  1. Rozhodněte, zda je číslo dělitelné třemi, za pomocí pravidla o ciferném součtu.
> divisible3(33)
true
  1. Vyměňte všechny samohlásky v anglickém textu za tu zadanou.
> change("holka modrooka", "u")
"hulku mudruuku"
  1. Napište funkci, které počítá součin dvou čísel, za pomocí + (a bez použití *).
> times(3, 9)
27
  1. Máte zadané dvě funkce, nakreslete signum (znaménko) jejich rozdílu na zadaném intervalu, vždy v bodech celých čísel.
> def f(x): return 2 # konstatní funkce
> def g(x): return -3 + x
> compare(f, g, (0, 5))
  X # f(0) > g(0)
  X
  X
 X  # f(0) == g(0)
X
X   # f(0) < g(0)
  1. Zjistěte, zda je větší součet prvních n (True), nebo posledních n (False) prvků seznamu. Napište dvě verze, jednu z nich pomocí reveresed.
> f_or_l([1,1,1, 2,2,2], 3)
False
  1. Máte zadaný slovník, ve kterém klíče jsou jména měst a hodnota u daného města je seznam měst, se kterými je to konkrétní město propojeno jednosměrnou cestou. Máte za úkol zjistit, zda se ze zadaného města dostanu do jiného zadaného města.

Teorie

  • funkce, parametry, argumenty, loopy, podmiňovací příkazy if
  • yield X return X print
  • while a for/in cykly, pojem iterace
  • proč jsou if/else "lazy"
  • co je to algoritmus, časová složitost algoritmu
  • dynamické programování
  • binární vyhledávání v setřízeném seznamu a jeho časová složitost
  • co je to truthy hodnota
  • co je to REPL, proč se používá
  • jak funguje binární soustava, proč se v počítačích používá
  • co jsou zač prvočísla
  • jaký je rozdíl mezi polem (seznamem), tuplem, a slovníkem
    • kdy se používá co a proč (vč. rychlostí častých operací)
    • jak zhruba fungují slovníky, co je hashování
  • co jsou funkce vyššího řádu, proč se hodí mít pro ně v jazyce podporu
  • na jaké dvě/tři základní části se dělí většina jednoduchých programů

Řešení

def to5(n):
    temp = n
    result = ""
    while temp > 0:
        result = str(temp % 5) + result
        temp = temp // 5
    return result


def from5(n):
    power = len(n) - 1
    result = 0
    for d in str(n):
        result += int(d) * (5 ** power)
        power -= 1
    return result


# ---------------------------


def sublen(lol):
    result = []
    for l in lol:
        result.append(len(l))
    return result


# ---------------------------


def dropwhile(predicate, things):
    result = []
    for t in things:
        if predicate(t):
            result.append(t)
        else:
            return result


# ---------------------------


def composite(n):
    for i in range(2, n):
        if n % i == 0:
            return True
    return False  # Jednička není složená, ani prvočíslo


# ---------------------------


def countw(sentence, l):
    result = 0
    for word in sentence.split(" "):
        if len(word) == l:
            result += 1
    return result


# ---------------------------


def nub(things):
    result = []
    for i, t in enumerate(things):
        if i == 0 or things[i - 1] != t:
            result.append(t)
    return result


# ---------------------------


def diff(vectors, coefs):
    result = (0, 0)
    for v, c in zip(vectors, coefs):
        result[0] -= v[0] * c
        result[1] -= v[1] * c
    return result


# ---------------------------


def myf(things, predicate):
    result = []
    for t in things:
        if predicate(t):
            result.append(t)
    return result


# ---------------------------


def mean(nums):
    return sum(nums) / len(nums)


def mass_mean(table):
    if table == []:
        return []
    else:
        cols = len(table[0])
        result = []
        for j in range(0, cols):
            nums_in_col = []
            for row in table:
                nums_in_col.append(row[j])
            result.append(mean(nums_in_col))


# ---------------------------


def countch(word):
    result = {}
    for char in word:
        if char in result:
            result[char] += 1
        else:
            result[char] = 1


# ---------------------------


def divisible3(n):
    digsum = 0
    for d in str(n):
        digsum += int(d)
    return digsum % 3 == 0


# ---------------------------


def change(word, replacement):
    result = ""
    for char in word:
        if char in "aeiouy":
            result += replacement
        else:
            result += char
    return result


# ---------------------------


def times(n, k):
    result = 0
    for _ in k:
        result += n
    return result


# ---------------------------


def compare(f, g, interval):
    a, b = interval
    for i in range(a, b + 1):
        if f(i) > g(i):
            print("  X")
        elif f(i) == g(i):
            print(" X ")
        else:
            print("X  ")


# ---------------------------


def f_or_l(things, n):
    return sum(things[:n]) > sum(things[-n:])


def f_or_l2(things, n):
    return sum(things[:n]) > sum(list(reversed(things))[:n])


# ---------------------------


def haspath(neigbours, start, target):
    def helper(s, t, history):
        if t in neigbours[s]:
            return True
        else:
            return any(
                helper(n, t, history + [s]) for n in neigbours[s] if n not in history
            )

    return helper(start, target, [])


def haspath_simple(neigbour, start, target):
    history = set()
    current = start
    while current not in history:
        if current == target:
            return True
        history.add(current)
        current = neigbour[current]