Contexte
Le Random Domino Automaton est un modèle de jouet pour les tremblements de terre, inspiré des automates cellulaires. Dans ce défi, votre tâche consiste à simuler une version simplifiée de ce modèle et à en collecter des données.
L'automate est défini sur un tableau A
de k
bits, représentant une ligne de faille sur laquelle des tremblements de terre peuvent se produire. Le tableau s'enroule autour de ses frontières. La condition A[i] = 0
signifie que la position i
est détendue et A[i] = 1
signifie qu'elle est excitée ou contient de l'énergie stockée. À chaque pas de temps, une position de la matrice est choisie uniformément au hasard. Si cette position est détendue, elle devient excitée (une énergie potentielle est ajoutée au système). Si cette position est déjà excitée, elle déclenche un tremblement de terre, et la position choisie et toutes les positions excitées qui y sont reliées sont à nouveau détendues. Le nombre de positions excitées qui se relâchent est la magnitude du tremblement de terre.
Exemple
Considérez le tableau
100101110111
de longueur 12. Si le processus aléatoire choisit le deuxième bit de gauche, le tableau est mis à jour pour
110101110111
^
puisque le bit choisi (marqué avec ^
) était 0
. Si nous choisissons ensuite le quatrième bit de gauche, qui est un bit isolé 1
, un tremblement de terre de magnitude 1 est déclenché et le bit est remis à 0
nouveau:
110001110111
^
Ensuite, nous pourrions choisir le deuxième bit de droite, ce qui déclenche un tremblement de terre de magnitude 5:
000001110000
^
Notez que tous les 1
s dans le même "cluster" que celui choisi faisaient partie du tremblement de terre, et le tableau s'enroule à la frontière.
La tâche
Vous devez prendre en entrée deux entiers positifs k
et t
, et votre tâche consiste à simuler l'automate domino aléatoire pour les t
pas de temps, à partir d'un k
tableau de longueur initial de tous les 0
s. Votre sortie doit être une liste L
d' k
entiers, où L[i]
(avec une indexation basée sur 1) contient le nombre de tremblements de terre de magnitude i
qui se sont produits pendant la simulation. Vous êtes autorisé à supprimer les zéros de fin de la sortie.
Pour les entrées k = 15
et t = 1000
, certaines sorties représentatives sont
[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]
Règles
Les programmes complets et les fonctions sont autorisés. Le nombre d'octets le plus court l'emporte et les failles standard sont interdites.
Notez que vous n'êtes pas obligé de simuler l'automate à l'aide d'une implémentation particulière, seule la sortie compte.
Réponses:
Pyth, 48 octets
J'ai été un peu inspiré par l'explication de @ Dennis. J'ai eu des pensées similaires hier, mais je ne les ai pas vraiment suivies.
Essayez-le en ligne: Démonstration
Explication:
la source
CJam,
5755 octetsIl s'agit d'une fonction anonyme qui extrait k et t de la pile ( k en haut de t ) et laisse le tableau souhaité en retour.
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
Python 2, 153 octets
Il s'avère que j'avais presque la même solution que Fry's , mais avec un peu plus de tripotage.
la source
randrange
, mais je ne savais pas que cela fonctionnait avec un seul argument. Bon travail!Java,
278272 octetsJava n'est pas le meilleur langage de golf, et je ne suis pas le meilleur golfeur, mais c'était très amusant d'écrire alors le voici! Faites-moi part des bugs et des améliorations! (J'ai décidé de soumettre à nouveau comme une simple fonction.)
Et le fichier avec des espaces et des commentaires:
la source
Alt+09
-le oud[q]+=1;
cela peut devenird[q]++;
vous pouvez incrémenter directement sur les tableaux au lieu d'utiliser + = partout. Cela devrait sauver un tas de personnages.for(;t>0;t--){
peut être changé enfor(;t-->0;){
: DPython 2,
174170Merci à @Vioz d'avoir trouvé un moyen plus court de faire
D
et de prouver à nouveau quenot
c'est généralement golfable. Et aussi pour avoir écrit l'explication.J'avais essayé de créer un programme similaire en Pyth, mais il semble y avoir un problème de portée dans ce que j'essayais de faire. Cela implémente assez naïvement les dominos et la fonction
U
propage les tremblements de terre. La direction de soustraction dansU
n'a pas besoin d'un mod car elle s'enroulera naturellement. Le dernier élément deE
compte le nombre de fois où un zéro est transformé en un, il n'est donc pas imprimé à la fin.Non golfé + Explication:
la source
D[r]=not e
enD[r]=e<1
sauvegarde 2 octets, etE=[0]*-~k
enE=D+[0]
sauvegarder 2 autres, pour vous ramener à 170.ES6,
224196189179172 172Les choses faciles ont été jouées au golf, mais il reste encore du travail à faire. Je vais taper une explication plus tard. Aussi, si quelqu'un peut me dire pourquoi le court
new Date%k
ne fonctionne plus si bien, ce serait bien.L'utilisation est
la source
new
. Vous n'avez pas besoin de celat
dans la boucle for, pas besoin de ces deux derniers;
a[r]^=1
fonctionnera si la valeur initiale est1
ou0
Perl, 212
La version précédente que j'avais mise en place n'était pas correctement encapsulée, et la mise en œuvre a demandé un certain travail.
Ce n'est probablement pas le bon algorithme pour cela, mais je ne peux pas penser en ce moment. La version non golfée est ci-dessous.
Non golfé:
la source
CJam, 76 octets
Eh bien, ce n'est pas très compétitif. Mais comme cela m'a pris assez de temps, j'ai pensé que je le publierais de toute façon.
Essayez-le en ligne
la source