Automaty komórkowe są naprawdę fascynujące. Te, o których zwykle się mówi, to te binarne, tzn. Te reprezentowane przez liczbę. Jednak te, moim zdaniem, zostały skazane na śmierć. Trójstronne urzędy certyfikacji są bardziej interesujące, ale musimy wziąć pod uwagę wszystkie ASCII! Cóż to może być za przyjemność!
Zamiast decydować o zestawie reguł dla każdej postaci, użyję prostej reguły decydującej, o której powiem wkrótce. Aby zdecydować o następnej generacji, patrzymy na trzy „górne” komórki, podobnie jak automaty komórkowe. Obserwuj przykład:
QWERTY
X Y Z
„Góra” Y
to WER
komórki powyżej i po prawej, powyżej i powyżej oraz po lewej stronie. Y będzie wynikiem funkcji, którą zamierzam zdefiniować, która jest funkcją na łańcuchach trójznakowych. „Top” o X
to QW
, czy wypełnienie przestrzeni w nieistniejącej / brakujące ogniwa .
Teraz funkcja zabawy ! Nie bez powodu nazywam tę sekwencję sekwencją XOROR. Niech A
będzie górnym lewym kodem komórki, B
powyższym kodem komórki i C
będzie prawym górnym kodem komórki. Następnie uzyskany komórka jest postać, której charCode to (A XOR B) OR C
, że jest (A^B)|C
. (Jeśli wynikowa wartość jest większa niż 126, wówczas jest ustawiona na (CHARCODE % 127) + 32
. Nic nie jest robione, jeśli wartość jest mniejsza niż 32.) Oto przykład ziarna Hello, World!
:
S: Hello, World!
0: mmmo/c_ z}~)e
m = ( )^(H)|(e) = (32^72)|101 = 104|101 = 109 (m)
m = (H)^(e)|(l) = (72^101)|108 = 45|108 = 109 (m)
etc.
1: mmo/c_< +wl
2: mo/c_<c< + |;
3: o/c_<c ?+ g
4: oc_<c c??4+gg
5: 0_<c c 4+ o
6: _<c ccc4??ooo
7: c ccc4 ?o o
8: ccccc4w? pooo
9: cccc4w h o
A: ccc4wc hh ooo
B: cc4wc4kh ooo
C: c4wc4 #ooo o
D: wwc4w4#ooo oo
E: wc4wwc oo oo
F: w4wwc4oo oo o
G: wwwc4 oo oo
H: wwc4w4 oo oo
I: w4wwc4oooo oo
J: wwwc4 oo oo
K: wwc4w4oo oo o
L: wc4wwo oo oo
M: w4wwo8ooo oo
N: wwwo8 o oo o
O: wwo8w8oooo oo
I możemy kontynuować przez jakiś czas. Ta modyfikacja ciągu nazywana jest sekwencją XOROR.
Cel Masz napisać program lub funkcję, która wykonuje jedno z następujących zadań:
- Biorąc pod uwagę ciąg
s
i liczbęn >= 0
,n
wyślij th ciąg w sekwencji XOROR z nasionems
,n = 0
będąc pierwszą transformacją łańcucha. - Podany ciąg
s
wyjściowy (dla programów) lub wygenerowany (dla funkcji / generatorów) nieskończony strumień sekwencji XOROR z ziarnems
. Możesz zatrzymać, jeśli sekwencja się powtarza, ale nie jest to konieczne.
s
zawsze będzie się składać wyłącznie z drukowalnych znaków ASCII, od spacji do tyldy plus tabulatorów (bez nowych linii).
To jest golf golfowy , więc wygrywa najkrótszy program w bajtach.
źródło
o
sprawiają, że wygląda jak przypływ zergów .127%127+32==32
.n=0
nie jest oryginalny ciąg?(d^!)|(space)
. Co do drugiego pytania, wykonujesz(CHAR%127)+32
po wykonaniu XOROR.Odpowiedzi:
MATL ,
3331 bajtówDziała to w wersji 13.1.0 języka / kompilatora, która poprzedza wyzwanie.
Pierwsze wejście to liczba, drugie to ciąg.
Wypróbuj online!
źródło
Mathematica, 133 bajty
Byłoby miło, gdyby
CellularAutomaton[]
rozwiązanie zadziałało, ale ciągle brakowało mi. Ktoś?Edycja: kilka ładnych zdjęć (kliknij, aby powiększyć)
plotCA["Hello, World!", 60]
:plotCA[bXORnotb, 100]
:plotCA[raven, 100]
:źródło
CellularAutomaton
swojej funkcji aktualizacji? (Rzeczywisty numer reguły z 127 ważnymi stanami byłby szalony.)Java,
193185 bajtówPonieważ Java.
-8 bajtów, przełączając się na zapętlanie zamiast rekurencji, aby uczynić go anonimową funkcją
Zwraca n-tą iterację XOROR na s.
Wersja do odczytu:
Dosłownie implementacja specyfikacji, z rekurencyjną pętlą do zastosowania operacji n razy. Niektóre bajty zostały jednak zapisane, z moimi spostrzeżeniami, że klauzula CHARCODE> 126 wystąpi tylko z CHARCODE == 127, co spowoduje zapisanie
SPACE
zamiastDEL
.Uruchomiłem mój kod na kilku dowolnie wybranych ciągach i znalazłem ten cudowny cykl:
źródło
ok
!CJam, 38 bajtów
Sprawdź to tutaj.
Wyjaśnienie
źródło
lri){2S*\*3ew{)\:^|}%127c' er}*
ponieważ operacja pre-modulo znaków nigdy nie przekracza 127Haskell, 123 bajty
Zwraca nieskończony strumień sekwencji XOROR. Przykład użycia (wydrukuj pierwsze 5 elementów nasion
"Hello, World!"
):Jak to działa:
źródło
PHP, 186 bajtów (z n) | 177 bajtów (nieskończony)
Okazało się, że druk nieskończony jest krótszy ...
Nie golfił z n:
Nieskończony nieskończony:
źródło
function i($s){for(;;$i=0,print$s=$r)for($r='';$i<strlen($s);$r.=chr($t>126?32:$t))$t=((ord($s[$i-1])?:32)^ord($s[$i]))|(ord($s[++$i])?:32);}
ma 141 bajtów (-36 bajtów).C ++
Sekwencja n-ta (212)
Bez golfa
Sekwencja n-ta używa składni wskaźnika zamiast składni tablicowej, aby uczynić to tym bardziej zagmatwanym: (231)
Bez golfa
Funkcja debugowania (dla zabawy)
źródło
JAVA 240/280 Bytes
Popularna wersja Java w chwili, gdy ją pisałem, twierdziła, że ma 185 bajtów, ale istnieją dwa znaczące punkty krówki. Po pierwsze, pomiar jest przypuszczalnie tylko dla funkcji, a nie dla pełnego źródła pracy. Może nie taki problem. Po drugie, używa BiFunction bez importu lub pełnej nazwy. Dodanie wymaganych bitów, aby uruchomić go takim, jaki jest (a następnie zminimalizować, całkiem), doprowadziło go do 348 bajtów. Dodanie tylko pełnej nazwy klasy BiFunction sprowadza ją do 248 bajtów.
Przeciwnie, uważam, że mój ma 240 bajtów, gdy gra się na tych samych zasadach (bez klasy, bez rzeczywistej wydajności, tylko mięso). Pełna klasa uruchamialna ma 280 bajtów i wygląda następująco (nieupoważniona):
Lub zminimalizowane:
źródło
Perl, 47 bajtów
Obejmuje +2 za
-lp
Uruchom z wejściem na STDIN, np
perl -lp xoror.pl <<< "Hello, World!" | head -26
xoror.pl
:Działa to tak, jak jest, ale zastąp
\x7f
je odpowiednią wartością binarną, aby uzyskać podany wynikźródło
Swift: 273 znaków
Wow, Swift jest gorszy niż Java! (Wszystkie te interfejsy API o długich nazwach!: P)
Nie golfowany:
Dzięki @ CAD97 za wspomnienie, że (A ^ B) | C może być większe niż 126, gdy wynosi 127.
Uświadomiłem sobie również, że nie potrzebujesz nawiasów wokół A ^ B | C, ponieważ XORing jest wykonywany przed ORingiem, dzięki czemu zaoszczędziłem kilka bajtów.
źródło