Hintergrund
Der Random Domino Automaton ist ein Spielzeugmodell für Erdbeben, das von zellularen Automaten inspiriert wurde. In dieser Herausforderung besteht Ihre Aufgabe darin, eine vereinfachte Version dieses Modells zu simulieren und Daten daraus zu sammeln.
Der Automat ist auf einer Reihe A
von k
Bits definiert, die eine Fehlerlinie darstellen, auf der Erdbeben auftreten können. Das Array wird an den Rändern herumgewickelt. Die Bedingung A[i] = 0
bedeutet , dass Position i
ist entspannt , und A[i] = 1
bedeutet , dass es erregt , oder enthält Energie gespeichert. Zu jedem Zeitschritt wird eine Position des Arrays gleichmäßig zufällig ausgewählt. Wenn diese Position entspannt ist, wird sie angeregt (dem System wird potentielle Energie hinzugefügt). Wenn diese Position bereits angeregt ist, wird ein Erdbeben ausgelöst, und die ausgewählte Position und alle damit verbundenen angeregten Positionen werden wieder entspannt. Die Anzahl der angeregten Positionen, die sich entspannen, ist die Stärke des Erdbebens.
Beispiel
Betrachten Sie das Array
100101110111
der Länge 12. Wenn der Zufallsprozess das zweite Bit von links auswählt, wird das Array auf aktualisiert
110101110111
^
da das gewählte bit (markiert mit ^
) war 0
. Wenn wir als nächstes das vierte Bit von links auswählen, das ein isoliertes 1
Bit ist, wird ein Ohrbeben der Stärke 1 ausgelöst und das Bit 0
erneut auf gesetzt:
110001110111
^
Als nächstes können wir das zweite Bit von rechts auswählen, das ein Erdbeben der Stärke 5 auslöst:
000001110000
^
Beachten Sie, dass alle 1
s in demselben "Cluster" wie der ausgewählte Teil des Bebens waren und das Array an der Grenze herumläuft.
Die Aufgabe
Als Eingabe nehmen Sie zwei positive ganze Zahlen k
und t
, und Ihre Aufgabe ist es, den zufälligen t
Dominoautomaten k
für Zeitschritte zu simulieren , ausgehend von einem anfänglichen Längenarray aller 0
s. Ihre Ausgabe soll eine Liste L
von k
ganzen Zahlen sein, wobei L[i]
(mit 1-basierter Indizierung) die Anzahl der Erdbeben der Stärke enthält i
, die während der Simulation aufgetreten sind. Sie dürfen nachgestellte Nullen aus der Ausgabe entfernen.
Für die Eingänge k = 15
und t = 1000
sind einige repräsentative Ausgänge
[117, 97, 45, 26, 10, 5, 3, 1, 3, 0, 0, 0, 0, 0, 0]
[135, 91, 58, 21, 8, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0]
[142, 63, 51, 31, 17, 4, 2, 1, 1, 0, 0, 0, 0, 0, 0]
[106, 75, 45, 30, 16, 8, 5, 2, 2, 0, 0, 0, 0, 0, 0]
[111, 96, 61, 22, 3, 8, 3, 2, 0, 0, 0, 1, 0, 0, 0]
Regeln
Es sind sowohl vollständige Programme als auch Funktionen zulässig. Die kürzeste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Beachten Sie, dass Sie den Automaten nicht mit einer bestimmten Implementierung simulieren müssen, sondern nur die Ausgabe.
Antworten:
Pyth, 48 Bytes
Habe mich ein bisschen von @ Dennis 'Erklärung inspirieren lassen. Hatte gestern einige ähnliche Gedanken, folgte ihnen aber nicht wirklich.
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle
CJam,
5755 BytesDies ist eine anonyme Funktion, die k und t vom Stapel ( k über t ) abruft und das gewünschte Array zurücklässt.
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Python 2, 153 Bytes
Es stellte sich heraus, dass ich fast die gleiche Lösung hatte wie Fry's , aber mit ein bisschen mehr Fummelei.
quelle
randrange
, aber mir war nicht klar, dass es nur mit einem Argument funktionierte. Gute Arbeit!Java,
278272 BytesJava ist nicht die beste Golfsprache und ich bin nicht der beste Golfer, aber es hat sehr viel Spaß gemacht zu schreiben, also ist es hier! Informieren Sie mich über Bugs und Verbesserungen! (Ich habe mich entschieden, es nur als Funktion erneut einzureichen.)
Und die Datei mit Leerzeichen und Kommentaren:
quelle
Alt+09
oder tabuliere es in Notepad ++)d[q]+=1;
Dies kann dazu führen, dassd[q]++;
Sie direkt auf Arrays inkrementieren können, anstatt überall + = zu verwenden. Das sollte eine Menge Zeichen sparen.for(;t>0;t--){
kann geändert werden infor(;t-->0;){
: DPython 2,
174170Vielen Dank an @Vioz, dass Sie einen kürzeren Weg gefunden haben
D
, und erneut bewiesen haben, dassnot
das normalerweise golfen kann. Und auch zum Schreiben der Erklärung.Ich hatte versucht, ein ähnliches Programm in Pyth zu erstellen, aber es scheint ein Problem mit dem Umfang meiner Versuche zu geben. Das setzt die Dominosteine ziemlich naiv um und die Funktion
U
verbreitet Erdbeben. Die Subtraktionsrichtung inU
benötigt keinen Mod, da sie sich auf natürliche Weise ändert. Das letzte Element vonE
zählt, wie oft aus einer Null eine Eins wird, sodass es am Ende nicht gedruckt wird.Ungolfed + Erklärung:
quelle
D[r]=not e
umD[r]=e<1
2 Bytes zu speichern, undE=[0]*-~k
umE=D+[0]
weitere 2 zu speichern, um Sie auf 170 zu bringen.ES6,
224196189179172Das einfache Zeug wurde gespielt, aber es gibt noch einiges zu tun. Ich schreibe später eine Erklärung aus. Auch wenn mir jemand sagen kann, warum das kurze
new Date%k
Ding nicht mehr so gut funktioniert, wäre das großartig.Verwendung ist
quelle
new
. Das brauchst du nichtt
in der for-Schleife, die letzten beiden brauchst du nicht;
a[r]^=1
wird defs funktionieren, wenn der anfängliche Wert entweder1
oder ist0
Perl, 212
Die vorherige Version, die ich erstellt hatte, war nicht korrekt verpackt, und die Implementierung nahm einige Arbeit in Anspruch.
Dies ist wahrscheinlich nicht der richtige Algorithmus dafür, aber ich kann im Moment nicht denken. Die ungolfed Version ist unten.
Ungolfed:
quelle
CJam, 76 Bytes
Nun, das ist nicht sehr wettbewerbsfähig. Aber da ich lange genug gebraucht habe, dachte ich, ich würde es trotzdem posten.
Probieren Sie es online aus
quelle