Contexte
Oui, la physique des chaînes de bits est une chose réelle . L'idée est de construire une nouvelle théorie de la physique en utilisant uniquement des chaînes de bits qui évoluent sous une règle probabiliste ... ou quelque chose. Malgré la lecture de quelques articles à ce sujet, je suis toujours assez confus. Cependant, l'univers bitstring fait un joli petit golf de code.
Univers du programme
La physique des chaînes de bits se déroule dans un soi-disant univers de programme . À chaque étape de l'évolution de l'univers, il y a une liste finie L
de chaînes de bits d'une certaine longueur k
, en commençant par la liste à deux éléments [10,11]
où k = 2
. Un pas de temps est traité comme suit (en pseudocode de type Python).
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
Tous les choix aléatoires sont uniformément aléatoires et indépendants les uns des autres.
Exemple
Un exemple d'évolution de 4 étapes pourrait ressembler à ce qui suit. Commencez avec la liste initiale L
:
10
11
Nous choisissons au hasard A := 10
et B := 10
, qui sont la même ligne, ce qui signifie que nous devons étendre chaque chaîne L
avec un bit aléatoire:
101
110
Ensuite, nous choisissons A := 101
et B := 110
, et comme ils ne sont pas égaux, nous ajoutons leur XOR à L
:
101
110
011
Ensuite, nous choisissons A := 011
et B := 110
, et ajoutons à nouveau leur XOR:
101
110
011
101
Enfin, nous choisissons A := 101
(dernière ligne) et B := 101
(première ligne), qui sont égaux, nous étendons donc avec des bits aléatoires:
1010
1100
0111
1010
La tâche
Votre tâche consiste à prendre un entier non négatif t
en entrée, à simuler l'univers du programme pour les pas de t
temps et à retourner ou imprimer la liste résultante L
. Notez que cela t = 0
donne la liste initiale [10,11]
. Vous pouvez produire L
une liste de listes d'entiers, une liste de listes de valeurs booléennes ou une liste de chaînes; si la sortie passe à STDOUT, vous pouvez également imprimer les chaînes de bits une par ligne dans un format raisonnable. L'ordre des chaînes de bits est significatif; en particulier, la liste initiale ne peut pas être [11,10]
, [01,11]
ou quelque chose comme ça. Les fonctions et les programmes complets sont acceptables, les failles standard sont interdites et le nombre d'octets le plus bas l'emporte.
Réponses:
Pyth,
2726 octetsEssayez-le en ligne: Démonstration
Explication:
la source
xVFK
est équivalent àxMK
.xVFK
équivaut àxMCK
, même nombre d'octets.CJam,
42403837 octets1 octet enregistré par Sp3000.
Explication
Créez l'état initial sous forme de nombre en base 2:
Et puis effectuez la boucle principale et imprimez le résultat à la fin:
Testez-le ici.
la source
Julia,
141129 octetsRien d'intelligent. Crée une fonction sans nom qui accepte un entier en entrée et renvoie un tableau de tableaux. Pour l'appeler, donnez-lui un nom, par exemple
f=t->...
.Non golfé + explication:
Exemples:
Enregistré 12 octets grâce à ML!
la source
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
etB
séparément est en fait la même longueur que les assigner ensemble, donc j'ai laissé cette partie telle quelle. Merci encore pour votre suggestion!Python 2, 141
J'ai essayé quelques méthodes différentes, mais le meilleur que j'ai pu obtenir était relativement simple. Merci à @ Sp3000 pour environ 15 caractères (et pour m'avoir appris l'existence de
int.__xor__
).la source
Python 2,
127122En supposant que les chaînes de bits python du formulaire,
'0b1'
etc. sont OK:Seule une légère nuance est ici l'utilisation du fait que XOR (A, B) = 0 si A = B.
Merci à @ Sp300 pour avoir raccourci la
for
boucle de fermeturela source
Pyth, 34
Les utilisations réduisent pour appliquer chaque itération. Je vous expliquerai quand j'aurai fini de jouer au golf.
Essayez-le ici
la source
K,
465346 octetsUn bon morceau de la taille (environ 7 octets) de cela est dû au fait que K n'a pas d'
xor
opérateur, j'ai donc dû en implémenter un moi-même. À l'origine, j'ai utilisé une liste de chaînes, puis j'ai réalisé que c'était incroyablement stupide. Alors maintenant, je coupe à nouveau les 7 octets!Avant:
@JohnE a souligné dans les commentaires que l'état initial était censé être codé en dur, ce qui coûtait 7 octets supplémentaires. : /
la source
(1 0;1 1)
- votre programme l'accepte comme entrée.JavaScript ( ES6 ) 152
Une fonction, utilisant des chaînes (avec des nombres, elle devrait être plus courte, mais en javascript, les opérations binaires sont limitées à des entiers 32 bits).
Testez dans Firefox en utilisant l'extrait ci-dessous.
la source
K,
454138 octetsLa structure de ma réponse est assez similaire à celle de @ kirbyfan64sos, mais au lieu de chaînes, j'ai utilisé des vecteurs 1/0 et j'évite d'avoir besoin d'un conditionnel (
:[ ; ; ]
) en indexant plutôt dans une liste.Quelques runs:
Éditer:
Quatre octets enregistrés avec une manière plus compacte de construire l'univers initial:
Edit2:
J'ai oublié que "choisir" peut prendre une liste comme bon argument:
Je peux donc simplifier une partie de cela. À qui cela est dû, Kirby a eu cette astuce avant moi.
la source
Javascript,
241233 octetsC'est un peu long.
la source
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"))
produit la sortie souhaitée 3/5 du temps.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"))
fonctionne 90% du temps.T-SQL (2012+), 1019
Je suis vraiment désolé que ce soit loin d'être compétitif, mais pour être honnête, je ne pensais pas pouvoir le faire fonctionner et j'ai dû le poster une fois que je l'ai fait. J'ai essayé de jouer au golf un peu :)
Pour gérer les conversions binaires / entières, j'ai dû créer quelques fonctions scalaires (513 octets).
A
passe d'un entier à une chaîne de bits.B
fait l'inverse.Ensuite, il y a la procédure.
@C
est le nombre d'étapesDix mille itérations ont pris environ 2 minutes et ont renvoyé 9991 lignes
la source
Pyth - 37 octets
Évidemment, suit juste le pseudo-code. Peut probablement beaucoup jouer au golf.
Essayez-le ici en ligne .
la source
O2
au lieu deO1
.O1
vous donne un nombre aléatoire dans la plageU1 = [0]
.0
.Mathematica, 106 octets
la source
Perl, 102
Essayez- moi .
la source
R, 186
Rien de magique ici. Entrez la valeur de
t
dans la console R et exécutez le script. Il est difficile de "jouer au golf" avec le code R, mais voici une version plus lisible:la source
sample
à une variable. Par exemples=sample
, utilisez alors s plutôt que sample. Malheureusement, je pense que votre méthode d'ajout d'un bit aléatoire dans lelapply
se terminera par un échantillon aléatoire ajouté à tous les éléments de la liste.lapply(L,function(x)append(x,sample(0:1,1)))
semble fonctionner, mais à un coût. Vous pouvez vous remplaceras.numeric
par celui1*
qui devrait en récupérer.Rubis, 82
Assez simple. Comparé à d'autres langages non golfiques, ruby semble bien fonctionner avec sa grande bibliothèque standard.
Exemple de sortie pour t = 101010:
la source