====== Cvičení 5: 2D pole ======
==== Úkol 1-2 Opakování ====
* Nedokončený příklad z minulého cvičení
==== 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 3 Výpis matice ====
* Napište funkci ''printMatrix'', 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 4 Násobení vektoru a matice ====
* Napište funkci ''multiVecMat(v,m)'', 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í $v \cdot m$:
m=[[0,0,1],[0,1,0],[1,0,0]]
v=[2, 4, 6]
===== Témata k procvičení =====
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í úkol =====
==== Lehká varianta ====
* Napište program **diag.py**, který načte matici celých čísel ze souboru, jehož jméno je zadáno jako první argument programu {{courses:b3b33alp:cviceni:diag.txt|sys.argv[1]}} a zjistí, kde se v této matici nachází nejdelší souvislá sekvence sudých čísel v diagonálním směru.
* Soubor obsahuje matici $ m \times n $ - celých čísel, $m$ odpovídá počtu řádek souboru, $n$ určíte podle počtu čísel na řádce.
* Program vytiskne na standardní výstup indexy řádku a sloupce prvního prvku diagonály a počet prvků sekvence
* První prvek sekvence je ten, který má minimální index řádku.
* Diagonální směry jsou dva: vpravo-dolů a vlevo-dolů.
* Program v souboru **diag.py** odevzdejte pomocí odevzdávacího systému (úloha HW05).
* Můžete předpokládat, že všechny matice jsou zadány korektně, tedy všechny řádky mají stejný počet prvků.
* Pokud se vstupní soubor jmenuje ''diag.txt'', Váš program se spustí příkazem ''python3 diag.py diag.txt''. Cestu k souboru lze v programu načíst takto:
import sys
matrix_file = sys.argv[1]
=== Příklad ===
* Vstup:
1 1 2 1 0 1 1 1 1 1 1 1
1 1 1 2 1 1 1 1 1 1 1 1
1 1 0 1 2 1 1 1 1 1 1 1
1 1 1 1 1 2 1 1 1 1 1 1
Výstup:
0 2 4
Vysvětlení: Sekvence čísel 2 je delší než sekvence tvořená 0 a 2. První prvek sekvence čísel 2 je 0, 2 délka sekvence je 4.
* Vstup:
1 1 1 1 1 0 1 1 1 1 1 1
1 1 0 1 1 1 0 1 2 1 1 1
1 1 1 0 1 1 1 2 1 1 1 1
1 1 1 1 1 1 2 1 1 1 1 1
1 1 1 1 1 2 1 0 1 1 1 1
Výstup:
1 8 4
Vysvětlení: Sekvence čísel 2 je nejdelší, delší než sekvence tvořená 0 a 2. První prvek sekvence čísel 2 je 1, 8 délka sekvence je opět 4.
==== Těžká varianta ====
* Napište program **chess.py**, který načte soubor zadaný na příkazové řádce (''argv[1]''). Tento soubor kóduje stav šachovnice po tahu bílého. Program zkontroluje, zda bílý dává černému mat, šach, garde, nebo nic z předešlého.
* **Vstup**
* Stav šachovnice je zaznamenán čísly reprezentující jednotlivé figury podle následující tabulky (bíle figury mají kladnou hodnotu, černé zápornou):
^ figura ^ bílý ^ černý ^
| král | 1 | -1 |
| dáma | 2 | -2 |
| věž | 3 | -3 |
| střelec | 4 | -4 |
| jezdec | 5 | -5 |
| pěšec | 6 | -6 |
| volné pole | 0 | 0 |
* **Výstup (standardní výstup)**
* Výstupem Vašeho programu je hláška:
* MAT - pokud černý dostal mat
* SACH - pokud černý dostal šach a nenastala výše popsaná situace, tedy MAT
* GARDE - pokud je ohrožena černého dáma a nenastala žádná z výše popsaných situací
* NO - pokud nenastala žádná výše popsaná situace.
* Soubor (viz. příklad {{courses:b3b33alp:cviceni:sachovnice.txt|sachovnice.txt}}) obsahuje dvourozměrné pole, ve kterém jsou výše definované hodnoty
* Program v souboru **chess.py** odevzdejte pomocí odevzdávacího systému (úloha HW05).
* Pokud Váš program nebude umět detekovat sach/mat, pak získáte pouze 1 bod.
* Protože neznáme historii tahů neuvažujte tzv. [[https://cs.wikipedia.org/wiki/Bran%C3%AD_mimochodem|braní mimochodem]] ani [[https://cs.wikipedia.org/wiki/Ro%C5%A1%C3%A1da|rošády]].
* Také nemusíte uvažovat výměnu pěšce na posledním políčku šachovnice za jinou figuru, protože pěšci nejsou umístěni v dosahu posledního řádku šachovnice.
----
Vstup obsah souboru, zdaného jako vstupní argument:
-3 0 -4 -2 0 -1 -5 -3
-6 -6 -6 0 0 0 -6 -6
0 0 -5 4 0 0 0 0
0 0 0 -6 0 0 0 2
0 0 0 6 0 0 0 0
0 0 5 0 0 0 0 0
6 6 6 0 0 0 6 6
3 0 0 0 0 3 1 0
Výstup:
MAT