Život Vaším úkolem je implementovat simulátor Conwayovy hry života. Váš program dostane jako argument příkazové řádky jméno souboru, ve kterém jsou popsané rozměry mřížky a počáteční stav všech buněk. Program poté simuluje vývoj všech buněk v mřížce podle předem zadaných pravidel a výslednou mřížku v pravidelných intervalech vykresluje do terminálu. Pravidla Hra život je hra nula hráčů, která se odehrává v obdélníkové mřížce o šířce w a výšce h. Políčka mřížky se nazývají buňky a můžou v každém okamžiku být živé, nebo mrtvé. Jaké buňky jsou na začátku hry živé a jaké mrtvé, zadává uživatel na vstupu. Poté se v každém kole vypočítá nový stav buněk podle následujících pravidel: • Každá živá buňka, která má dva nebo tři živé sousedy, zůstane živá. Pokud má živá buňka jiný počet živých sousedů, zemře (buď samotou, nebo přelidněním). • Každá mrtvá buňka, která má právě tři živé sousedy, obživne (reprodukcí). Pokud má mrtvá buňka jiný počet živých sousedů, zůstává mrtvá. Dejte si pozor na to, že nový stav všech buněk se počítá zároveň. Tedy pokud počítáte pro nový stav počet živých sousedů buňky, je potřeba brát do úvahy jejich stav v předchozím kroku, nezávisle na tom, zda v novém stavu někteří ze sousedů ožili a někteří zemřeli. Formát vstupu Rozměry mřížky a počáteční stav všech buněk jsou popsané ve vstupním souboru, jehož tvar je následující. První dva řádky souboru obsahují kladná čísla, která reprezentují šířku w a výšku h mřížky (v tomto pořadí). Následuje graficky reprezentovaná mřížka, kde živé buňky jsou reprezentované znakem '#' a mrtvé znakem ' ' (mezera). Soubor může obsahovat i méně řádků mřížky než h a řádky můžou být kratší než w znaků. V takovém případě se neuvedené buňky považují za mrtvé. Například následující soubor reprezentuje mřížku širokou 40 políček, vysokou 50 políček, ve které na začátku žije právě 5 zakreslených buněk. Tento soubor najdete i ve studijních materiálech jako examples/glider.txt. 40 50 # # ### Příklady Kluzák Při zavolání ./life examples/glider.txt program nejprve smaže terminál a vykreslí do něj počáteční stav. 1 # 2 # 3 ### Program může nebo nemusí vykreslit zbývajících 47 prázdných řádků; to necháváme na vás. V dalším kroce1 smaže terminál a vykreslí následující stav (s prvním prázdným řádkem) 1 2 # # 3 ## 4 # V dalším kroce smaže terminál a vykreslí následující stav (s prvním prázdným řádkem) 1Časový interval mezi dvěma následujícími kroky necháváme na vás. Rozumná perioda může být například 200 ms. 1 1 2 # 3 # # 4 ## V dalších krocích kluzák postupně putuje doprava dolů. Další počáteční stavy Další zajímavé počáteční stavy najdete na anglické Wikipedii. Pro jednodušší testování některé z nich najdete ve studijních materiálech jako: • Nehybné examples/block.txt a examples/loaf.txt. • Oscilátory examples/blinker.txt a examples/pulsar.txt. • Vesmírné lodě examples/glider.txt a examples/lwss.txt. Rady na závěr Přesný formát výstupu je na vás. Pokud se rozhodnete udělat výstup hezčí, rozhodně vám v tom nebudeme bránit. Pokud se cítíte odvážně, můžete místo do terminálu vykreslovat buňky graficky pomocí OpenGL. K tomu by se vám mohla hodit například knihovna Gloss, a zejména pak její funkce simulate.2 Odevzdáváte program, který jde přeložit na spustitelný soubor. Tedy musí obsahovat funkci main :: IO (). Samozřejmě nejen můžete, ale také byste měli, definovat vlastní pomocné funkce. Na reprezentaci aktuálních živých buněk by se vám mohla hodit datová struktura Set z modulu Data.Set. Pro vykreslování do terminálu se vám můžou hodit funkce z modulu System.Console.ANSI3 . Zejména se podívejte na funkce setCursorPosition, hideCursor a clearScreen. Také se vám může hodit funkce threadDelay z modulu Control.Concurrent. Nebojte se často kontrolovat dokumentaci používaných modulů na Hackage či využívat vyhledávač Hoogle. V případě problémů a dotazů se nebojte obrátit se na nás například na diskuzním fóru. 2Je potřeba nainstalovat balíček gloss pomocí cabalu a knihovnu freeglut pomocí správce balíčků vašeho operačního systému. 3Je potřeba nainstalovat balíček ansi-terminal pomocí cabalu. 2