====== Cvičení 5: 2D pole ====== ===== náplň cvičení ===== ==== Ú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 **play.py**, který načte soubor zadaný jako první argument {{courses:b3b33alp:cviceni:piskvorka.txt|sys.argv[1]}} a zjistí, kam musí táhnout křížek (1), aby vyhrál, tedy aby vytvořil piškvorku. * Soubor obsahuje matici celých čísel n x n - celých čísel, n zjistíte podle délky a počtu řádek souboru. * Význam čísel: * 0 - volné pole * 1 - křížek * 2 - kolečko * Program vytiskne na standardní výstup indexy řádku a sloupce volného políčka matice, kam když zahraje hráč křížek (1), tak vyhraje. * Program v souboru **play.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ů, který se rovná počtu řádků souboru. === Příklad === Vstup: 0 2 0 0 0 0 2 2 1 0 0 0 2 2 1 2 1 2 1 1 1 2 2 0 1 1 1 2 0 2 2 2 0 2 0 2 2 2 2 0 0 0 0 0 1 2 2 0 0 1 1 1 1 0 2 1 1 2 1 2 1 2 1 1 1 2 2 1 1 1 2 1 0 2 2 0 2 2 1 1 0 2 1 2 2 2 0 0 2 0 0 0 1 0 1 2 2 1 0 1 Výstup: 7 2 Vysvětlení: Místo pro vytvoření piškvorky je označeno ''X'' 0 2 0 0 0 0 2 2 1 0 0 0 2 2 1 2 1 2 1 1 1 2 2 0 1 1 1 2 0 2 2 2 0 2 0 2 2 2 2 0 0 0 0 0 1 2 2 0 0 1 1 1 1 0 2 1 1 2 1 2 1 2 1 1 1 2 2 1 1 1 2 1 X 2 2 0 2 2 1 1 0 2 1 2 2 2 0 0 2 0 0 0 1 0 1 2 2 1 0 1 ==== 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 před tahem bílého. Program najde tah pro bílého, aby dal černému šach. * **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 jsou čtyři čísla oddělená mezerou zaznamenávající souřadnice: * řádek sloupec kde tah začíná * řádek sloupec kde tah končí * řádky a sloupce se číslují od 0 do 7 * poloha 0 0 je levý horní roh šachovnice, šachisty označovaný jako a8 * Soubor (viz. příklad {{courses:b3b33alp:cviceni:chess.txt|chess.txt}}) obsahuje dvourozměrné pole, ve kterém jsou výše definované hodnoty (soubor nebývá zarovnán tak, jak je to níže v textu; použití split() ale dává stejné výsledky) * Protože neznáme historii tahů neuvažujte tzv. [[https://cs.wikipedia.org/wiki/Bran%C3%AD_mimochodem|braní mimochodem]]. * 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. * Program v souboru **chess.py** odevzdejte pomocí odevzdávacího systému (úloha HW05). ---- Vstup obsah souboru, zadaného jako vstupní argument: 0 0 0 0 0 0 0 0 -6 0 -6 0 0 0 0 0 0 0 0 0 -6 -6 -6 -3 0 0 0 -6 0 -5 4 0 0 0 0 5 6 0 -4 6 6 0 -5 4 0 6 0 0 0 6 6 0 0 0 0 0 1 0 0 5 -1 0 0 0 Výstup: 3 6 6 3 tedy tah střelec (4) z pole g4 na d2