Cesta k maturitě
Zadáno v pátek 14. 5.
K odevzdání v úterý 18. 5.
- Napište funkci
to5
afrom5
, která bude převádět mezi pětkovou a desítkovou soustavou. Zopakujte sei převody do binárky. - Napište funkci
sublen
, která dostane seznam seznamů a vrátí seznam jejich délek
> sublen([[1,2,3], [0], []]) [3, 1, 0]
- 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]
- Napište funkci, která rozhodne, zda je zadané číslo číslem složeným?
> composite(10)
true
> composite(7)
false
- 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
- 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]
- 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)
- 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]
- 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]
- Spočítejte výskyt všech znaků ve stringu.
> countch("abracadabra")
{"a": 5, "b": 2, "r": 2, "c": "1", "d": 1}
- Rozhodněte, zda je číslo dělitelné třemi, za pomocí pravidla o ciferném součtu.
> divisible3(33)
true
- Vyměňte všechny samohlásky v anglickém textu za tu zadanou.
> change("holka modrooka", "u")
"hulku mudruuku"
- Napište funkci, které počítá součin dvou čísel, za pomocí
+
(a bez použití*
).
> times(3, 9) 27
- 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)
- 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
- 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
Xreturn
Xprint
while
afor/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]