Cvičení 4: 1D pole
Úkol 1 Opakování funkce a for cykly
Napište program, který porovná dvě funkce a(x,y,z)
a b(x,y,z)
se třemi logickými proměnnými a zjistí, zda výrazy jsou ekvivalentní, případně vypíše pro jaké kombinace vstupů se výstupy liší.
Porovnejte následující funkce:
def a(x,y,z):
return (x and y) or (not y and z)
def b(x,y,z):
return x or z
Úkol 2 Najdi a změň
Napište funkci my_find(a,b)
, která v řetezci a
hledá řetězec b
(nepoužívejte vestavěnou funkci find).
Pokud řetězec najde, vrátí index jeho prvního výskytu zleva.
Pokud řetězec nenajde, vrátí -1.
Napište funkci my_replace(a,b,c)
, která v řetězci a
nahradí všechny výskyty řetězce b
řetězcem c
.
Ve funkcích používejte pouze funkce
len(s)
- délka řetězce,
s[i]
- znak na pozici i
,
s[i:j]
- podřetezec od i
do j
s[:j]
, s[i:]
- podřetězec od počátku do j
, resp. od i
do konce.
Úkol 3 Záměna slova
Napište program, který čte standardní vstup a v načteném řetězci zamění slovo Ahoj
za slovo Cau
.
Můžete využít vestavěné funkce find, replace, nebo Vaše funkce z předchozí úlohy.
Pokud se ve vstupním řetězci objeví slovo Konec
, program skončí. V tomto řádku ale nejdříve zamění Ahoj za Cau.
Načítání ze souboru
f=open('line.txt','r')
line = f.readline()
pole = list(map(int, line.split()))
pole=[]
f=open('pole.txt','r')
for line in f:
pole.append(int(line))
for x in pole:
print(x)
Úkol 4 funkce nalezení maxima
Napište funkci, která vrací největší hodnotu v poli a zároveň vrací index tohoto prvku
Pro pole nulové délky vrací index -1.
Pozor: je třeba předpokládat, že v poli mohou být jakékoliv hodnoty (kladné, nuly, záporné)!
Úkol 5 funkce nalezení druhého největšího prvku v poli
Napište funkci, která vrací druhou největší hodnotu v poli a zároveň vrací index tohoto prvku
Pro pole délky méně než 2 vrací index -1.
Pozor: je třeba předpokládat, že v poli mohou být opět jakékoliv hodnoty (kladné, nuly, záporné)!
Polynomy
Polynom $a_0 + a_1 x + a_2 x^2 + \ldots + a_n x^n$ můžeme reprezentovat polem koeficientů [ a_0, a_1, a_2, … , a_n ]
Příklad:
polynomu $1 + x - 2x^2$ odpovídá pole [1, 1, -2 ]
polynomu $x - x^3$ odpovídá pole [0, 1, 0,-1 ]
Nulové koeficienty lze vynechat u nejvyšších mocnin, ale ne u nejnižších.
Příklad:
[0,1,2]
vyjadřuje polynom $x + 2x^2$
[0,1,2,0]
vyjadřuje taktéž polynom $x + 2x^2$
ale [1,2,0]
vyjadřuje polynom $1 + 2x$
Úkol 6 hezký výpis polynomu
Napište funkci printPoly
,která vypíše polynom, přičemž mocniny bude tisknout znakem '^'.
Pokud je nějaký koeficient nulový, příslušný člen se nevypíše.
Příklad:
printPoly( [ 1, 1, 0, -2] )
vytiskne 1 + x - 2x^3
printPoly( [ -2, 0, 0, -2, 0, 0, 0] )
vytiskne -2 -2x^3
Úkol 7 výpočet hodnoty polynomu
Napište funkci polyValue
, která pro zadaný polynom a hodnotu x vypočte jeho hodnotu v zadaném bodě $x$
Tedy polyValue([1,0,2], 4)
má hodnotu 33
, protože $1 + 2x^2$ pro $x=4$ je 33.
Domácí práce
Napište funkci, která pro zadaný polynom najde je maximum/minimum v zadaném intervalu $<a,b>$. Řešte numericky, např. s krokem $\delta=0.1$. Nápověda: použijte funkci pro výpočet hodnoty polynomu.
Napište funkci pro výpočet první derivace polynomu:
Domácí úkol
Lehká varianta
Přebíjená je hra, při které pokládají na stůl dva hráči současně kartu a ten, který má vyšší hodnotu, bere všechny vyložené karty. Pokud mají karty stejnou hodnotu, pak hráči pokračují ve vykládání karet. Pokud i na konci mají jejich karty stejnou hodnotu, zůstávají tyto karty na stole.
Napište program take.py, který načte dvě řádky polí ze standardního vstupu.
Každá řádka obsahuje pole hodnot karet v tom pořadí, jak je hráči vykládají na stůl. Karta je celé číslo.
První řádka obsahuje karty hráče A, druhá řádka obsahuje karty hráče B.
Pokud obsahují obě řádky stejný počet čísel, pak program vytiskne o kolik karet má hráč A více než hráč B na konci hry (pokud má na konci více karet hráč B, tak se jedná o záporné číslo)
Pokud jedna řádka obsahuje více čísel než druhá, nebo jedna řádka obsahuje záporná čísla, pak se vytiskne “ERROR”
Na začátku mají oba hráči pouze karty uvedené na jejich řádkách, na konci pouze ty karty, které vyhráli.
Program v souboru take.py odevzdejte pomocí odevzdávacího systému (úloha HW04).
1 2 3 4 5 6 7 8
1 2 3 5 5 6 2 10
-4
protože první tři karty jsou stejné, ale čtvrtá karta je větší u B, proto B získá všech osm prvních karet. Karty $5$,$6$ jsou zase stejné u obou hráčů, ale karta $7$ je větší než $2$, takže těchto šest karet získá A. Poslední dvě karty $8$ a $10$ získá hráč B. Celkem hráč A získal $6$ karet a hráč B $10$ karet, tedy B vyhrál o $4$ karty. Výstupem je tedy $-4$, prtože $6-10=-4$
Těžká varianta
Napište program compose.py, který načte řetězec cifer na první řádce a celé číslo N na řádce druhé. Program vloží znaky +, - mezi zadané cifry tak, aby hodnota vytvořeného výrazu byla N
Vstup:
Testované úlohy mají vždy jen jedno řešení, nebo nemá žádné řešení a pak vytiskněte: NO_SOLUTION
POZOR: Program může být výpočetně náročnější, otestujte si nejdříve Váš program na počítači a pouze důkladně otestovaný program nahrávejte do odevzdávacího systému
POZOR: Nedoplňujte žádný znak na začátek řetězce, kontrola řešení s tím nepočítá.
Příklad:
697667644265
2191
výstup programu bude:
6+9766-7644-2+65
75946661
-1247
výstup programu bude:
NO_SOLUTION
339157546
930
výstup programu bude:
NO_SOLUTION
řešení $-33+915+7-5+46$ se kvůli znaku $-$ na začátku nedovoluje.