Napisz dwa prostokątne bloki kodu, każdy w postaci szerokich i h znaków wysoki, że wdrożenie Gra w życie , gdy umieszczone w siatce. ( w i h mogą być dodatnimi liczbami całkowitymi)
Na przykład dwa bloki kodu mogą być: ( w = 3, h = 2, nie rzeczywisty kod)
XX|
--+
i
|
--+
Traktuj pierwszy blok tak, jakby to była „żywa” komórka w grze życia, a drugi blok tak, jakby to była „martwa” komórka.
Teraz ułóż wiele kopii tych dwóch bloków w większym programie, który reprezentuje siatkę Game of Life, taką jak ten szybowiec :
| | | | |
--+--+--+--+--+
| |XX| | |
--+--+--+--+--+
| | |XX| |
--+--+--+--+--+
|XX|XX|XX| |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Teraz jest kluczowy punkt: po uruchomieniu tego kodu, wyjściem musi być siatka Game of Life, czyli generacja po tym, wykorzystująca te same żywe i martwe bloki kodu dla komórek.
Tak więc wyjściem do powyższego programu będzie następna generacja szybowca, który służy również jako program do uruchomienia:
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
|XX| |XX| |
--+--+--+--+--+
| |XX|XX| |
--+--+--+--+--+
| |XX| | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Uruchomienie tego spowoduje następną generację:
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
| | |XX| |
--+--+--+--+--+
|XX| |XX| |
--+--+--+--+--+
| |XX|XX| |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
I tak dalej.
Proces ten powinien być nieskończenie powtarzalny i powinien działać na każde ustawienie twoich żywych i martwych bloków kodu w siatce Gry.
Siatka wyjściowa powinna mieć takie same wymiary jak program, z którego pochodzi (5 na 6 powyżej). Rozmiary siatki tak małe, jak 1 na 1 powinny działać, i mogą być dowolnie duże. Oczywiście pusta siatka sama się wyprowadzi.
Aktualizacja: Możliwość symulacji siatek o dowolnych wymiarach bez konieczności zmiany „kafelków” byłaby idealna, ale ponieważ wydaje się to bardzo trudne, przyjmuję odpowiedzi, które zakładają, że siatka ma określony rozmiar (może około 16 * 16).
Zasady gry w życie są następujące:
- Umiera każda żywa komórka z mniej niż 2 lub więcej niż 3 żywymi sąsiadami ( Moore ).
- Każda martwa komórka z dokładnie 3 żywymi sąsiadami ożywa.
- Inne komórki się nie zmieniają.
Punktacja
Wyzwaniem jest zrobienie tego w możliwie najmniejszym obszarze bloku kodu. Twój wynik jest w * godz . Najniższy wynik wygrywa. W przypadku remisu wygrywa najwyższa głosowana odpowiedź.
Detale
- Poza znakami nowej linii potrzebnymi do uzyskania prostokąta, dwa bloki kodu (a zatem programy siatki Game of Life) powinny zawierać tylko drukowalne znaki ASCII (kody szesnastkowe od 20 do 7E, bez zakładek, bez dodatkowych znaków nowego wiersza ).
- Oba bloki kodu muszą mieć dokładnie w * h znaków (oprócz niezbędnych znaków nowej linii) z co najmniej jedną różnicą znaków. Wypełnianie ich spacjami lub komentarzami jest w porządku. Nie powinny zmieniać się z pokolenia na pokolenie.
- Dane wyjściowe powinny albo przejść do pliku, albo do standardowego wyjścia. Brak danych wejściowych.
- Warunki brzegowe mogą być okresowe (gdzie górna krawędź graniczy z dolną, a lewa krawędź graniczy z prawą) lub nieskończone (gdzie wszystkie komórki poza granicami są zawsze martwe). Wybierz to, co najbardziej Ci odpowiada.
- Czytając swój własny kod źródłowy jest nie dozwolone.
- Jakikolwiek język lub narzędzie, które już to robi, jest niedozwolone. (Na wypadek, gdyby taki istniał).
Uwaga: Te -|+
znaki powyżej zostały użyte jedynie w celu podkreślenia granice komórek. Twoje bloki nie potrzebują żadnej wyraźnej granicy. Jednak podczas wyświetlania wyników pomocne byłoby, gdyby istniała wyraźna separacja między blokami, być może utworzona za pomocą znaku, który nigdy nie był używany w programie, więc można go łatwo usunąć. na przykład
DD+DD+DD+DD
+++++++++++
AA+DD+AA+DD
zamiast
DDDDDDDD
AADDAADD
źródło
__SOURCE_CODE__
.Odpowiedzi:
Perl, w * h = 233 * 1 = 233 (na komórkę)
Komórki działają w dowolnym rozmiarze siatki (w rzeczywistości nawet o nieregularnej długości wiersza). Komórki poza granicami są uważane za martwe.
Dead Cell
Żywa komórka
Szybowiec
generuje:
Objaśnienie (nie aktualne)
Perl, w * h = 140 * 2 = 280 (na komórkę)
Komórka wieloliniowa nie jest wydajna, ale może ją wyeliminować
__LINE__
.Dead Cell
Żywa komórka
źródło
JavaScript ES6 (239 x 1 znaków na komórkę)
Martwa komórka:
Żywa komórka:
Jedyną różnicą jest
S[j]=0
dla martwych iS[j]=1
żywych komórek.Rozmiar siatki jest kontrolowany za pomocą zmiennych W (szerokość) i H (wysokość). Komórki poza siatką są martwe.
Skomentowana wersja
Szybowiec (siatka 5 x 6)
Generuje następną generację:
źródło
|
jest operatorem bitowym i działa tylko z liczbami.||
jest operatorem logicznym, który zwraca lewą stronę, jeśli jest „prawdziwa”, w przeciwnym razie prawa.Python, 67x33 = 2211
Zauważ, że to jest moja ładna wersja, w której dodałem linię „#” do każdej innej linii w komórce życia i „” do każdej innej linii w martwej komórce. Ponadto komórki są oddzielone liniami „#”. W ten sposób możesz np. Umieścić wstępną konfigurację w pliku tekstowym
GOL.py
i spojrzeć na nią małą czcionką, aby zobaczyć, co dzieje się na każdym kroku. Aby przejść do następnego kroku, wykonajpython GOL.py > GOL1.py;mv GOL1.py GOL.py
i spójrz ponownie.Moje rozwiązanie działa na siatce o dowolnym rozmiarze i zakłada okresowe warunki brzegowe. Nie testowałem różnych szerokości linii, ale na pewno jest to możliwe.
Powinienem również wspomnieć, że powodzenie tego rozwiązania zależy od tego, czy
__del__
zostanie wywołany, kiedya
zostanie zniszczony pod koniec programu. Dokumentacja Pythona stwierdzaMam tylko nadzieję, że to nie tylko zadziała z moim tłumaczem.
Żywa komórka:
Martwa komórka:
Python, 67x17 = 1,139 Aby uzyskać wersję golfową, wciąż z pewnym sposobem na rozpoznanie komórek życiowych z daleka, druga instrukcja drukowania w wierszach 19 i 31, a także każda inna linia jest usuwana.
Żywa komórka:
Martwa komórka:
Jeśli będzie taka potrzeba, chętnie wyjaśnię wewnętrzne zasady mojego rozwiązania, gdy tylko znajdę czas.
źródło
<sup><sub>...</sub></sup>
w<pre><code>
bloku. Nie zmniejsza to wysokości linii, ale czcionka tekstu jest zmniejszana dla każdego wystąpienia. Użycie tylko indeksu dolnego lub tylko indeksu górnego sprawi, że kod będzie unosił się w dół lub w górę poza znacznikami, ale naprzemienne utrzymywanie go w środku w pionie.