La tâche ici est de lire à partir d'un .rle
fichier Golly ou en texte brut (votre choix) dont le nom de fichier est fourni (sur STDIN ou comme argument de ligne de commande) et d'identifier et de compter les modèles courants dans la grille codée.
Alternativement, vous pouvez choisir d'avoir le contenu du fichier fourni directement sur STDIN à la place.
Votre programme devrait être en mesure d'identifier et de distinguer au moins les quinze natures mortes strictes les plus courantes et les cinq oscillateurs les plus courants , ainsi que les planeurs .
Toutes les phases de ces oscillateurs doivent être reconnues, tout comme les quatre phases du planeur.
Il devrait produire une liste contenant le nombre final de chaque modèle, avec le nom et la quantité de chaque modèle sur une ligne distincte. Votre programme peut inclure dans la liste de sortie tous ces modèles ou seulement ceux dont au moins un a été trouvé.
Les motifs qui font partie d'autres motifs en cours de comptage ne doivent pas être comptés. (par exemple, la phase à 8 cellules d'une balise ne doit pas également être comptée comme deux blocs, et une cravate ne doit pas également être comptée comme deux navires)
Vous pouvez supposer que l'entrée est déjà stabilisée et ne contient aucun motif qui ne se trouve pas dans l'ensemble susmentionné. Vous pouvez également supposer que la grille d'entrée s'insérera dans une zone 1024x1024.
Il s'agit de code-golf , donc le programme le plus court l'emporte.
Description du format de fichier RLE
Un fichier RLE contient une grille de durée de vie codée sur toute la durée. Toutes les lignes commençant par #
sont des commentaires et doivent être ignorées.
La première ligne non vide et sans commentaire est du formulaire x=<width>,y=<height>,rule=<rule>
. Aux fins de cette tâche, la règle sera toujours B3/S23
. Il peut contenir des espaces qui doivent être supprimés avant de traiter cette ligne (bien sûr, il n'est pas nécessaire de traiter cette ligne du tout.)
Les lignes sans commentaire après la première doivent être traitées comme une chaîne unique. Cela devrait être composé uniquement de chiffres décimaux, les caractères $
, b
et o
, et les sauts de ligne, et ne se terminera pas par un chiffre. Les sauts de ligne doivent être ignorés, mais vous pouvez supposer que les sauts de ligne n'interrompent pas les chaînes de chiffres.
Cela peut être résilié par un seul !
.
b
représente une cellule morte, o
représente une cellule vivante et $
représente la fin d'une ligne. Tout nombre décimal indique que le symbole suivant doit être traité comme se répétant autant de fois.
Encodage de modèle en texte clair
L'autre option consiste à lire le modèle dans un autre format de texte en clair décrit ici. Dans cet encodage, les cellules off sont représentées par des tirets et les cellules on sont représentées par des O majuscules, avec des retours à la ligne séparant les lignes.
Vous pouvez supposer que toutes les lignes sans commentaire seront complétées de la même longueur que les tirets.
Les lignes commençant par !
sont des commentaires et doivent être ignorées.
Quelques cas de test
RLE:
#This is a comment
x = 35, y = 16, rule = B3/S23
bo$2o$obo5$22bo$22bo$22bo2$18b3o3b3o2$22bo$22bo10b2o$22bo10b2o!
Texte clair:
!This is a comment
-O---------------------------------
OO---------------------------------
O-O--------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
----------------------O------------
----------------------O------------
----------------------O------------
-----------------------------------
------------------OOO---OOO--------
-----------------------------------
----------------------O------------
----------------------O----------OO
----------------------O----------OO
Résultats:
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
Texte clair:
-----OO--------------------
-----OO--------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
-----------O---------------
O---------O-O--------------
O---------O-O--------------
O----------O------------OOO
!Here's a comment at the end
Résultats:
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!
Texte clair:
!You may have multiple comments
!As shown here
OO-----------
OO-----------
-------------
------------O
------------O
------------O
--OO---------
--OO----OO---
-------O--O--
-------O-O---
--------O----
Résultats:
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!
Texte clair:
! Pentadecathlon
! Discovered by John Conway
! www.conwaylife.com/wiki/index.php?title=Pentadecathlon
--O----O--
OO-OOOO-OO
--O----O--
Résultats:
Pentadecathlon 1
Prime
Si vous prenez en charge les deux formats d'entrée (en utilisant l'extension de fichier [ .rle
pour les fichiers rle et .cells
pour le texte en clair - la façon dont les autres extensions doivent être lues n'est pas définie] ou un indicateur de ligne de commande pour les distinguer), vous pouvez soustraire 5% de votre score.
la source
OOO.OO\n....OO
Réponses:
Haskell, 2417 octets
Cela a pris un certain temps et il y a encore quelques bugs, mais j'ai eu plusieurs astuces qui fonctionnaient donc ça valait le coup.
Remarques:
Il combine quelques idées clés:
Voici le code:
Voici le code Mathematica utilisé pour emballer un tableau de 0,1 dans le format décompressé plus tard par le programme haskell:
Voici un dégoût beaucoup plus complet du code:
la source