Zelluläre Automaten sind wirklich faszinierend. Diejenigen, über die normalerweise gesprochen wird, sind die binären, dh diejenigen, die durch eine Zahl darstellbar sind. Diese wurden jedoch meiner Meinung nach zu Tode gebracht. Ternäre CAs sind interessanter, aber wir müssen alle ASCII-Werte berücksichtigen! Was für ein Spaß könnte das sein!
Anstatt für jeden Charakter einen Regelsatz zu bestimmen, verwende ich eine einfache Entscheidungsregel, über die ich gleich sprechen werde. Um die nächste Generation zu bestimmen, betrachten wir die drei "oberen" Zellen, ähnlich wie bei einem zellularen Automaten. Beachten Sie ein Beispiel:
QWERTY
X Y Z
Die "Spitze" von Y
ist WER
, die Zellen oben und rechts, oben und oben und links zu sein. Y wird das Ergebnis der Funktion sein, die ich definieren werde. Dabei handelt es sich um eine Funktion für Zeichenfolgen mit drei Zeichen. Die „Spitze“ von X
ist QW
, oder eine Raumfüllung im inexistent / fehlende Zelle .
Nun zur spaßigen Funktion! Ich bezeichne diese Sequenz aus einem bestimmten Grund als XOROR-Sequenz. Sei A
der Zeichencode der oberen linken Zelle, B
der Zeichencode C
der oberen Zelle und der Zeichencode der oberen rechten Zelle. Dann ist die resultierende Zelle das Zeichen, dessen Zeichencode ist (A XOR B) OR C
, das heißt (A^B)|C
. (Wenn ein resultierender Wert größer als 126 ist, wird er auf gesetzt (CHARCODE % 127) + 32
. Wenn ein Wert kleiner als 32 ist, wird nichts getan.) Hier ein Beispiel für den Startwert 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
Und wir können noch eine Weile weitermachen. Diese Änderung der Zeichenfolge wird als XOROR-Sequenz bezeichnet.
Ziel Sie müssen ein Programm oder eine Funktion schreiben, die eine der folgenden Aufgaben ausführt:
- Wenn Sie eine Zeichenfolge
s
und eine Zahl angebenn >= 0
, geben Sie dien
th-Zeichenfolge in der XOROR-Sequenz mit seed auss
, wobein = 0
es sich um die erste Transformation der Zeichenfolge handelt. - Wenn ein String angegeben wird
s
, wird ein unendlicher Stream der XOROR-Sequenz mit Seed ausgegeben (für Programme) oder generiert (für Funktionen / Generatoren)s
. Sie können anhalten, wenn die Sequenz wiederholt wird, dies ist jedoch nicht erforderlich.
s
besteht immer nur aus druckbaren ASCII-Zeichen, vom Leerzeichen bis zur Tilde plus Tabulatoren (keine Zeilenumbrüche)
Dies ist ein Code-Golf , also gewinnt das kürzeste Programm in Bytes.
quelle
o
s lassen es wie ein Zergrausch aussehen .127%127+32==32
.n=0
nicht die ursprüngliche Zeichenfolge?(d^!)|(space)
. Was Ihre zweite Frage betrifft , führen Sie diese aus,(CHAR%127)+32
nachdem das XOROR ausgeführt wurde.Antworten:
MATL ,
3331 BytesDies funktioniert in Version 13.1.0 der Sprache / des Compilers, die der Herausforderung vorausgeht .
Die erste Eingabe ist die Zahl, die zweite die Zeichenfolge.
Probieren Sie es online!
quelle
Mathematica, 133 Bytes
Es wäre schön
CellularAutomaton[]
, wenn eine Lösung funktionieren würde, aber ich kam immer wieder zu kurz. Jemand?Bearbeiten: einige schöne Bilder (zum Vergrößern anklicken)
plotCA["Hello, World!", 60]
:plotCA[bXORnotb, 100]
:plotCA[raven, 100]
:quelle
CellularAutomaton
Ihre Update-Funktion geben? (Die tatsächliche Regel Nummer mit 127 gültigen Staaten wäre verrückt.)Java,
193185 BytesWeil Java.
-8 Bytes durch Umschalten in eine Schleife anstatt in eine anonyme Funktion
Gibt die n-te Iteration von XOROR auf s zurück.
Lesbare Version:
Ziemlich wörtliche Implementierung der Spezifikation mit einer rekursiven Schleife, um die Operation n-mal anzuwenden. Einige Bytes wurden jedoch mit meiner Beobachtung gespeichert, dass die CHARCODE> 126-Klausel immer nur mit CHARCODE == 127 auftreten wird, was zum Speichern führt
SPACE
anstelle von führtDEL
.Ich habe meinen Code über ein paar willkürlich ausgewählte Zeichenketten laufen lassen und diesen wunderbaren Zyklus gefunden:
quelle
ok
!CJam, 38 Bytes
Teste es hier.
Erläuterung
quelle
lri){2S*\*3ew{)\:^|}%127c' er}*
weil die Zeichen Pre-Modulo-Operation 127 nie überschreitetHaskell, 123 Bytes
Dies gibt einen unendlichen Strom der XOROR-Sequenz zurück. Anwendungsbeispiel (drucke die ersten 5 Elemente des Seeds
"Hello, World!"
):Wie es funktioniert:
quelle
PHP, 186 Bytes (mit n) | 177 Bytes (unendlich)
Es stellte sich heraus, dass der Endlosdruck kürzer ist ...
Ungolfed mit n:
Ungolfed unendlich:
quelle
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);}
ist 141 Bytes lang (-36 Bytes).C ++
N-te Sequenz (212)
Ungolfen
N-Sequenz, die Zeigersyntax anstelle von Array-Syntax verwendet, um dies noch verwirrender zu machen: (231)
Ungolfen
Debug-Funktion (zum Spaß)
quelle
JAVA 240/280 Bytes
Die populäre Java-Version zu der Zeit, als ich dies schrieb, gab an, 185 Bytes zu haben, aber es gibt zwei signifikante Fudge-Punkte. Erstens ist die Messung vermutlich nur für die Funktion, nicht für die gesamte Arbeitsquelle. Vielleicht kein solches Problem. Zweitens wird BiFunction ohne Import oder vollständig qualifizierten Namen verwendet. Das Hinzufügen der erforderlichen Bits, um es so wie es ist auszuführen (und es dann fair zu minimieren), brachte es auf 348 Bytes. Wenn Sie nur den vollständig qualifizierten Namen der BiFunction-Klasse hinzufügen, beträgt dieser 248 Byte.
Im Gegensatz dazu glaube ich, dass meine 240 Bytes sind, wenn nach den gleichen Regeln gespielt wird (keine Klasse, keine tatsächliche Ausgabe, nur das Fleisch). Die ausführbare Klasse ist 280 Byte groß und sieht wie folgt aus (nicht abgeschlossen):
Oder verkleinert:
quelle
Perl, 47 Bytes
Beinhaltet +2 für
-lp
Führen Sie mit der Eingabe auf STDIN, z
perl -lp xoror.pl <<< "Hello, World!" | head -26
xoror.pl
:Dies funktioniert wie es ist, aber ersetzen Sie den
\x7f
durch den entsprechenden Binärwert, um die angegebene Punktzahl zu erhaltenquelle
Swift: 273 Zeichen
Wow, Swift ist schlimmer als Java! (Alle diese APIs mit langen Namen!: P)
Ungolfed:
Vielen Dank an @ CAD97 für die Erwähnung, dass (A ^ B) | C nur größer als 126 sein kann, wenn es 127 ist.
Ich habe auch festgestellt, dass Sie keine Klammern um A ^ B | C benötigen, da das XOR-Verfahren vor dem OR-Verfahren durchgeführt wird, sodass ich ein paar Bytes gespart habe.
quelle