Hintergrund
Ja, Bitstring-Physik ist eine echte Sache . Die Idee ist, eine neue Theorie der Physik zu konstruieren, die nur Bitketten verwendet, die sich unter einer Wahrscheinlichkeitsregel entwickeln ... oder so. Obwohl ich ein paar Artikel darüber gelesen habe, bin ich immer noch ziemlich verwirrt. Das Bitstring-Universum ist jedoch ein schönes kleines Codegolf.
Programmuniversum
Die Bitstring-Physik findet in einem sogenannten Programmuniversum statt . Bei jedem Schritt der Entwicklung des Universums gibt es eine endliche Liste L
von Bitfolgen mit einer gewissen Länge k
, beginnend mit der Zwei-Elemente-Liste, [10,11]
in der k = 2
. Ein Zeitschritt wird wie folgt verarbeitet (im Python-ähnlichen Pseudocode).
A := random element of L
B := random element of L
if A == B:
for each C in L:
append a random bit to C
else:
append the bitwise XOR of A and B to L
Alle Zufallsentscheidungen sind einheitlich zufällig und voneinander unabhängig.
Beispiel
Eine beispielhafte Entwicklung von 4 Schritten könnte wie folgt aussehen. Beginnen Sie mit der Anfangsliste L
:
10
11
Wir wählen zufällig A := 10
und B := 10
, welche die gleiche Zeile sind, was bedeutet, dass wir jeden String L
mit einem zufälligen Bit erweitern müssen:
101
110
Als nächstes wählen wir A := 101
und B := 110
, und da sie nicht gleich sind, fügen wir ihre XOR hinzu zu L
:
101
110
011
Dann wählen wir A := 011
und B := 110
und hängen wieder ihre XOR an:
101
110
011
101
Schließlich wählen wir A := 101
(letzte Reihe) und B := 101
(erste Reihe), die gleich sind, also erweitern wir mit zufälligen Bits:
1010
1100
0111
1010
Die Aufgabe
Ihre Aufgabe ist es, eine nichtnegative Ganzzahl t
als Eingabe zu verwenden, das Programmuniversum für t
Zeitschritte zu simulieren und die resultierende Liste zurückzugeben oder auszudrucken L
. Beachten Sie, dass t = 0
sich die ursprüngliche Liste ergibt [10,11]
. Sie können L
eine Liste mit ganzen Zahlen, Listen mit booleschen Werten oder eine Liste mit Zeichenfolgen ausgeben . Wenn die Ausgabe an STDOUT geht, können Sie die Bitstrings auch einzeln pro Zeile in einem angemessenen Format drucken. Die Reihenfolge der Bitfolgen ist signifikant; insbesondere kann die erste Liste nicht sein [11,10]
, [01,11]
oder so etwas. Sowohl Funktionen als auch vollständige Programme sind akzeptabel, Standardlücken sind nicht zulässig, und die niedrigste Bytezahl gewinnt.
Antworten:
Pyth,
2726 BytesProbieren Sie es online aus: Demonstration
Erläuterung:
quelle
xVFK
ist äquivalent zuxMK
.xVFK
entspricht derxMCK
gleichen Byteanzahl .CJam,
42403837 Bytes1 Byte von Sp3000 gespeichert.
Erläuterung
Erstellen Sie den Anfangszustand als Basis-2-Zahl:
Führen Sie dann die Hauptschleife aus und drucken Sie das Ergebnis am Ende hübsch aus:
Teste es hier.
quelle
Julia,
141129 BytesNichts Schlaues. Erstellt eine unbenannte Funktion, die eine Ganzzahl als Eingabe akzeptiert und ein Array von Arrays zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=t->...
.Ungolfed + Erklärung:
Beispiele:
12 Bytes gespart dank ML!
quelle
A=something;B=something else to A,B=something,something else
:t->(L=Any[[1,0],[1,1]];for i=1:t r=1:length(L);A,B=L[rand(r)],L[rand(r)];A==B?(for j=r L[j]=[L[j],rand(0:1)]end):(push!(L,A$B))end;L)
A
undB
getrennt ist eigentlich die gleiche Länge wie Zuweisen, also habe ich diesen Teil so belassen, wie er ist. Nochmals vielen Dank für Ihren Vorschlag!Python 2, 141
Ich habe ein paar verschiedene Methoden ausprobiert, aber das Beste, was ich bekommen konnte, war relativ unkompliziert. Vielen Dank an @ Sp3000 für ungefähr 15 Zeichen (und dafür, dass Sie mir die Existenz von beigebracht haben
int.__xor__
).quelle
Python 2,
127122Vorausgesetzt, Python-Bit-Strings des Formulars
'0b1'
usw. sind in Ordnung:Die Tatsache, dass XOR (A, B) = 0 ist, wenn A = B, wird hier nur in einer milden Nuance verwendet.
Dank @ SP300 zur Verkürzung der umschließenden
for
Schleifequelle
Pyth, 34
Die Verwendung wird reduziert, um jede Iteration anzuwenden. Ich erkläre, wenn ich mit dem Golfen fertig bin.
Probieren Sie es hier aus
quelle
K,
465346 BytesEin guter Teil der Größe (ungefähr 7 Bytes) davon hat damit zu tun, dass K keinen
xor
Operator hat, also musste ich selbst einen implementieren. Ursprünglich habe ich eine Liste von Zeichenfolgen verwendet, gefolgt von der Erkenntnis, dass das wahnsinnig dumm war. Also habe ich jetzt die 7 Bytes wieder abgeschnitten!Vor:
@JohnE wies in den Kommentaren darauf hin, dass der Anfangszustand fest codiert werden sollte, was 7 zusätzliche Bytes kostete. : /
quelle
(1 0;1 1)
- Ihr Programm akzeptiert dies als Eingabe.JavaScript ( ES6 ) 152
Eine Funktion, die Zeichenfolgen verwendet (bei Zahlen sollte sie kürzer sein, bei Javascript sind die Bitoperationen jedoch auf 32-Bit-Ganzzahlen beschränkt).
Testen Sie in Firefox mit dem folgenden Snippet.
quelle
K,
454138 BytesDie Struktur meiner Antwort ist der von @ kirbyfan64sos ziemlich ähnlich, aber anstelle von Strings habe ich 1/0 Vektoren verwendet und ich vermeide die Notwendigkeit eines conditional (
:[ ; ; ]
), indem ich stattdessen in eine Liste indexiere .Ein paar Läufe:
Bearbeiten:
Vier Bytes mit einer kompakteren Methode zum Erstellen des anfänglichen Universums gespart:
Edit2:
Ich habe vergessen, dass "select" eine Liste als richtiges Argument verwenden kann:
So kann ich einen Teil davon vereinfachen. Gut, wo es fällig ist, hat Kirby diesen Trick vor mir bekommen.
quelle
Javascript,
241233 BytesDas ist ziemlich lang.
quelle
for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{for(h=0,g=[];h<d.length;)g.push(d[h]^e[h++]);a.push(g)}}alert(a.join("\n"))
Erzeugt die gewünschte Ausgabe 3/5 der Zeit.for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{g=[];for(h=0;h<d.length;h++)g.push(d[h]^e[h]);a.push(g)}}alert(a.join("\n"))
90% der Zeit.T-SQL (2012+), 1019
Es tut mir wirklich leid, dass dies bei weitem nicht wettbewerbsfähig ist, aber um ehrlich zu sein, ich hätte nicht gedacht, dass ich das zum Laufen bringen könnte, und musste es veröffentlichen, sobald ich es getan habe. Ich habe versucht, ein bisschen Golf zu spielen :)
Um die Binär / Ganzzahl-Konvertierungen zu handhaben, musste ich ein paar Skalarfunktionen erstellen (513 der Bytes).
A
Geht von Integer zu einer Bitfolge.B
macht das Gegenteil.Dann gibt es das Verfahren.
@C
ist die Anzahl der SchritteZehntausend Iterationen dauerten ungefähr 2 Minuten und ergaben 9991 Zeilen
quelle
Pyth - 37 Bytes
Offensichtlich folgt nur psuedocode. Kann wahrscheinlich viel Golf spielen.
Probieren Sie es hier online .
quelle
O2
stattO1
.O1
gibt Ihnen eine Zufallszahl aus dem BereichU1 = [0]
.0
.Mathematica, 106 Bytes
quelle
Perl, 102
Versuch es mit mir .
quelle
R 186
Nichts magisches hier. Geben Sie den Wert für
t
in die R-Konsole ein und führen Sie das Skript aus. Es ist schwer, R-Code zu "golfen", aber hier ist eine besser lesbare Version:quelle
sample
eine Variable zuweisen .s=sample
Verwenden Sie dann z. B. s anstelle von sample. Leider denke ich, dass Ihre Methode zum Anhängen eines Zufallsbits imlapply
zu allen Elementen in der Liste eine Zufallsstichprobe hinzufügt.lapply(L,function(x)append(x,sample(0:1,1)))
scheint zu funktionieren, aber zu einem Preis. Sie können Sie ersetzen,as.numeric
mit1*
denen Sie etwas zurückbekommen sollten.Rubin, 82
Ziemlich direkt. Ruby scheint mit seiner großen Standardbibliothek im Vergleich zu anderen Nicht-Golf-Sprachen gut abzuschneiden.
Beispielausgabe für t = 101010:
quelle