Reguła 110 jest automatem komórkowym o kilku interesujących właściwościach. Twoim celem jest zasymulowanie reguły 110 przy użyciu jak najmniejszej liczby znaków.
Dla tych, którzy nie wiedzą, reguła 110 jest symulowana linia po linii w siatce. Każdy kwadrat w linii siatki patrzy na kwadraty powyżej, powyżej po lewej i powyżej po prawej stronie, aby określić, jaka komórka powinna być.
current pattern 111 110 101 100 011 010 001 000
new cell 0 1 1 0 1 1 1 0
Dane wejściowe: liczby od 0 do 39 reprezentujące n-ty kwadrat w górnym wierszu, w dowolnym rozsądnym formacie (ciąg oddzielony przecinkami, lista, argumenty funkcji). Aby uwzględnić języki z jednym indeksem, liczby mogą być również indeksowane z 1 indeksem, a więc mogą zawierać się w przedziale od 1 do 40.
Przykładowe dane wejściowe:
38,39
Wyjście: siatka 40 x 40 reprezentująca działające automaty, w tym pierwszy rząd. Powinieneś zostawić 0 jako pustą i 1 jak każdy widoczny znak drukowania. Dopuszczalne są spacje końcowe, o ile można właściwie rozróżnić rzeczywistą siatkę. Dół siatki może mieć nową linię, ale między liniami siatki nie powinny być puste linie.
Przykładowe dane wyjściowe:
XX
XXX
XX X
XXXXX
XX X
XXX XX
XX X XXX
XXXXXXX X
XX XXX
XXX XX X
XX X XXXXX
XXXXX XX X
XX X XXX XX
XXX XXXX X XXX
itp.
Uwaga: Podobne pytanie dotyczące automatów komórkowych 1D zostało już zadane, ale mam nadzieję, że przy użyciu tylko jednej reguły można napisać krótsze odpowiedzi.
Odpowiedzi:
CJam - 47
Używa
!
komórek „1”.Wypróbuj na http://cjam.aditsu.net/
Wyjaśnienie:
S40*
tworzy ciąg (tablica) z 40 spacjamil',/
czyta linię i dzieli przecinkiem{…}/
wykonuje blok dla każdego elementu (liczby w postaci łańcucha)-
i'!t
konwertuje liczbę na liczbę całkowitą i ustawia pozycję w tym miejscu w poprzednim ciągu (początkowo 40 spacji ) do '!'W tym momencie uzyskaliśmy pierwszą linię.
{…}39*
wykonuje blok 39 razy-
N
dodaje nowy wiersz-
40,
tworzy tablicę [0 1… 39]-
S3$S++
kopiuje poprzedni wiersz (pozycja 3 na stosie) i wypełnia go spacją po każdej stronie-
f{…}
wykonuje blok dla {każdej liczby od 0 do 39} i {linia wypełniona}-
>3<
pobiera wycinek 3 elementów z linii wypełnionej, zaczynając od bieżącego numeru-
2b
konwertuje z bazy 2; elementy, które kroiliśmy, nie są cyframi 2-podstawowymi, ale znaki są konwertowane na ich wartości ASCII, a „mod 8 to 0 i„! ” mod 8 to 1-
137Yb
konwertuje 137 na bazę 2 (Y
= 2), otrzymując [1 0 0 0 1 0 0 1], która jest 110 odwrócona i zanegowana (na 8 bitach)-
='!^
otrzymuje odpowiednią cyfrę base-2 ( tablica jest zawijana, więc indeks jest pobierany mod 8) i xor to z '!' znak, w wyniku czego powstaje „!” dla 0 i „” dla 1źródło
Ruby, 113 znaków
Pobiera dane wejściowe na standardowe wejście. Aby użyć innej reguły, wystarczy zastąpić
110
ostatnią linię dowolną regułą, którą chcesz wypróbować.Przykład:
źródło
Mathematica, 122 bajty
Tak, możesz postrzegać to jako nadużywanie tej luki , ale a) ta luka jest dość sporna, b) pytanie Automatonu Komórkowego wymaga odpowiedzi Mathematica (zwłaszcza jednej z Reguły 110) ic) Odpowiedź Ruby Ventero jest i tak krótsza, więc nie nie sądzę, aby wyrządzono jakąkolwiek szkodę.
Większość znaków jest wykorzystywana do analizy wejściowej i formatowania wyjściowego. Rzeczywisty automat jest symulowany przy użyciu
Wykorzystuje to okresowe warunki brzegowe (więc siatka zawija się).
źródło
Python - 141
Uruchom jako np
python 110.py <<< 38,39
źródło
['X',' ']
można zmienić,'X '
aby zapisać 5 znaków.o=range()
q,
676258 bajtówZakłada brak zawijania:
Stara wersja
źródło
Python, 186
Przyzwoite, ale prawdopodobnie nie optymalne.
Nie określiłeś sposobu pobierania danych wejściowych, więc właśnie utworzyłem funkcję.
Użyj przykładu:
Wydajność:
źródło
Mathematica, 113 znaków
Kolejna odpowiedź Mathematica za pomocą
CellularAutomaton
.źródło
" "["X"][[#]]&
działa?" "["X"][[1]]
is"X"
." "["X"][[0]]
zwraca głowę" "["X"]
, a mianowicie" "
.C - 178
Ten kod zależy od faktu, że każdy wiersz w macierzy jest przechowywany w ciągłej pamięci. Ponadto nie drukuje pierwszego wiersza, ale drukuje kolejne 40, ponieważ reguły określały tylko siatkę 40x40.
Z naciskiem tylko na czytelność, liczba bajtów zawiera tylko niezbędny kod.
źródło
Lua - 351
Nie jest to idealny język do gry w golfa.
źródło
do u(n,i,'x')
to celowe, prawda?Haskell ,
175 170 169 136 127 127124 bajtów−9 bajtów dzięki @bmo
Wypróbuj online!
źródło
Haskell ,
135 131130 bajtów-1 bajt dzięki Ørjan Johansen (zmiana układu
take 40
)Zupełnie inne podejście do odpowiedzi FrownyFrog, ale o tej samej długości:
Wyjaśnienie
r
zipWith3
(?)
(?)
Operator jest najbardziej interesująca część rozwiązania: Wcześniej użyłem logiczną zasadę wygenerowany z mapą Karnaugh, ale okazuje się, że jest jeszcze bardziej zwięzły sposób:źródło
take 40$
wcześniejmap(" o"!!)<$>
.Łuska ,
3128 bajtówHah, Łuska bije Galaretkę!
Wypróbuj online!
Wyjaśnienie i nieprzygotowany
Przed dodaniem wyjaśnienia pozwól mi to trochę odhaczyć. Najpierw usuńmy różne kompozycje, dodajmy wyraźne nawiasy i rozpakuj
¨↑¨
ciąg. Także niech zastąpić40
z4
bardziej czytelnego wyjaśnienia:źródło
Java, 321 znaków
Dane wejściowe przekazywane na przykład jako argument z wiersza poleceń
java R 38,39
Nigdy nie pisałem bardziej zaciemnionego kodu Java :-)
źródło
Aktualizacja: Poprawny przykład wyjścia tutaj (z 40 wierszami nie 50): Nowe wyjście poniżej (usunięte poprzednie dla zwięzłości):
Układając kolejną łamigłówkę, nauczyłem się czegoś ciekawego na temat zagnieżdżania instrukcji w pętlach for w php i nagle stały się one znacznie bardziej złożone, niż początkowo myślałem. Kiedy mam czas, wydaje mi się, że mogę znacznie pokonać ten wynik. Na razie pozostaje jednak bez zmian na niekonkurencyjnym 408.
Moja wersja PHP 408 znaków:
To była świetna łamigłówka. Spędziłem też całe wieki, grając z wejściami, ponieważ są to fascynujące rzeczy, trzeba powiedzieć. W każdym razie tutaj jest moja wersja PHP (która nie jest tak dobra, jak niektóre z opublikowanych odpowiedzi, ale jest kompletna. Na 0 pozycji tylko powyżej i powyżej prawej, na 39 pozycji tylko powyżej i powyżej lewej, tzn. Bez zawijania. Więc tutaj jest moja wersja:
Możesz go zobaczyć i uruchomić tutaj: http://codepad.org/3905T8i8
Dane wejściowe są łańcuchem wejściowym na początku jako $ a = '38, 39 ';
Dane wyjściowe są następujące:
Mam nadzieję że ci się spodoba!!!
PS Musiałem dodać kilka podziałów linii do kodu, abyś mógł zobaczyć wszystko i nie rozciągać go na stronę za pomocą paska przewijania.
źródło
Stax , 24 bajty CP437
Uruchom i debuguj online!
Używa punktu kodowego 1 w CP437 dla komórek „1”.
Doskonałe etui, aby pokazać moc tego języka.
Wyjaśnienie
Używa do rozpakowania wersji (29 bajtów).
źródło
K (ngn / k) ,
4435 bajtówWypróbuj online!
{
}
funkcja z argumentemx
!40
lista liczb wewnętrznych od 0 do 39x?
znajdź swoje indeksy wx
, użyj0N
(„liczba całkowita null”) dla nie znaleziono^
które z nich są zerami? to daje nam wkład, zanegowany39{
}\
aplikuj 39 razy, zbierając wyniki pośrednie na liście1,x,1
otaczaj listę 1s (zanegowane 0)3'
trzy kolejne pozycje2/'
dekodowanie binarne@
używać jako wskaźników w ...2\145
kod binarny 145 (negowane bity 110)"X "
na koniec użyj macierzy 40x40 jako wskaźników w łańcuchu"X "
(@
tutaj jest to domniemane)źródło
Galaretka , 29 bajtów
Wypróbuj online!
źródło