====== Cvičení 5 Pole a 2D pole ======
===== náplň cvičení =====
==== 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 ]''
==== Úkol 1 hezký výpis polynomu ====
* Napište funkci ''print_poly'',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: ''print_poly( [ 1, 1, 0, -2] )'' vytiskne 1 + x - 2 x^3
==== Úkol 2 výpočet hodnoty polynomu ====
* Napište funkci ''poly_value'' , která pro zadaný polynom a hodnotu x vypočte jeho hodnotu v zadaném bodě $x$
* Tedy ''poly_value([1,0,2], 4)'' má hodnotu ''33'', protože ''1+2*x^2=1+2*16=33''
==== Úkol 3 násobení polynomů ====
* Napište funkci ''poly_multi'', která násobí dva polynomy (polynomy mohou mít různé stupně)
* Příklad volání: poly_multi( [1, 1], [-2, 1] ) vrátí [-2, -1, 1] neboť $(x+1)(x-2) = x^2-x -2$
* Polynomy reprezentujte jako v předchozím cvičení
==== Úkol 4 Inverzní permutace ====
* Pokud pole o délce $N$, obsahuje všechna čísla od $0$ do $N-1$ právě jednou, pak toto pole kóduje permutaci tak, že první prvek se zobrazí na místo, kde se v poli nachází $0$, druhý prvek na místo, kde se v poli nachází $1$, atd.
* Pole ''[0, 1, 2, 3]'' kóduje identickou, tzv. jednotkovou, permutaci o čtyřech prvcích,
* Pole ''[3, 2, 1, 0]'' kóduje otočení prvků v poli.
* Napište program, který načte z jednoho řádku standardního vstupu vektor reprezentující permutaci a najde a vytiskne inverzní permutaci, tj. permutaci, která převede zadanou permutaci na jednotkovou.
* Inverzní permutace k permutaci ''[2, 0, 1]'', je permutace ''[1, 2, 0]'', neboť první permutace zobrazí 0->2 a druhá permutace 2->0, obdobně 1->0, druhá permutace 0->1; první 2->1 a druhá 1->2.
==== Dvourozměrné pole ====
* Načtení matice - dvourozměrného pole - ze souboru kombinuje načítání vektoru z minulého cvičení
pole=[]
f=open('pole.txt','r')
for line in f:
pole.append(list(map(int, line.split())))
==== Matice ====
* 2D pole se hodí např. pro reprezentaci matic
==== Úkol 5 Výpis matice ====
* Napište funkci ''print_matrix'', která vypíše matici zadanou 2D polem
* Prvky budou odděleny mezerou a každý řádek bude vypsán na nový řádek
* Kromě prvků matice nebude vypsán žádný jiný znak
==== Úkol 6 Násobení vektoru a matice ====
* Napište funkci ''multi_mat_vec(m, v)'', která vypočte součin vektoru $v$ a matice $m$.
* Pokud nesouhlasí rozměry matice a vektoru, pak funkce vrací ''None''.
* Vypočtete výsledek násobení $m \cdot v$:
m=[[0,0,1],[0,1,0],[1,0,0]]
v=[2, 4, 6]
===== domácí příprava =====
Implementujte následující úlohy:
* Funkce, která v matici najde všechny záporné hodnoty, vraťte seznam jejich indexů
* Funkce pro násobení dvou matic
* Funkce pro výpočet determinantu matice
* Funkce pro výpočet [[ https://en.wikipedia.org/wiki/Trace_(linear_algebra) | stopy ]] matice
===== domácí práce =====
==== Lehká varianta ====
* Napište program **even.py**, který načte soubor {{courses:b3b33alp:cviceni:matrix.txt|matrix.txt}} z úplné cesty ''/local/data/matrix.txt'' a zjistí, který řádek a který sloupec v této matici obsahuje nejvíc sudých čísel.
* Soubor obsahuje matici celých čísel m x n - čísla m a n zjistíte podle délky a počtu řádek souboru.
* Program vytiskne na standardní výstup indexy všech řádků matice, které obsahují maximální počet sudých čísel (řádky začínají indexem 0, pokud má více řádků stejný počet sudých čísel, vytisknou se všechny tyto indexy).
* Po vytištění indexů řádků, vytiskne program indexy sloupců, které obsahují maximální počet sudých čísel (sloupce začínají indexem 0, pokud má více sloupců stejný počet sudých čísel, vytisknou se všechny tyto indexy).
* Program v souboru **even.py** odevzdejte pomocí odevzdávacího systému (úloha HW05).
=== Příklad ===
Vstup:
1 1 2 5 6 1
5 6 8 5 6 7
11 12 10 12 11 11
8 10 5 6 7 9
6 5 10 12 15 19
Výstup:
1
2
3
4
2
==== Těžká varianta ====
* Napište program **go.py**, který načte soubor zadaný na příkazové řádce (''argv[1]''). Tento soubor kóduje stav gobanu po tahu černého. Program zkontroluje, zda černý zajal nějaké kameny bílého. Výstupem programu je stav gobanu po odebrání kamenů, které mají být odstraněny.
* Pokud by program odhalil po odebrání kamenů bílého nějaké kameny černého, které mají být také odebrány, pak se jedná o chybný stav a na výstup vypíšete pouze hlášení ERROR a nebudete vypisovat hodnotu gobanu.
* Soubor (viz. příklad {{courses:b3b33alp:cviceni:goban.txt|goban.txt}}) obsahuje dvourozměrné pole, ve kterém jsou hodnoty 0 - nepoužité pole, 1 - kámen bílého, 2 - kámen černého.
* Kameny, které nemají svobodu jsou z desky odebrány - viz [[https://cs.wikipedia.org/wiki/Go_(hra)#Stru.C4.8Dn.C3.A1_pravidla|Pravidla Go]]
* Program provede odebrání kamenů z desky a výsledný stav gobanu vytiskne
* Program v souboru **go.py** odevzdejte pomocí odevzdávacího systému (úloha HW05).