Regel 110 ist ein zellularer Automat mit einigen interessanten Eigenschaften. Ihr Ziel ist es, eine Regel 110 mit möglichst wenigen Zeichen zu simulieren.
Für diejenigen, die es nicht wissen, wird Regel 110 Zeile für Zeile in einem Raster simuliert. Jedes Quadrat in einer Zeile des Rasters untersucht die Quadrate oben, oben links und oben rechts, um zu bestimmen, welche Zelle es sein soll.
current pattern 111 110 101 100 011 010 001 000
new cell 0 1 1 0 1 1 1 0
Eingabe: Zahlen von 0 bis 39, die das n-te Eingabequadrat in der obersten Zeile in einem beliebigen Format darstellen (durch Kommas getrennte Zeichenfolge, Liste, Funktionsargumente). Um 1-indizierte Sprachen zu unterstützen, können Zahlen auch 1-indiziert sein und liegen daher im Bereich von 1 bis 40.
Beispiel Eingabe:
38,39
Ausgabe: Ein 40 x 40-Raster, das die laufenden Automaten einschließlich der ersten Zeile darstellt. Sie sollten 0 als Leerzeichen und 1 als sichtbares Druckzeichen lassen. Nachgestellte Leerzeichen sind zulässig, solange das tatsächliche Raster angemessen unterschieden werden kann. Am unteren Rand des Rasters befindet sich möglicherweise ein Zeilenumbruch, zwischen den Rasterlinien sollten jedoch keine Leerzeichen stehen.
Beispielausgabe:
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
etc.
Hinweis: Eine ähnliche Frage zu 1D-Zellularautomaten wurde bereits gestellt, aber ich hoffe, dass mit nur einer Regel kürzere Antworten geschrieben werden können.
Antworten:
CJam - 47
Es wird
!
für "1" -Zellen verwendet.Versuchen Sie es unter http://cjam.aditsu.net/
Erläuterung:
S40*
macht einen String (Array) von 40 Plätzenl',/
eine Linie und Splits durch Komma liest{…}/
führt für jedes Element (die Zahlen in Fadenform) , um den Block-
i'!t
wandelt die Zahl auf ganzzahlige und setzt in dieser Position in der vorherige Zeichenfolge , die die Position (ursprünglich 40 Plätze ) zu '!'Zu diesem Zeitpunkt haben wir die erste Zeile erhalten.
{…}39*
Führt den Block 39 Mal aus-
N
fügt eine neue Zeile hinzu- erstellt
40,
das Array [0 1… 39]-
S3$S++
kopiert die vorherige Zeile (Position 3 auf dem Stapel) und füllt sie mit einem Leerzeichen auf jeder Seite auf-
f{…}
führt den Block für {jede Zahl von 0 aus bis 39} und {die gepolsterte Zeile}-
>3<
Nimmt einen Teil von 3 Elementen aus der gepolsterten Zeile, beginnend mit der aktuellen Nummer-
2b
konvertiert von Basis 2; Die Elemente, die wir in Scheiben schneiden, sind keine Ziffern zur Basis 2, aber Zeichen werden in ihre ASCII-Werte konvertiert und '' mod 8 ist 0 und '!' mod 8 ist 1-
137Yb
wandelt 137 in Basis 2 (Y
= 2) um und erhält [1 0 0 0 1 0 0 1], das 110 invertiert und negiert ist (auf 8 Bits)-
='!^
erhält die entsprechende Basis-2-Ziffer (die Das Array wird umbrochen, sodass der Index in Mod 8 aufgenommen wird. Zeichen, was zu '!' für 0 und '' für 1quelle
Ruby, 113 Zeichen
Übernimmt die Eingabe für stdin. Wenn Sie eine andere Regel verwenden
110
möchten , ersetzen Sie einfach die in der letzten Zeile angegebene Regel durch die gewünschte Regel.Beispiel:
quelle
Mathematica, 122 Bytes
Ja, Sie könnten dies als Missbrauch dieser Lücke ansehen , aber a) diese Lücke ist ziemlich umstritten, b) eine Frage zum Zellularautomaten benötigt eine Mathematica-Antwort (insbesondere eine zu Regel 110) und c) Venteros Ruby-Antwort ist sowieso kürzer, also ziehe ich sie an Ich glaube nicht, dass irgendein Schaden angerichtet wird.
Die meisten Zeichen werden zum Parsen und Formatieren von Eingaben verwendet. Der tatsächliche Automat wird mit simuliert
Hierbei werden periodische Randbedingungen verwendet (das Raster wird also umbrochen).
quelle
Python - 141
Laufen Sie als zB
python 110.py <<< 38,39
quelle
['X',' ']
könnte geändert werden'X '
, um 5 Zeichen zu speichern.o=range()
q,
67,6258 BytesVorausgesetzt, kein Wrap-Around:
Alte Version
quelle
Python, 186
Ordentlich, aber wahrscheinlich nicht optimal.
Sie haben nicht angegeben, wie die Eingabe erfolgt, also habe ich gerade eine Funktion erstellt.
Anwendungsbeispiel:
Ausgabe:
quelle
Mathematica, 113 Zeichen
Eine andere Mathematica-Antwort mit
CellularAutomaton
.quelle
" "["X"][[#]]&
?" "["X"][[1]]
ist"X"
." "["X"][[0]]
gibt den Kopf von" "["X"]
nämlich zurück" "
.C - 178
Dieser Code hängt von der Tatsache ab, dass jede Zeile in einer Matrix in einem zusammenhängenden Speicher gespeichert ist. Außerdem wird nicht die erste Zeile, sondern die nächsten 40 gedruckt, da in den Regeln nur ein Raster von 40 x 40 angegeben wurde.
Nur zur besseren Lesbarkeit eingerückt, enthält die Byteanzahl nur den erforderlichen Code.
quelle
Lua - 351
Nicht die ideale Sprache zum Golfen.
quelle
do u(n,i,'x')
das ist beabsichtigt, nicht wahr?Haskell ,
175 170 169 136 127124 Bytes−9 Bytes dank @bmo
Probieren Sie es online!
quelle
Haskell ,
135 131130 Bytes-1 Byte dank Ørjan Johansen (Neuordnung
take 40
)Völlig andere Herangehensweise an die Antwort von FrownyFrog, aber ungefähr gleich lang:
Erläuterung
r
zipWith3
(?)
Der
(?)
Operator ist der interessanteste Teil der Lösung: Früher habe ich eine Boolesche Regel verwendet, die mit einer Karnaugh-Karte generiert wurde, aber es stellt sich heraus, dass es einen noch präziseren Weg gibt:quelle
take 40$
davor setzenmap(" o"!!)<$>
.Schale ,
3128 BytesHah, Husk schlägt Jelly!
Probieren Sie es online!
Erklärung & Ungolfed
Bevor ich eine Erklärung hinzufüge, lassen Sie mich dies ein wenig aufheben. Entfernen wir zuerst die verschiedenen Kompositionen, fügen explizite Klammern hinzu und dekomprimieren die
¨↑¨
Zeichenfolge. Auch lassen sie ersetzen40
mit4
für eine besser lesbare Erklärung:quelle
Java, 321 Zeichen
Die Eingabe wurde beispielsweise als Argument von der Befehlszeile übergeben
java R 38,39
Ich habe noch nie mehr verschleierten Java-Code geschrieben :-)
quelle
Update: Richtiges Ausgabebeispiel hier (mit 40 Zeilen statt 50): Neue Ausgabe unten (vorherige aus Gründen der Kürze entfernt):
Bei einem weiteren Rätsel habe ich etwas Interessantes über das Verschachteln von Anweisungen in for-Schleifen in PHP gelernt, und plötzlich sind sie weitaus komplexer als ich ursprünglich dachte. Wenn ich Zeit habe, schätze ich, kann ich diese Punktzahl deutlich übertreffen. Vorerst bleibt es jedoch unverändert bei einem nicht wettbewerbsfähigen Wert von 408.
Meine PHP-Version 408 Zeichen:
Das war ein tolles Rätsel. Ich habe auch ewig mit den Eingaben gespielt, da dies faszinierende Dinge sind, die gesagt werden müssen. Wie auch immer, hier ist meine PHP-Version (die bei weitem nicht so gut ist wie einige der Antworten, aber vollständig ist. In Position 0 nur oben und oben rechts, in Position 39 nur oben und oben links, dh ohne Zeilenumbruch. Also hier ist meine Version:
Sie können es hier sehen und ausführen: http://codepad.org/3905T8i8
Eingabe ist eine Eingabezeichenfolge am Anfang als $ a = '38, 39 ';
Die Ausgabe ist wie folgt:
Hoffe du magst es!!!
PS Ich musste dem Code ein paar Zeilenumbrüche hinzufügen, damit Sie alles sehen und nicht mit einer Bildlaufleiste über die Seite strecken können.
quelle
Stax , 24 Bytes CP437
Online ausführen und debuggen!
Verwendet den Codepunkt 1 in CP437 für "1" -Zellen.
Hervorragender Fall, um die Kraft dieser Sprache zu zeigen.
Erläuterung
Verwendet die entpackte Version (29 Bytes), um zu erklären.
quelle
K (ngn / k) ,
44 bis35 BytesProbieren Sie es online!
{
}
Funktion mit Argumentx
!40
Liste der Ints von 0 bis 39x?
Finden Sie ihre Indizes inx
, verwenden Sie0N
(die "Ganzzahl Null") für nicht gefunden^
Welche von ihnen sind Nullen? Dies gibt uns die Eingabe, negiert39{
}\
Wende es 39 Mal an und sammle Zwischenergebnisse in einer Liste1,x,1
Umgeben Sie die Liste mit 1s (negierte 0s)3'
Dreifache Anzahl aufeinanderfolgender Elemente2/'
jeweils binär decodieren@
Verwendung als Indizes in ...2\145
Binärkodierung 145 (negierte Bits von 110)"X "
Verwenden Sie schließlich die 40x40-Matrix als Indizes in der Zeichenfolge"X "
(das@
hier ist implizit)quelle
Gelee , 29 Bytes
Probieren Sie es online!
quelle