Wyzwanie
Masz napisać kompletny program, który pobiera siedem liczb ze STDIN i drukuje dwuwymiarową historię automatu komórkowego (CA) do STDOUT. To jest kod golfowy.
Formatowanie danych wejściowych Będzie to siedem liczb całkowitych / ciągów oddzielonych przecinkami. Pierwsza liczba to numer reguły zgodnie z kodem Wolfram (standardowa nazwa każdej reguły). Drugi to początkowa konfiguracja początkowa. Trzeci i czwarty opisują jaki wzorzec i ile razy należy go dołączyć po lewej stronie początkowej konfiguracji. jako wyściółka. Piąta i szósta robią to samo dla prawej strony. Ostatnia liczba to liczba pokoleń do uruchomienia symulacji.
Przykładem jest dane wejściowe 90,11,0,4,0,4,5
. To powinno powiedzieć Twojemu programowi, że korzystasz z reguły 90 . Powinien także powiedzieć programowi, że chcesz, aby początkowa konfiguracja była 11
z łańcuchem 0
dołączonym 4 razy na obu końcach, więc rzeczywisty wzorzec początkowy to 0000110000
. Informuje również twój program o uruchomieniu tej symulacji przez 5 pokoleń.
Dane wyjściowe Twój program powinien drukować całą tablicę komórek każdego pokolenia (oddzielonych znakami nowej linii), tak aby dane wyjściowe były schematem czasoprzestrzennym urzędu certyfikacji. Dla każdego pokolenia stan każdej komórki jest określony przez jej stan i stany komórek po lewej i prawej stronie, zgodnie z regułą podaną jako dane wejściowe. Symulacja powinna owijać się wokół krawędzi. Pierwszą drukowaną rzeczą powinna być tablica początkowa jako gen. 0.
Dane wejściowe 90,11,0,4,0,4,5
powinny skutkować następującymi danymi wyjściowymi tak dokładnie, jak to możliwe.
0000110000
0001111000
0011001100
0111111110
1100000011
0110000110
Zauważ, że stan początkowy nie jest uwzględniony w pięciu pokoleniach. Zauważ również, że symulacja owija się wokół krawędzi.
Więcej przykładów
Wejście:
184,1100,01,2,01,1,4
wynik:
0101110001
1011101000
0111010100
0110101010
0101010101
Wejście:
0,1011,1,0,0,1,2
wynik:
10110
00000
00000
Więcej informacji o tym, jak działa 1D CA i jak są one ponumerowane
źródło
Odpowiedzi:
Golfscript,
77 7370 znakówDzięki @Howard, który wskazał, jak zapisać 4 znaki.
źródło
48-
->1&
i myślę, że jeszcze trzy. Możesz pominąć)
przed blokiem (nie zwiększać licznika), a zatem zapisać również dwa ostatnie wyskoki.APL (153 znaki)
I w mniej czytelnej, nieco krótszej formie:
Przykład:
Jestem pewien, że jest miejsce na ulepszenia (nawet napisałem kilka zmian podczas pisania tego postu!), Ale niektóre z nich mogą wymagać fundamentalnych zmian i nie mogę dłużej patrzeć na APL. Stosowanym tutaj wariantem APL jest Dyalog APL .
źródło
Rubin,
165159 znakówEdycja: Znalazłem miejsca na małe ulepszenia.
Przykładowy przebieg:
źródło
C
303 305 301 294292305 Edycja: ups. Zapomniałem o tym
calloc()
potrzeba dwóch argumentów. Wysadzało to przy większym wejściu.301 Edycja: Ah HA! Użyłem mojego
calloc()
Użyłem boo-boo, aby zaoszczędzić 2 bajty, zwiększając rozmiar bloku żądanej pamięci.294 Edycja: Złam 300! Wyeliminowany jeden z
strcat()
i poprawiłem kilka pętli. Muszę użyć maksymalnego chrupka, co jest równie zabawne w mówieniu, jak używanie.292 Edycja: Nie potrzebowałem
+2
przydziału pamięci.I używany odpowiedź luser Droog jest jako idea bazowej, ale zmienił się algorytm pakowania, a także wiele szczypanie i faktoringu ze stałych.
źródło
C,A,
! :)brk()
? top=s+C+1;
gdzieś+++
!%[01]
, aby%s
! -9 (... wiele lat później)C (
487484418 z usuniętymi spacjami)* Upuszczono 66 z pomocą JoeFisha *
maszynopis
źródło
int
ustawiając zmienne globalne i usuwając#include
:r,A,B,C,n,i,j; main(){char *s...
for
for(;A--;)strcat(s,a);
A
aC
później, abyś nie musiał się deklarowaći
aniB
wcale.p=malloc((C=strlen(s))+1); --C; strcpy(p,s); for(A=0;A<n;A++){
Przepraszam, przestanę teraz :)--C;
:p=malloc((C=strlen(s)-1)+2);
. Myślę, że kod do gry w golfa jest fajniejszy niż wymyślanie go w pierwszej kolejności!#include
, ponieważscanf
jest o zmiennej liczbie argumentów. Ale prawdopodobnie jest w porządku, ponieważ jest wywoływany tylko raz. ... Moja stara maszyna zmarła wczoraj, a ja wciąż instaluję Cygwin. Uwzględnię te zmiany, jak tylko będę mógł je przetestować. Dzięki!