Gra życia Conwaya to klasyczny przykład automatyzacji komórkowej. Komórki tworzą kwadratową siatkę i każdy ma dwa stany: żywy lub martwy. W każdej turze każda komórka jednocześnie aktualizuje się zgodnie ze stanem i stanem ośmiu sąsiadów:
- Żywa komórka pozostaje żywa, jeśli ma dokładnie dwóch lub trzech żywych sąsiadów
- Martwa komórka ożywa, jeśli ma dokładnie trzech żywych sąsiadów
Twoim zadaniem, jeśli zdecydujesz się to zaakceptować, jest kodowanie najkrótszej implementacji Game of Life w twoim ulubionym języku.
Zasady:
- Siatka musi mieć wymiary co najmniej 20 x 20
- Siatka musi się owijać (więc siatka jest jak powierzchnia torusa)
- Wdrożenie musi umożliwiać użytkownikowi wprowadzenie własnych wzorców początkowych
- GoL jest trochę bezcelowe, jeśli nie widzisz, co się dzieje, więc musi być widoczny efekt działania automatu, a wynik każdej kolejki pokazywany jest wystarczająco długo, aby był widoczny!
;
przed}
s. Takżevar
s może być wyeliminowane w czasie (jeśli nie złamać kod). I dla jednego wierszafor
s,if
s etc, można wyeliminować{ }
całkowicie:for(...) for(...) dosomething()
.Odpowiedzi:
HTML5 Canvas z JavaScript,
940639586519 znakówZawsze chciałem zrobić coś z płótnem, więc oto moja próba (oryginalna wersja online ). Możesz przełączać komórki, klikając (możliwe również w trybie pracy).
Możesz teraz wypróbować nową wersję tutaj .
Niestety jest problem, z którym nie mogłem się obejść. Wersja online ma 11 znaków dłużej, ponieważ jsFiddle umieszcza węzeł tekstowy tuż przed kanwą (dlaczego?), A zatem kanwa nie jest już pierwszym dzieckiem.
Edycja 1: Dużo optymalizacji i restrukturyzacji.
Edycja 2: Kilka mniejszych zmian.
Edycja 3: Wprowadzono pełny blok skryptu i drobne zmiany.
źródło
1
było tak szybkie jak moje, a nie powolne kroczenie. Również jeśli chcesz zaimplementować rysunek (zamiast klikania każdego kwadratu), możesz zaokrąglić pozycję myszy do najbliższego rozmiaru bloku i wypełnić prostokąt w tym punkcie. Więcej postaci, ale więcej punktów.new Array('#FFF','#800')
z['#FFF','#800']
.s
tablicy,tan
ared
ponieważ są to dwa kolory z najkrótszymi reprezentacjami - oszczędza to dwa znaki. Ponadto, jeśli to możliwe, wstaw literalną wersję parametruj
do przedziału. Jestem pewien, że jest jeszcze wiele do wyciśnięcia.Python, 219 znaków
Poszedłem do maksymalnego golfa, z interfejsem wystarczającym do zaspokojenia pytania.
Uruchamiasz to w ten sposób:
Liczby na liście reprezentują współrzędne początkowych komórek. Pierwszy rząd to 0-19, drugi rząd to 20-39 itd.
Uruchom go w terminalu z 21 rzędami i wygląda dość niesamowicie.
źródło
2-(p in P)
==2-({p}<P)
. Ale wtedy musiałbyś zmienić dane wejściowe na{8,29,47,48,49}
:)TI-BASIC, 96 bajtów (87 dla wpisu niekonkurującego)
Do kalkulatora graficznego serii TI-84 (!). To było nie lada wyzwaniem, ponieważ nie ma łatwego sposobu, aby napisać buforowany graficzną rutynowe (na pewno nic wbudowane), a ekran wykres ma tylko cztery nakazuje odpowiednie grafiki:
Pxl-On()
,Pxl-Off()
,Pxl-Change()
, ipxl-Test()
.Wykorzystuje każdy dostępny piksel na ekranie i prawidłowo się zawija. Każda komórka ma jeden piksel, a program aktualizuje wiersz po wierszu poziomo po prawej stronie ekranu. Ponieważ kalkulatory mają tylko procesor Z80 15 MHz, a BASIC jest wolno interpretowanym językiem, kod otrzymuje tylko jedną ramkę co pięć minut.
Wprowadzanie danych przez użytkownika jest łatwe: przed uruchomieniem programu użyj narzędzia Pióro, aby narysować swój kształt na ekranie wykresu.
Dostosowane z mojego wpisu na konkurs golfa kodu na forum kalkulatora Omnimaga .
Wersja Omnimaga (87 bajtów)
Ten kod ma dodatkową funkcję: wykrywa, czy jest uruchamiany po raz pierwszy i czy losowo wyświetla stan ekranu. W kolejnych cyklach automatycznie kontynuuje symulację, jeśli zostanie zatrzymana po zakończeniu ramki. Nie jest to jednak pozycja konkurencyjna, ponieważ nie zawija ekranu; komórki na zewnętrznej granicy zawsze będą uważane za martwe, jeśli ekran wykresu zostanie wcześniej wyczyszczony.
Ta wersja jest prawdopodobnie najbardziej golfowym kodem, jaki kiedykolwiek napisałem, i zawiera kilka naprawdę nieprzyjemnych optymalizacji zaciemniających:
Używam stanu zegara jako flagi. Na początku programu włączony jest zegar daty i godziny i używam wartości globalnej flagi isClockOn, aby ustalić, czy jest to pierwsza iteracja. Po narysowaniu pierwszej klatki wyłączam zegar. Oszczędza jeden bajt w stosunku do najkrótszej innej metody i około czterech w stosunku do oczywistej metody.
Przechowuję stany trzech kolumn obok aktualizowanej w 63-elementowej tablicy liczb podstawowych 7. Miejsce 49 utrzymuje kolumnę po prawej stronie, miejsce 7 trzyma środkową kolumnę, a miejsce jednostki zawiera lewą kolumnę - 1 dla żywej komórki i 0 dla martwej komórki. Następnie biorę resztę mod 6 sumy trzech liczb wokół modyfikowanej komórki, aby znaleźć całkowitą liczbę żywych komórek sąsiednich (to tak jak podzielność przez 9 lewy - w bazie 7, reszta mod 6 równa się sumie cyfry). Samo oszczędza około 10 bajtów i daje możliwość korzystania z dwóch kolejnych optymalizacji. Przykładowy diagram (powiedzmy, że szybowiec jest wyśrodkowany w pewnej kolumnie przy Y = 45:
Centralna komórka pozostanie martwa, ponieważ jest otoczona dokładnie pięcioma żywymi komórkami.
Po zakończeniu każdego wiersza liczby w tablicy są aktualizowane przez podzielenie istniejących liczb przez 7, odrzucenie części dziesiętnej i dodanie 49-krotności wartości komórek w nowej kolumnie. Przechowywanie wszystkich trzech kolumn za każdym razem byłoby znacznie wolniejsze i mniej eleganckie, zajmuje co najmniej 20 bajtów więcej i używa trzech list zamiast jednej, ponieważ wartości komórek w każdym wierszu muszą być przechowywane przed aktualizacją komórek. Jest to zdecydowanie najmniejszy sposób przechowywania pozycji komórek.
Fragment
int(3fPart(3cosh(
daje,1
gdy wejście jest równe 3/6,2
gdy jest równe 4/6, a0
gdy wynosi 0, 1/6, 2/6 lub 5/6. Oszczędza około 6 bajtów.źródło
Mathematica - 333
Cechy:
Interfejs interaktywny: klikaj komórki, aby tworzyć wzory
Niezła siatka
Przyciski: RUN, PAUSE, CLEAR
Kod znajduje się poniżej.
Jeśli chcesz się dowiedzieć, jak to działa, drugi przykład na tym blogu to tylko bardziej rozbudowana wersja (analiza Fouriera na żywo, lepszy interfejs) powyższego kodu. Przykład powinien działać bezpośrednio w przeglądarce po darmowym pobraniu wtyczki.
źródło
C 1063 znaków
Jako wyzwanie zrobiłem to w C, używając nieprzyjaznego golfowi Windows API dla IO w czasie rzeczywistym. Jeśli włączona jest funkcja capslock, symulacja zostanie uruchomiona. Pozostanie nieruchomy, jeśli Capslock jest wyłączony. Rysuj wzory za pomocą myszy; kliknięcie lewym przyciskiem myszy ożywia komórki, a kliknięcie prawym przyciskiem myszy zabija komórki.
Skompilowany plik EXE można znaleźć tutaj
Edycja: Skomentowałem źródło. Jest dostępny tutaj
źródło
J (39 znaków)
Na podstawie tej wersji APL (ten sam algorytm, splot toroidalny).
Przykładowe użycie:
źródło
Mathematica, 123 znaki
Bardzo podstawowa implementacja, która nie korzysta z wbudowanej funkcji Mathematica CellularAutomaton.
źródło
Ruby 1.9 + SDL (
380325314)EDYCJA : 314 znaków i naprawiono błąd z dodatkowymi komórkami, które pojawiały się przy pierwszej iteracji. Zwiększono rozmiar siatki do 56, ponieważ procedura koloru patrzy tylko na najniższe 8 bitów.
EDYCJA : Grał w golfa do 325 znaków. Szerokość / wysokość siatki wynosi teraz 28, ponieważ 28 * 9 jest największą wartością, jaką możesz mieć, wciąż używając wartości jako koloru tła. Przetwarza teraz tylko jedno zdarzenie SDL na iterację, co całkowicie eliminuje wewnętrzną pętlę. Myślę, że dość ciasno!
Symulacja rozpoczyna się z przerwą, wszystkie komórki są martwe. Możesz nacisnąć dowolny klawisz, aby przełączyć pauzę / pauzę, i kliknąć dowolną komórkę, aby przełączyć ją między żywym a martwym. Uruchamia iterację co dziesiąte sekundy.
Opakowanie jest nieco nieporadne.
Wygląda tak:
Zabawne wyzwanie! Z zadowoleniem przyjmuję wszelkie ulepszenia, które każdy może zobaczyć.
źródło
Scala,
118111581128106310181003999992987 znakówNie golfowany:
Większa część kodu tutaj to Swing GUI. Sama gra polega na
actionPerformed
metodzie uruchamianej przezTimer
funkcję pomocniczą i,n
która liczy sąsiadów.Stosowanie:
Skompiluj go,
scalac filename
a następnie uruchomscala L
.Kliknięcie kwadratu odwraca go z życia na martwy, a opcja menu uruchamia i zatrzymuje grę. Jeśli chcesz zmienić rozmiar siatki, zmień pierwsze trzy wartości w linii:
var(w,h,c,d,r)=(20,20,20,0,false)
są to odpowiednio szerokość, wysokość i rozmiar komórki (w pikselach).źródło
import java.awt.event._
icontents+=m("Go",true)+=m("Stop",false)}}
, prowadzące do 1093 postaci.Pure Bash, 244 bajty
Działa na owiniętym toroidami wszechświecie 36x24:
Ponieważ jest to skrypt powłoki, metoda wprowadzania jest zgodna z innymi poleceniami powłoki - np. Ze standardowego wejścia:
... itd
Możemy przekierowywać dane wejściowe z dowolnego źródła tekstu, przepuszczonego przez
tr
filtr, aby uzyskać ciekawe początkowe generacje, npźródło
JavaScript, 130
Nie całkowicie odpowiadając na wyzwanie, ale dla przypomnienia, oto silnik Game of Life w 130 bajtach wyprodukowany przez Subzey i ja w 2013 roku.
http://xem.github.io/miniGameOfLife/
źródło
@@\n@@
(kwadrat 2 na 2 w lewym górnym rogu) lub.@\n.@\n.@
. (Kolumna 1 na 3)C # - 675 znaków
Zawsze chciałem napisać wersję tego programu. Nigdy nie wiedziałem, że szybka i brudna wersja zajmie tylko leniwe pół godziny. (Gra w golfa trwa oczywiście dłużej).
Stosowanie
Kompromisy w golfa
źródło
GW-BASIC,
10861035 bajtów (tokenizowane)W postaci tokenizowanej jest to 1035 bajtów. (Formularz ASCII jest oczywiście nieco dłuższy.) Otrzymasz tokenizowany formularz, używając
SAVE"life
polecenia bez dołączania go",a
do interpretera.Jest to wersja z maksymalnym golfem, ale wciąż funkcjonalna: po uruchomieniu dostajesz edytor, w którym możesz poruszać się za pomocą klawiszy kursora; spacja włącza / wyłącza bakterie na bieżącym polu,
c
czyści ekran, Return uruchamia tryb gry.Poniżej znajduje się mniej zaciemniona wersja, która również ustanawia planszę początkową z dwiema strukturami (rzecz obracająca się w kółko i szybowiec):
Napisałem to w 15 minut, znudzony i czekając na przyjaciela, który grał w golfa ze swoim „uczniem” w Conway's Game of Life w tym samym czasie.
Działa w ten sposób: Natychmiast używa bufora ekranowego w trybie tekstowym 80x25 (zmień wartość początkową,
DEF SEG
aby użyć,&hB000
jeśli korzystasz z karty graficznej Hercules; te ustawienia działają z Qemu i (wolniejszym) dosbox). Gwiazdka*
to bakteria.Działa dwuprzebiegowo: po pierwsze, miejsca narodzin są oznaczone,
+
a śmierć oznacza ich cele.
. W drugim przejściu,+
i.
otrzymuje się*
a, odpowiednio.
Chodzi
TIMER
o to, aby poczekać pół sekundy po każdej rundzie, na wypadek gdyby Twój host Qemu był bardzo szybki ☺Nie liczę na najkrótszą wygraną, ale na świetną, zwłaszcza biorąc pod uwagę początkową konfigurację planszy. Mam też wersję, w której silnik gry został zastąpiony przez kod asemblera, na wypadek gdybyś był zainteresowany…
źródło
1
,2
,3
, itd.) Czy numery linii nie liczyć?Mathematica, 115 bajtów
Oto proste rozwiązanie tego problemu:
źródło
Java (OpenJDK 8) -
400 388367 bajtówDruga i (prawdopodobnie) ostateczna edycja: Udało się zagrać w golfa dodatkowe 21 bajtów po znalezieniu tych (imo) kopalni złota - zdecydowanie polecam nowym osobom, aby je przeczytały (szczególnie jeśli zamierzasz wypróbować niektóre z tych wyzwań przy użyciu Javy).
Wynikowy kod (prawdopodobnie skończę grać w golfa jeszcze bardziej, jeśli dowiem się, jak skrócić te podwójne zagnieżdżone dla pętli ...):
Wypróbuj online!
(Oryginalny post zaczyna się tutaj.)
Właściwie przez chwilę myślałem, że będę w stanie przynajmniej rzucić wyzwanie najlepszej odpowiedzi w języku Python z moją (prawdopodobnie ograniczoną) znajomością Java lol ... Było to wyzwanie, w którym jednak uczestniczyłem (mimo że dołączyłem do drużyny, być może tylko trochę późno ...)
Naprawdę nie ma w tym nic wielkiego - podstawowe wyjaśnienie (niemodyfikowane):
(więcej informacji na temat instrukcji lambda w Javie 8 tutaj )
Tak, w moim podejściu jest pewien haczyk.
Jak większość z was zapewne zauważyła, mój kod w golfa w obecnej postaci będzie zapętlony na zawsze. Aby temu zapobiec, licznik można wprowadzić u góry i użyć w pętli while do wyświetlania
n
(w tym przypadku 5) iteracji w następujący sposób (zauważ, żeb
dodano nową zmienną):Dodatkowo kilka punktów, o których warto wspomnieć. Ten program nie sprawdza poprawności danych wejściowych i dlatego zawiedzie (najprawdopodobniej) an
ArrayOutOfBoundsException
; dlatego upewnij się, że dane wejściowe są poprawne, całkowicie wypełniając część tablicy (krzywe tablice wyrzucą wyjątek wspomniany powyżej). Ponadto tablica, w której jest obecnie, wygląda na „płynną” - to znaczy, że nie ma rozdziału między jednym pokoleniem a następnym. Jeśli chcesz to dodać, aby dokładnie sprawdzić, czy generowane generacje są rzeczywiście ważne,System.out.println();
tuż przedtem należy dodać dodatkowefor(int[]t:u)Arrays.fill(t,0);
( dla jasności zobacz Wypróbuj online! ). I na koniec, biorąc pod uwagę, że jest to mój pierwszy kod golfowy, wszelkie opinie są bardzo mile widziane :)Stary kod z poprzedniej 388 bajtowej odpowiedzi:
I od początkowej 400 bajtowej odpowiedzi:
źródło
Szablon , 6 bajtów
Nie mój ulubiony język, ale jest krótki…
4 bajty kodu plus flagi
∊
nlist iT
orus.Wypróbuj online!
Czy ...
3
3∊
członkiemm
tej m oore Sąsiedztwo-count z siebie lube
The Moor e -neighbourhood-count bez siebie...?
źródło
Scala - 799 znaków
Uruchom jako skrypt. Kliknięcie myszą kwadratu włącza lub wyłącza, a dowolny klawisz uruchamia lub zatrzymuje generowanie.
źródło
J, 45
Myślałem, że spróbuję J. Nie jest jeszcze szczególnie dobrze golfowany, ale wkrótce spróbuję jeszcze raz.
Przykład:
źródło
Przetwarzanie
536532Uważam, że spełnia to wszystkie wymagania.
Nie golfowany:
źródło
Matlab (152)
Nie mam teraz zainstalowanego Matlaba, żeby go przetestować, po prostu grałem w kod napisany kilka lat temu.
Nie golfowany:
źródło
Perl,
218216211202 bajtów(Brak nowego wiersza na końcu tego kodu).
Odczytuje wzorzec początkowy ze standardowego wejścia, jako plik tekstowy, w którym żywe komórki są reprezentowane jako
1
, martwe komórki reprezentowane jako spacja, linie są oddzielone nową linią. Dane wejściowe nie mogą zawierać znaków innych niż te. Linie mogą mieć różną długość i będą wypełnione lub obcięte do szerokości dokładnie 79. Przykładem może być szybowiec:Gdy program uruchamia Game of Life, każdy stan jest zrzucany na standardowe wyjście w formacie podobnym do wejścia, a następnie opóźnia 0,1 sekundy. Opóźnienie można dostosować, zmieniając czwarty argument wybranego wywołania.
Plansza jest zakodowana na stałe do rozmiaru 79x23. Jest owinięty torusem: jeśli opuścisz deskę na dole, znajdziesz się na górze; jeśli wyjdziesz po prawej stronie, skończysz po lewej stronie, ale przesunąłeś jeden rząd w dół.
Oto alternatywna wersja, która nie odczytuje żadnych danych wejściowych i zaczyna się od losowej tablicy:
Ten kod pochodzi z zaciemnionego programu gry w Perla napisanego przed laty . Bardzo to zmieniłem, aby kod toroidalny i golf były kodem.
Prawdopodobnie nie jest to najkrótsza metoda na wdrożenie Game of Life w Perlu, ale jest to jedna z mniej zrozumiałych.
źródło
Python, 589 bajtów
Przyciski myszy: lewy - wstaw komórkę, prawy - usuń komórkę, środek - start / stop.
A oto wersja, w której możesz przeciągać myszą, aby rysować. Grafika jest nieco przyjemniejsza.
źródło
if 1<n<4:
powinna być wcięta na tym samym poziomie cofor j in z(-1,2):
Python 2, 456 bajtów
Chociaż wiem, że to stary post, nie mogłem się powstrzymać od wypróbowania go. Plansza początkowa może mieć dowolny rozmiar, pod warunkiem, że wokół niej narysujesz ramkę i będziesz mieć dodatkowe miejsce w ostatniej linii.
Golf.py
Input.txt (zwróć uwagę na dodatkowe miejsce w ostatnim wierszu)
Jak biegać
źródło
time.sleep(0.1)==None
=>not time.sleep(.1)
,(f=='@'and(x==3 or x==2
)) lub (f == '' i x == 3) =>x==3or f=='@'and x==2
1 if
=>1if
.Przetwarzanie
270,261249 bajtówSiatka to 100 * 100 pikseli ekranu, dane wejściowe mają postać obrazu png
Nie golfił
źródło
Lua + LÖVE / Love2D , 653 bajtów
lub rozdzielone:
Kliknij pole, aby dodać żywe komórki. Kliknij poza polem, aby go uruchomić.
Wypróbuj online!
źródło
Postscriptum
529515Zaczął od przykładu z kodu Rosetta . Wywołaj za pomocą argumentu nazwy pliku (
gs -- gol.ps pulsar
), pliku zawierającego 20 * 20 liczb binarnych (oddzielonych spacją). Nieskończona pętla: rysuj planszę, poczekaj na wejście, oblicz następną generację.Oddzielny, z kilkoma komentarzami stosu (tylko te, których potrzebowałem).
plik danych pulsar:
źródło
JavaScript 676
Przepraszam, Griffin, po prostu nie mogłem spojrzeć na twój kod i nie napisać go ponownie ... musiałem zgolić dwa znaki, ale było to cholernie warte!
b=[];r=c=s=20;U=document;onload=function(){for(z=E=0;z<c;++z)for(b.push(t=[]),j=0;j<r;j++)with(U.body.appendChild(U.createElement("button")))t.push(0),id=z+"_"+j,style.position="absolute",style.left=s*j+"px",style.top=s*z+"px",onclick=a}; ondblclick=function(){A=E=E?clearInterval(A):setInterval(function(){Q=[];for(z=0;z<c;++z){R=[];for(j=0;j<r;)W=(c+z-1)%c,X=(c+z+1)%c,Y=(r+j-1)%r,Z=(r+j+1)%r,n=b[W][Y]+b[z][Y]+b[X][Y]+b[W][j]+b[X][j]+b[W][Z]+b[z][Z]+b[X][Z],R.push(b[z][j++]?4>n&&1<n:3==n);Q.push(R)}b=Q.slice();d()})};function a(e){E?0:P=e.target.id.split("_");b[P[0]][P[1]]^=1;d()}function d(){for(z=0;z<c;++z)for(j=0;j<r;)U.getElementById(z+"_"+j).innerHTML=b[z][j++]-0}
Ale jak mówią, łatwiej prosić o wybaczenie niż o pozwolenie ...;)
źródło
Oktawa (153)
taki sam jak Matlab DenDenDo w Shortest Game of Life , ale musiał zmienić imshow na imagesc:
źródło
Python 2: 334 bajtów
Tylko 6 lat spóźnienia.
Możesz uruchomić go w następujący sposób:
Gdy 0 i 1 oznaczają martwe i żywe komórki, dodatkowa nowa linia na końcu rozpoczyna wykonywanie.
Siatki muszą być kwadratowe.
Łatwiej jest go uruchomić niż najkrótszy python, obsługuje siatki dowolnej wielkości i wygląda ładnie po uruchomieniu.
To także 100 bajtów więcej, więc jest to.
źródło
PHP, 201 bajtów (nie testowano)
Uruchom z
-nr
.awaria
źródło