##### IB111 skupina 10 #####
##### cvičení 06

### ASSERT
# ÚKOL 1
# Stáhni si do svého pracovního adresáře soubory 'cv06.py' a 'cv06_tester.py'.
# Funkce move_knight() simuluje tah šachovým koněm. Používá pomocnou fukci
# parameter_check(), která kontroluje, zda vstupní parametry byly správně
# zadány ( daný tah je skutečně tah koně, figura neopustí hrací desku, ... )
# Doplň do fukce parameter_check volání assert tak, abys vyloučil všechny nekorektní # kombinace parametrů
#
# Skriptem cv06_tester.py zkontroluj, zda procházejí testy.
#
# Pokud vyhovíš všem testům, doplň do funkcí v souboru 'cv06.py' typovou annotaci.
# Syntax je v dokumentaci, nebo v přednášce. Správnost zkontroluj příkazem:
# 'C:\Python3.7\python.exe -m mypy --strict cv06.py --strict' v terminálu.


# Ve všech úlohách používej dále typovou annotaci tak, aby vyhověla volání
# mypy --strict


### BINÁRNÍ VYHLEDÁVÁNÍ

# ÚKOL 2
# Napište funkci guess_number_pc(upper_bound), která umožňuje hrát s počítačem hru na
# hádání čísla, tentokrát si však číslo myslí uživatel a počítač hádá. Po každém pokusu
# si počítač vyžádá od uživatele informaci, zda je myšlené číslo větší nebo menší než to,
# které si počítač tipnul.


# ÚKOL 3
# Napište funkci binary_search(needle, haystack), která zjistí, zda se hodnota needle
# nachází ve vzestupně uspořádaném seznamu haystack. Funkce musí mít logaritmickou
# časovou složitost.

>>> print(binary_search(5, [1, 2, 5, 8]))
True
>>> print(binary_search(4, [1, 2, 5, 8]))
False


# ÚKOL 4
# Vylepšete předchozí funkci tak, aby vracela index pozice, kde se hledaný prvek nachází.
# Pokud prvek v seznamu není, vraťte -1.

>>> print(binary_search_position(5, [1, 2, 5, 8]))
2
>>> print(binary_search_position(4, [1, 2, 5, 8]))
-1


# ÚKOL 5
# Napište funkci super_power(base, exp), která umocní dané číslo base na daný
# exponent exp. Funkce musí mít logaritmickou časovou složitost vzhledem k hodnotě exponentu.

>>> print(super_power(2, 7))
128
>>> print(super_power(5, 15))
30517578125
