Zadanie polega na tym, aby odczytać z pliku Golly .rle
lub zwykłego tekstu (do wyboru), którego nazwa pliku jest podana (na STDIN lub jako argument wiersza poleceń) oraz zidentyfikować i policzyć wspólne wzorce w zakodowanej w nim siatce.
Alternatywnie możesz zamiast tego udostępnić zawartość pliku bezpośrednio przez STDIN.
Twój program powinien być w stanie zidentyfikować i rozróżnić co najmniej piętnaście najczęstszych surowych martwych natur i pięć najczęstszych oscylatorów oraz szybowce .
Wszystkie fazy tych oscylatorów powinny zostać rozpoznane, podobnie jak wszystkie cztery fazy szybowca.
Powinien wygenerować listę zawierającą ostateczną liczbę każdego wzorca, z nazwą i ilością każdego wzorca w osobnej linii. Twój program może zawierać na liście wyjść wszystkie te wzorce lub tylko te, z których przynajmniej jeden został znaleziony.
Wzory będące częścią innych zliczanych wzorów nie powinny być liczone. (na przykład 8-komórkowa faza latarni nie powinna być również liczona jako dwa bloki, a remis statku nie powinien być również liczony jako dwa statki)
Możesz założyć, że sygnał wejściowy już się ustabilizował i nie zawiera żadnych wzorców spoza wspomnianego zestawu. Możesz również założyć, że siatka wejściowa zmieści się w polu 1024x1024.
To jest golf golfowy , więc wygrywa najkrótszy program.
Opis formatu pliku RLE
Plik RLE zawiera zakodowaną długość przebiegu siatkę życia. Wszystkie wiersze zaczynające się od #
są komentarzami i powinny zostać zignorowane.
Pierwszy niepusty wiersz bez komentarza ma postać x=<width>,y=<height>,rule=<rule>
. Dla celów tego zadania reguła zawsze będzie B3/S23
. Może zawierać spacje, które należy usunąć przed przetworzeniem tego wiersza (oczywiście nie jest wcale konieczne przetwarzanie tego wiersza).
Wiersze bez komentarza po pierwszym powinny być traktowane jako pojedynczy ciąg. To powinno składać się tylko z cyfr, znaków $
, b
i o
, i przerwy linii, a nie kończy się cyfrą. Podziały linii należy zignorować, ale można założyć, że podziały linii nie będą przerywać ciągów cyfr.
Może to zostać zakończone pojedynczym !
.
b
reprezentuje martwą komórkę, o
reprezentuje żywą komórkę i $
reprezentuje koniec wiersza. Każda liczba dziesiętna wskazuje, że następujący symbol należy traktować jako powtarzający się tyle razy.
Kodowanie wzorca tekstu jawnego
Inną opcją jest odczytanie wzorca w innym formacie tekstu jawnego opisanym tutaj. W tym kodowaniu komórki poza są reprezentowane łącznikami, a komórki są reprezentowane wielkimi literami Os, z nowymi liniami oddzielającymi rzędy.
Możesz założyć, że wszystkie wiersze bez komentarza zostaną dopełnione do równej długości łącznikami.
Linie zaczynające się od !
są komentarzami i należy je zignorować.
Niektóre przypadki testowe
RLE:
#This is a comment
x = 35, y = 16, rule = B3/S23
bo$2o$obo5$22bo$22bo$22bo2$18b3o3b3o2$22bo$22bo10b2o$22bo10b2o!
Zwykły tekst:
!This is a comment
-O---------------------------------
OO---------------------------------
O-O--------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
----------------------O------------
----------------------O------------
----------------------O------------
-----------------------------------
------------------OOO---OOO--------
-----------------------------------
----------------------O------------
----------------------O----------OO
----------------------O----------OO
Wyniki:
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
Zwykły tekst:
-----OO--------------------
-----OO--------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
-----------O---------------
O---------O-O--------------
O---------O-O--------------
O----------O------------OOO
!Here's a comment at the end
Wyniki:
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!
Zwykły tekst:
!You may have multiple comments
!As shown here
OO-----------
OO-----------
-------------
------------O
------------O
------------O
--OO---------
--OO----OO---
-------O--O--
-------O-O---
--------O----
Wyniki:
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!
Zwykły tekst:
! Pentadecathlon
! Discovered by John Conway
! www.conwaylife.com/wiki/index.php?title=Pentadecathlon
--O----O--
OO-OOOO-OO
--O----O--
Wyniki:
Pentadecathlon 1
Premia
Jeśli obsługujesz oba formaty wejściowe (użycie rozszerzenia pliku [ .rle
dla plików rle i .cells
zwykłego tekstu - sposób odczytu innych rozszerzeń jest niezdefiniowany] lub flagi linii poleceń do rozróżnienia między nimi), możesz odjąć 5% od wyniku.
źródło
OOO.OO\n....OO
Odpowiedzi:
Haskell, 2417 bajtów
Zajęło to sporo czasu i wciąż jest kilka błędów, ale mam kilka sztuczek, więc było warto.
Uwagi:
Łączy kilka kluczowych pomysłów:
Oto kod:
Oto kod Mathematica użyty do spakowania tablicy 0,1 do formatu później rozpakowanego przez program haskell:
Oto o wiele pełniejsze odkrycie kodu:
źródło