Es ist allgemein bekannt, dass eine Person, die unter dem Einfluss von Alkohol am Netz steht, die gleiche Chance hat, in eine beliebige Richtung zu gehen. Diese Erklärung des gesunden Menschenverstands gilt jedoch nicht für sehr kleine Betrunkene, deren Verhalten so ist, als würden sie jeden verfügbaren Weg auf einmal gehen, und die möglichen Wege, die sie einschlagen, können sich gegenseitig stören. Ihre Aufgabe ist es, die möglichen Positionen eines solchen Quantentrinkers nach n
Schritten anzuzeigen .
Spezifikation
Der betreffende Betrunkene nimmt ein quadratisches Gitter ein und kann als ein 3-Zustands-Zellularautomat betrachtet werden, der eine von Neumann-Nachbarschaft (plus-förmig) verwendet, die diesen einfachen Regeln folgt:
Empty
geht zu,Awake
wenn es genau an eins angrenztAwake
, und geht ansonsten zuEmpty
Awake
geht zuSleeping
Sleeping
geht zuSleeping
Der Ausgangszustand der Karte ist eine einzelne, Awake
die von einem unendlichen Feld von Empty
s umgeben ist.
Herausforderung
n
Erstellen Sie bei einer nichtnegativen Ganzzahl nach n
Schritten eine ASCII-Darstellung des Betrunkenen . Jeder Zustand sollte durch ein anderes Zeichen dargestellt werden, und Lösungen sollten angeben, welches Zeichen welchen Zustand bedeutet. Wenn Sie Leerzeichen verwenden Empty
, müssen Sie diese nicht am Ende einer Zeile einfügen.
Das ist Code-Golf , also gewinnt die kürzeste Antwort. Es gelten Standardlücken , führende und nachfolgende Leerzeichen sind zulässig, die Ausgabe von String-Arrays / 2D-Char-Arrays ist zulässig usw.
Beispiele
Diese Beispiele verwenden für
Empty
, @
für Awake
und #
für Sleeping
.
n=0
@
n = 1
@
@#@
@
n = 2
@
#
@###@
#
@
n = 3
@
@#@
@ # @
@#####@
@ # @
@#@
@
n=6
@
#
@###@
@#@
@ ### @
#@# # #@#
@###########@
#@# # #@#
@ ### @
@#@
@###@
#
@
n=10
@
#
@###@
@#@
###
# # #
#######
# ### #
@ ## ### ## @
#@# ### # ### #@#
@###################@
#@# ### # ### #@#
@ ## ### ## @
# ### #
#######
# # #
###
@#@
@###@
#
@
Interessante Anmerkung
Durch Nachschlagen der Sequenz der Anzahl der besetzten Zellen im OEIS stellte ich fest, dass der Quantentrinker isomorph zu der viel besser untersuchten Zahnstochersequenz ist . Wenn Sie dieses Wissen in ein besseres Golfspiel einfließen lassen, bin ich beeindruckt.
quelle
n=10
korrekt ist? Ich habe ein paar Ansätze ausprobiert und sie bekommen alle die gleiche (falsche) Antwort, deshalb möchte ich nur sichergehen. Es sieht ein bisschen anders aus, aber ich weiß es nicht.Antworten:
Wolfram Language (Mathematica) ,
9291 BytesEine perfekte Herausforderung, um Mathematics eingebaute Funktionen zu nutzen
CellularAutomaton
!Probieren Sie es online!
Leer = 0, Wach = 1, Schlafen = 2
Animation der ersten 256 Iterationen (weiß = leer, grau = wach, schwarz = schlafend):
Erläuterung
Führen Sie
CellularAutomaton
mit Spezifikationen ...Wenden Sie die totalistische 3-Farben-Regel 7049487784884 bei Von Neumann an.
Auf einem Brett mit einer 1 in der Mitte, mit einem Hintergrund von 0s ...
Wiederholungszeiten
<input>
({j#}
ergibt{{{#}}}
). Das Array wird automatisch erweitert, wenn eine Zelle außerhalb des Rahmens nicht mit dem Hintergrund identisch istDiese Regel kommt von der Basis-3 - Nummer
220221220221220221220221220
, das bedeutet „alles ändern1
oder2
zu2
, und ändern Sie0
zu ,1
wenn und nur wenn es eine ungerade Anzahl von1
s um ihn herum.“Drucken Sie das Array.
Semi-Proof von "'ungerade
1
s' ist gleichbedeutend mit 'genau eins1
'":Betrachten Sie dieses 5x5-Pixelraster. Weiß ist eine
0
oder eine2
Zelle (nicht wache Pixel) und Grau ist eine1
Zelle.Wenn eine
1
Zelle um drei0
Zellen erstellt wurde, muss das Raster folgendermaßen aussehen: Es hat drei1
s, die in einer U-Form (oder einer gedrehten Version) wie folgt angeordnet sind:Aufgrund der Selbstähnlichkeit dieses zellularen Automaten muss jedes Muster, das im zellularen Automaten erscheint, auf der Diagonale erscheinen (durch Induktion). Dieses Muster ist jedoch nicht diagonal symmetrisch. dh es kann nicht auf der Diagonale auftreten und kann nirgends auf dem zellularen Automaten erscheinen.
Wach / Schlaf sind gleichwertig
Beachten Sie, dass eine
0
Zelle nicht von genau einer oder drei2
Zellen und0
Ruhezellen umgeben sein kann, da dies bedeuten würde, dass die Zelle bei einigen vorherigen Schritten einen Nachbarn von einer oder drei1
Zellen hatte - und sich in eine1
bereits vorhandene Zelle verwandelt haben muss (Widerspruch). Daher ist es in Ordnung, die Unterscheidung zwischen1
und zu ignorieren2
und anzugeben, dass alle1
in1
und a0
in a geändert werden sollen ,1
wenn eine ungerade Anzahl von Nachbarn ungleich Null vorhanden ist.Der resultierende zellulare Automat ist in der Tat identisch mit dem Original, der einzige Unterschied besteht darin, dass es keinen Unterschied zwischen "wachen" und "schlafenden" Betrunkenen gibt. Dieses Muster ist in OEIS A169707 beschrieben .
Probieren Sie es online!
Nebeneinander Vergleich der ersten 16 Iterationen:
Das Hinzufügen von zwei aufeinanderfolgenden Iterationen ergibt ein Ergebnis, das den Herausforderungsspezifikationen (94 Bytes) folgt:
Probieren Sie es online!
quelle
Python 2 , 192 Bytes
Probieren Sie es online!
-17 Bytes dank Mr. Xcoder
-9 Bytes mit Jonathans Ausgabeformat
-11 Bytes dank Lynn
-3 Bytes dank Ovs
quelle
exec
9 und…for k in 0,1,2,3for…
ein weiteres Byte gespeichert: Linkn=[C+k for k in-1j,1j,-1,1for C in c]
ein Byte!X+Y*1jin
, dass ich nicht wirklich für möglich gehalten habe: PC
360354343319Zeilenumbrüche nach Nichtzeilen
#define
dienen nur der Darstellung, werden also nicht gezählt. Ich habe eine Wrapper-Funktion eingefügt, also −6 (313), wenn die Funktion nicht gezählt wird und Sie davon ausgehen, dass sien
von woanders stammt.q(10)
Ausgänge:Verwenden Sie
für leer,
"
zum Schlafen und!
für wach.Das funktioniert so:
A(i,b,e)
ist "∀i∀ [b, e).",B(b,e)
ist "∀r∀ [b, e) .∀c∀ [b, e)."Beachten Sie, dass die Karte nach n Generationen 2 n + 1 Quadrat hat.
Aufgrund der Symmetrie der Karte muss hier nur der untere rechte Quadrant simuliert werden. Daher weisen wir eine n + 1-Quadratmatrix mit 1 Zeile und Spalte Abstand für die spätere Nachbarn-Suche zu (also n + 2).
Wenn Sie mit
calloc
zuweisen, multiplizieren Sie gleichzeitig die Breite mit der Höhe und löschen Sie das Brett auf0
(leer).Wenn eine Zelle anhand ihrer Koordinaten (
C
undD
)W
nachgeschlagen wird, werden die Koordinaten automatisch anhand des Absolutwerts von Zeile und Spalte ( ) gespiegelt.Die Karte wird als Array von Paaren von Ganzzahlen gespeichert, die die aktuelle und vorherige Generation darstellen. Die fraglichen ganzen Zahlen sind
char
so, dass wir sie vermeiden könnensizeof
.Die Generation, nach der am häufigsten gesucht wurde (durch den Nachbarn-Test), ist die frühere Generation, daher wird sie im Paar auf Index 0 gesetzt, damit auf sie zugegriffen werden kann
*
.Bei jeder Generation (
g
) wird die aktuelle Generation mit einerB
Schleife über die vorherige Generation kopiert , dann wird die neue Generation aus der alten generiert.Jede Zelle wird mit
0
leer,1
wach und2
schlafend dargestellt. Das Zählen der Nachbarn war ursprünglich eine Berechnung der Anzahl der Bits, die in den unteren 4 Bits der Zelle gesetzt wurden, wenn die 4 Nachbarn als Flags (N
) verschoben und ODER-verknüpft wurden und16
zum Schlafen verwendet wurden. Aber mit der Beobachtung, dass eine ungerade Anzahl von Nachbarn genau einem Nachbarn entspricht, können wir mehrere Zeichen speichern, indem wir nur eine Maske mit 1 verwenden.Am Ende wird die Platine vollständig gedruckt, indem über den unteren rechten Quadranten mit demselben Absolutwertkoordinatentrick minus Auffüllung iteriert wird, sodass die äußere Auffüllung auf der Platine nicht gedruckt wird. Aus diesem Grund enthält die
B
Schleife auch eine öffnende geschweifte Klammer, da die äußere Schleife die zusätzliche Anweisung newline enthält.Die ASCII-Codes ordnen 0 + 32 (leer) einem Leerzeichen, 2 + 32 (schlafen) einem Leerzeichen
"
und 1 + 32 (wach) einem Leerzeichen zu!
.Alles in allem denke ich, dass dies ein überraschend lesbarer Golf ist, wegen der schönen Struktur des Problems.
quelle
putchar(10)
mitputs("")
&~
ist kein NAND, ich meinte, dass ich manchmal!(a &~ b)
in Begriffen denkea NAND (NOT b)
, obwohl in diesem Fall die Logik!
nicht die gleiche ist wie die bitweise,~
weil wir uns auf das0
oder das1
Ergebnis von verlassen!
.MATL , 39 Bytes
Dies wird angezeigt
Empty
als(Leerzeichen)
Awake
wie#
Sleeping
als!
.Probieren Sie es online! Sie können das Muster auchin ASCII- Grafik oder grafisch (geänderter Code) vergrößern .
Erläuterung
Der Code verwendet komplexe Zahlen
0
,1
,j
die drei Zustände darstellen: leer, wake, schlafen auf.quelle
Befunge,
384304 BytesProbieren Sie es online!
Das Problem beim Versuch, solche Dinge in Befunge zu implementieren, ist die begrenzte Speichergröße (2000 Byte für Daten und Code). Daher musste ich einen Algorithmus verwenden, der das richtige Zeichen für eine bestimmte Koordinate ohne Bezugnahme auf vorherige Berechnungen berechnet. Dies wird erreicht, indem rekursiv über alle möglichen Wege in die Vergangenheit geblickt wird, denen der Betrunkene bis zu diesem Punkt möglicherweise gefolgt ist.
Leider ist dies keine besonders effiziente Lösung. Es funktioniert, ist aber unglaublich langsam und wird umso langsamer, je größer der Wert von n ist . Während es also möglicherweise für n bis zu 127 (Befunges 7-Bit-Speicherzellenlimit) funktionieren könnte, verlieren Sie in der Praxis unweigerlich das Interesse, auf das Ergebnis zu warten. Bei TIO wird das 60-Sekunden-Timeout bei etwas höherem als etwa 6 (bestenfalls) erreicht. Ein Compiler wird viel besser, aber selbst dann würden Sie wahrscheinlich nicht viel höher als 10 gehen wollen.
Trotzdem dachte ich, dass es sich lohnt, es einzureichen, weil es eigentlich eine nette Demonstration einer rekursiven "Funktion" in Befunge ist.
quelle
Python 2 , 214 Bytes
Probieren Sie es online!
Erläuterung
Verwendet
0
fürempty
,1
fürsleeping
und2
fürawake
. Druckt eine Liste mit zweidimensionalen Zeichen (Strings mit einer Länge) aus.Definiert eine Funktion, die eine nicht negative Ganzzahl akzeptiert
n
. Schiebt den Zellularautomaten sukzessive vorwärts, bis der gewünschte Zustand erreicht ist. Schließlich wird eine Konvertierung zwischen den internen Ganzzahlwerten und den tatsächlichen Zeichen durchgeführt.quelle
Lua ,
251242239238 Bytes-8 Bytes durch Vereinfachung des Array-Initialisierers auf Kosten eines zusätzlichen führenden Leerzeichens.
-1 Byte durch Ändern
c=i==2+...and print(s)
inc=i~=2+...or print(s)
.-3 Bytes, indem Sie zuerst eine vollständige Zeichenfolge erstellen und am Ende einmal drucken.
-1 Byte Dank an Jonathan Frech durch Umschreiben
or(g(...)==1 and
alsor(1==g(...)and
.Probieren Sie es online!
Leer = Raum
Wach =
1
Schlafen =
0
Nimmt Eingaben von der Befehlszeile und druckt auf stdout.
Durch die Darstellung der Zustände wie
false
/nil
,1
und0
intern, Erkennung „leer“ braucht keinen Code und die „genau eine wach“ Überprüfung kann mit nur einer Zugabe erfolgen.quelle
or(g(...)==1 and
kann seinor(1==g(...)and
.APL (Dyalog) , 38 Bytes
Probieren Sie es online!
-4 Dank an Adám .
-8 danke an ngn .
quelle
Jelly ,
3929 BytesProbieren Sie es online!
Verwendet
0
,1
und2
zum leeren wach und schlafen. Die Fußzeile in den Link wandelt diese in,
@
und#
.ṬŒḄ
anstelle vonḤḶ=¹
.-
anstelle von1N
. Macht auch¤
unnötig.S
anstelle von+/
.Ḃ+Ḃ+
anstelle von%3=1+=1Ḥ$+
. Jetzt2
zum Schlafen statt3
.Erklärung kommt ...
quelle
APL (Dyalog Classic) , 38 Byte
Probieren Sie es online!
basierend auf Erik the Outgolfer's Lösung
⍪1
ist eine 1x1 Matrix mit 1⎕
ausgewertete Eingabe( )⍣⎕
so oft anwenden(⌽0,⍉)⍣4
Surround mit 0s, also 4 mal tun: transponieren (⍉
), 0s links addieren (0,
), horizontal umkehren (⌽
)g←3+/0,,∘0
Eine Funktion, die horizontale Tripel summiert, nennt man dasg
⍉∘g∘⍉
Eine Funktion, die vertikale Tripel summiert - das wirdg
umgesetzt2 | ⍉∘g∘⍉ + g←3+/0,,∘0
Summe der beiden Summen modulo 2⌈
je größer zwischen dem und ...2∘∧
das LCM von 2 und die ursprüngliche Matrix - dies macht 1s zu 2s, während 0s und 2s erhalten bleibenquelle
Perl 5 , 192 + 1 (
-n
) = 193 BytesProbieren Sie es online!
Verwendet 0 für leer, 1 für wach und 2 für schlafend.
quelle
Ruby ,
164153 BytesProbieren Sie es online!
Verwendet "" für Leer, "@" für Wach und "#" für Schlaf (wie im Beispiel). Ich könnte 6 Bytes einsparen, indem ich stattdessen Zahlen verwende, aber es sieht besser so aus.
quelle
Pip ,
6961 Bytes60 Byte Code, +1 für
-l
Flag.Dient
n
als Befehlszeilenargument. Verwendet0
für leer,1
für wach und2
zum Schlafen. (Um eine schönere ASCII-Grafik als in den Beispielen der Challenge zu erhalten, ersetzen Sie das Finaley
durch" @#"@y
.)Probieren Sie es online!
Erläuterung
Konfiguration:
Hauptschleife:
wo der Funktionskörper ist:
Nach der Schleife drucken wir einfach automatisch
y
. Das-l
Flag bedeutet, dass die verschachtelte Liste gedruckt wird, indem der Inhalt jeder Zeile verkettet und die Zeilen durch Zeilenumbrüche getrennt werden.quelle
Java (OpenJDK 8) , 220 Byte
Probieren Sie es online!
Hinweis: Das zurückgegebene Array enthält einen Rahmen oder
'\0'
Zeichen. Da das Flugzeug unendlich sein soll, wird nur grenzüberschreitend gearbeitet.Zeichenzuordnung:
(Leerzeichen)
=
0
Speichert
quelle
@
bemüht, meinen -check zu verbessern , und Sie haben den Schlüssel gefunden! Nett. Diechar
Sendung war ein totales Versehen von mir.Python,
199192 BytesDieser Code läuft sowohl auf Python 2 als auch auf Python 3, verwendet jedoch die beliebte Numpy-Bibliothek von Drittanbietern, um die Array-Verarbeitung durchzuführen.
print(f(6))
AusgängeWenn Sie schöner drucken möchten, können Sie dies folgendermaßen bezeichnen:
welche druckt mit den gleichen Zeichen wie in der Frage angegeben.
quelle
[e]ach state should be represented by a different character
(ich interpretiere escharacter
als tatsächliches ASCII-Zeichen und nicht als Ganzzahl).