====== 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