Subato

Resource Files

Game of Life

Sie sollen in diesem Übungsblatt das Game of Life in Haskell implementieren. Das Haskell Modul ist als ein literate Haskell Modul zu schreiben, also mit der Endung .lhs. 

Sie können eine PDF-Version der Aufgabenstellung erzeugen, indem Sie das Template für die Lösung als Life.lhs speichern und folgende Aufrufe tätigen:

lhs2TeX Life.lhs > Life.tex
pdflatex Life.tex

Die so generierte PDF-Version finden Sie auch hier.


\documentclass[a4paper]{article} \usepackage[ngerman]{babel} \usepackage[utf8x]{inputenc} \usepackage[german=guillemets]{csquotes} %include polycode.fmt \setlength\parindent{0pt} \setlength{\parskip}{5pt plus 2pt minus 1pt} \usepackage{enumitem} \begin{document} \author{} \title{Übungsblatt 3} \maketitle \section*{Aufgabe 3: Game of Life (Spiel des Lebens)} Ziel dieser Aufgabe ist es eine einfache Version von ``Conways Spiel des Lebens''\footnote{\verb+https://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens+} in Haskell zu implementieren. > module Life where Das Spielfeld wird dargestellt durch quadratische Matrizen, deren Einträge entweder belegt (bevölkert), oder nicht belegt sind. Ein Eintrag an Position (i, j) in einer Matrix wird durch seine Zeile i und sein Spalte j bezeichnet, wobei die Zählung der Zeilen und Spalten bei 0 beginnt. Diese Aufgabe ist dem Modul ``Funktionale Programmierung'' von Manfred Schmidt-Schauß an der Johann Wolfgang Goethe-Universität entnommen. Solche Matrizen lassen sich in Haskell durch die folgende Datenstruktur darstelle Gegeben sei eine Datenstruktur, die bool'sche Werte in einem 2-dimensionalen Raum darstellt. > data Matrix = Matrix [[Bool]] > deriving (Eq) Die Struktur ist eine Instanz der Klasse Show, so dass eine Matrix als String gut angezeigt werden kann. > instance Show Matrix where > show (Matrix m) = unlines $ map showRow m > where showRow = map (\x -> if x then '#' else ' ') Es sollen nur quadradrische Matrix-Objekte erzeugt werden. Daher die folgende Konstruktorfunktion. > newMatrix n = Matrix $ replicate n (replicate n False ) Die Anzahl der Zeilen und Spalten lässt sich demnach direkt über die Länge der äußeren Liste erfragen. > groesseMatrix (Matrix m) = length m \begin{enumerate}[label=\alph*)] \item Implementieren Sie eine Funktion, die eine Matrix und eine Matrix-Position als Eingabe erwartet und die Belegung des durch die Koordinate gegebenen Matrix-Eintrags berechnet. > get :: Matrix -> (Int, Int) -> Bool > get _ _ = False \item Implementieren Sie mit Hilfe einer List-Comprehension eine Funktion, die eine Matrix-Position und die Dimension einer Matrix erwartet und die Positionen aller benachbarten Felder berechnet. Beispielsweise liefert nachbarn (1,1) 3 als Resultat die Liste:\\ \verb+[(0,0),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1),(2,2)]+ > nachbarn :: (Int, Int) -> Int -> [(Int, Int)] > nachbarn _ _ = [] \item Implementieren Sie eine Funktion, die in einer gegebenen Matrix zu einem durch seine Position gegebenen Feld die Anzahl seiner belegten Nachbarn berechnet. > anzahlBelegterNachbarn :: (Int, Int) -> Matrix -> Int > anzahlBelegterNachbarn _ _ = 0 \item Implementieren Sie eine Funktion, die den Nachfolger einer Matrix gemäß der Spielregeln des Spiel des Lebens berechnet: \begin{itemize} \item Für eine Matrix-Zelle, die belegt ist: \begin{itemize} \item Jede Zelle mit einem oder keinem Nachbarn stirbt. \item Jede Zelle mit vier oder mehr Nachbarn stirbt. \item Jede Zelle mit zwei oder drei Nachbarn überlebt. \end{itemize} \item Für eine Matrix-Zelle, die leer ist: \begin{itemize} \item Jede Zelle mit drei Nachbarn wird belegt. \end{itemize} \end{itemize} Hier bedeutet „stirbt“: nicht belegt in der Matrix (False) und „überlebt“: belegt in der Matrix (True). > zugGOL :: Matrix -> Matrix > zugGOL m = m \item Implementieren Sie eine Funktion, die zu einer Anfangsmatrix eine Liste der Folgematrizen berechnet, die durch aufeinanderfolgende Spielzüge im Spiel des Lebens aus entstehen. > zuege :: Matrix -> Int -> [Matrix] > zuege m n = [] \item Implementieren Sie eine Funktion, die zu einer gegebenen Matrix testet, ob der durch sie beschriebene Spielzustand oszilliert. Ein Spielzustand M oszilliert, wenn nach i-Spielzügen (mit i ≥ 1) wieder der Zustand M erreicht ist. > oszilliert :: Matrix -> Bool > oszilliert m = False \end{enumerate} \end{document}
lhs
You are not logged in and therefore you cannot submit a solution.