Die Aufgabe hierbei ist, aus einer Golly- .rle
oder Klartextdatei (Ihrer Wahl), deren Dateiname (in STDIN oder als Befehlszeilenargument) angegeben ist, zu lesen und die gemeinsamen Muster in dem darin codierten Raster zu identifizieren und zu zählen.
Alternativ können Sie den Inhalt der Datei auch direkt über STDIN bereitstellen lassen.
Ihr Programm sollte in der Lage sein, mindestens die fünfzehn häufigsten strengen Stillleben und die fünf häufigsten Oszillatoren sowie Segelflugzeuge zu identifizieren und zu unterscheiden .
Alle Phasen dieser Oszillatoren sollten ebenso wie alle vier Phasen des Segelflugzeugs erkannt werden.
Es sollte eine Liste ausgegeben werden, die die endgültige Anzahl jedes Musters enthält, wobei der Name und die Anzahl jedes Musters in einer separaten Zeile stehen. Ihr Programm kann entweder alle diese Muster oder nur diejenigen, von denen mindestens eines gefunden wurde, in die Ausgabeliste aufnehmen.
Muster, die Teil anderer zu zählender Muster sind, sollten nicht gezählt werden. (Beispielsweise sollte die 8-Zellen-Phase eines Beacons nicht als zwei Blöcke gezählt werden, und ein Schiffsbinder sollte nicht als zwei Schiffe gezählt werden.)
Sie können davon ausgehen, dass sich die Eingabe bereits stabilisiert hat und keine Muster enthält, die nicht im oben genannten Satz enthalten sind. Sie können auch davon ausgehen, dass das Eingaberaster in eine 1024x1024-Box passt.
Das ist Code-Golf , also gewinnt das kürzeste Programm.
Beschreibung des RLE-Dateiformats
Eine RLE-Datei enthält ein lauflängencodiertes Lebensraster. Alle Zeilen, die mit beginnen, #
sind Kommentare und sollten ignoriert werden.
Die erste nicht leere, nicht kommentierte Zeile ist von der Form x=<width>,y=<height>,rule=<rule>
. Für die Zwecke dieser Aufgabe gilt immer die Regel B3/S23
. Es kann Leerzeichen enthalten, die vor der Verarbeitung dieser Zeile entfernt werden sollten (natürlich ist es nicht erforderlich, diese Zeile überhaupt zu verarbeiten.)
Nichtkommentarische Zeilen nach der ersten sollten als einzelne Zeichenfolge behandelt werden. Dies sollte nur aus Dezimalstellen, den Zeichen $
, b
und o
und Zeilenumbrüchen bestehen und endet nicht mit einer Ziffer. Zeilenumbrüche sind zu ignorieren, Sie können jedoch davon ausgehen, dass Zeilenumbrüche Ziffernfolgen nicht unterbrechen.
Dies kann durch eine einzelne beendet werden !
.
b
repräsentiert eine tote Zelle, o
repräsentiert eine lebende Zelle und $
repräsentiert das Ende einer Reihe. Jede Dezimalzahl gibt an, dass das folgende Symbol so oft wiederholt wird.
Klartextmuster-Codierung
Die andere Möglichkeit besteht darin, das Muster in einem anderen hier beschriebenen Klartextformat zu lesen . In dieser Codierung werden off-Zellen mit Bindestrichen und on-Zellen mit Großbuchstaben dargestellt, wobei Zeilen durch Zeilenumbrüche getrennt werden.
Sie können davon ausgehen, dass alle nicht kommentierten Zeilen mit Bindestrichen auf die gleiche Länge aufgefüllt werden.
Zeilen, die mit beginnen, !
sind Kommentare und müssen ignoriert werden.
Einige Testfälle
RLE:
#This is a comment
x = 35, y = 16, rule = B3/S23
bo$2o$obo5$22bo$22bo$22bo2$18b3o3b3o2$22bo$22bo10b2o$22bo10b2o!
Klartext:
!This is a comment
-O---------------------------------
OO---------------------------------
O-O--------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
----------------------O------------
----------------------O------------
----------------------O------------
-----------------------------------
------------------OOO---OOO--------
-----------------------------------
----------------------O------------
----------------------O----------OO
----------------------O----------OO
Ergebnisse:
Glider 1
Blinker 4
Block 1
RLE:
x = 27, y = 15, rule = B3/S23
5b2o$5b2o9$11bo$o9bobo$o9bobo$o10bo12b3o!
#Here's a comment at the end
Klartext:
-----OO--------------------
-----OO--------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
-----------O---------------
O---------O-O--------------
O---------O-O--------------
O----------O------------OOO
!Here's a comment at the end
Ergebnisse:
Block 1
Blinker 2
Beehive 1
RLE:
#You may have multiple comments
#As shown here
x = 13, y = 11, rule = B3/S23
2o$2o2$12bo$12bo$12bo$2b2o$2b2o4b2o$7bo2bo$7bobo$8bo!
Klartext:
!You may have multiple comments
!As shown here
OO-----------
OO-----------
-------------
------------O
------------O
------------O
--OO---------
--OO----OO---
-------O--O--
-------O-O---
--------O----
Ergebnisse:
Block 2
Blinker 1
Loaf 1
RLE:
# Pentadecathlon
# Discovered by John Conway
# www.conwaylife.com/wiki/index.php?title=Pentadecathlon
x = 10, y = 3, rule = B3/S23
2bo4bo2b$2ob4ob2o$2bo4bo!
Klartext:
! Pentadecathlon
! Discovered by John Conway
! www.conwaylife.com/wiki/index.php?title=Pentadecathlon
--O----O--
OO-OOOO-OO
--O----O--
Ergebnisse:
Pentadecathlon 1
Bonus
Wenn Sie beide Eingabeformate unterstützen (unter Verwendung der Dateierweiterung [ .rle
für RLE-Dateien und .cells
für Klartext - wie andere Erweiterungen gelesen werden sollen, ist nicht definiert] oder eines Befehlszeilenflags zur Unterscheidung), können Sie 5% von Ihrer Punktzahl abziehen.
quelle
OOO.OO\n....OO
Antworten:
Haskell, 2417 Bytes
Das hat eine Weile gedauert und es gibt immer noch ein paar Fehler, aber ich habe mehrere Tricks durchgearbeitet, sodass es sich gelohnt hat.
Anmerkungen:
Es vereint einige Schlüsselideen:
Hier ist der Code:
Hier ist der Mathematica-Code, der verwendet wird, um ein Array von 0,1 in das Format zu packen, das später vom haskell-Programm entpackt wurde:
Hier ist ein viel vollständigeres Auflösen des Codes:
quelle