Wyzwanie polega na znalezieniu najkrótszej implementacji gry życia w 3D ( przykład ). Oto zasady:
Komórki (w tym przypadku kostki) z tylko 1 sąsiadem lub mniej umierają, jakby przez samotność.
Jeśli dokładnie 5 komórek otacza pustą komórkę, rozmnażają się i wypełniają ją.
Jeśli komórka ma 8 lub więcej sąsiadów, umiera z powodu przeludnienia.
Zrób co najmniej 10x10x10, gdzie warstwy są wyprowadzane indywidualnie w następujący sposób:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 X 0 0 X 0 0 0 0 0
0 0 X X X 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Oczywiście, graficzna symulacja 3D jest również akceptowana
. Pozycja początkowa może być zakodowana na stałe, ale musi działać, jeśli zostanie zmieniona na dowolną pozycję początkową. Musi być w stanie obliczyć dowolną liczbę pokoleń, a użytkownik musi być w stanie ręcznie poprosić o następną generację.
Najkrótszy kod ze znaków wygrywa!
Zrobiłem własną implementację tego dla dowolnego rozmiaru (kostki): http://jensrenders.site88.net/life3D.htm Możesz użyć tego do testowania i możesz oprzeć swój kod na moim, chociaż tego nie skomentowałem .
źródło
Odpowiedzi:
Mathematica - 120 bajtów
Z pewnością nie pretendent do wygranej, ale nie taki był mój zamiar. Prawdopodobnie można to znacznie obniżyć, po prostu ustalając numer reguły. Po prostu bardzo chciałem napisać wizualizację (chociaż jestem pewien, że jest tam już mnóstwo ton). Więc zaczynamy):
Po eksperymentowaniu z szeregiem warunków początkowych otrzymałem następujące rzeczy:
A oto jeden z rozmiarem siatki
20x20x20
. Symulacja i renderowanie zajęło kilka sekund:Nawiasem mówiąc, zakłada to okresowe warunki brzegowe.
źródło
APL, 46
Zajęło mi to trochę czasu, ale zredukowałem go do 46 znaków:
Jest to funkcja, która przyjmuje logiczną macierz 3D o dowolnym rozmiarze i oblicza następną generację, zgodnie z podanymi regułami. Warunki brzegowe nie zostały określone, więc postanowiłem owinąć się po drugiej stronie, jak w przestrzeni toroidalnej.
Wyjaśnienie
Pośrednim wynikiem
m
jest matryca o takim samym kształcie jak oryginalna matryca, która liczy dla każdego elementu, ile komórek żyje w swoim otoczeniu 3 × 3 × 3, włączając siebie. Następnie:Przykład
Zdefiniuj losową macierz 4 × 4 × 4 o około 1/3 komórek = 1 i oblicz jej 1. i 2. generacji. Z
⊂[2 3]
przodu jest tylko sztuczką, aby wydrukować płaszczyzny w poziomie zamiast w pionie:źródło
J - 42 char
Zakładamy toroidalną tablicę (owijającą się) we wszystkich trzech wymiarach. Automatyczne wyświetlanie wyników przez J wydaje się zgodne ze specyfikacją wyjściową,
1
dla żywych komórek i0
dla martwych. Ten kod działa na płytach o dowolnej szerokości, długości i wysokości (może wynosić 10x10x10, 4x5x6 itd.).Wyjaśnienie jest następujące:
,{3#<i:1
- Podwyrażenie listy przesunięć dla komórki i wszystkich jej sąsiadów.<i:1
- Lista liczb całkowitych od 1 do -1 włącznie.,{3#
- Zrób trzy kopie listy (3#
) i weź iloczyn kartezjański (,{
).(,{3#<i:1)|.&><
- Dla każdego zestawu przesunięć 3D przesuń tablicę. Kosztem 3 znaków, można zmienić|.&>
, aby|.!.0&>
nie mieć Wrap-around.[:+/
- Zsumuj wszystkie przesunięte deski razem.((1&<*<&8)@-*]+.5=-)~
- Długi czasownik zewnętrzny był hakiem, więc otrzymuje tablicę po lewej i prawej stronie, a po prawej stronie przesuwaliśmy i sumowaliśmy. W~
swapy to wokół tej wewnętrznej czasownika.5=-
- 1 w każdej komórce, że suma przesuniętych desek minus pierwotna plansza (tj. Liczba sąsiadów) wynosi 5, a 0 we wszystkich pozostałych.]+.
- Logiczne LUB powyższe z oryginalną tablicą.(1&<*<&8)
- 1, jeśli liczba jest porównywana między 1 a 8 wyłącznie, 0 w przeciwnym razie.(1&<*<&8)@-*
- Porównaj (jak wyżej) liczbę sąsiadów i pomnóż (tj. Logiczne AND, gdy domena ma tylko 1 lub 0), logiczny wynik OR przez to.Użycie jest takie jak w przypadku APL, po prostu zastosuj funkcję na płycie początkowej dla każdego kroku. J ma funkcjonalny operator mocy,
^:
aby to ułatwić.Mówię „losowo”, ponieważ
?.
prymityw daje powtarzalne losowe wyniki za każdym razem przy użyciu ustalonego ziarna.?
jest prawdziwym RNG.źródło
|.
! Dobra robota.