introduction
Dans ce défi, nous simulerons un certain automate cellulaire probabiliste utilisant de très mauvais nombres pseudo-aléatoires. L'automate cellulaire est défini sur des chaînes binaires par la règle locale suivante. Supposons que le voisin gauche d'une cellule et la cellule elle-même aient des états a
et b
.
- Si
min(a,b) == 0
, alors le nouvel état deb
estmax(a,b)
. - Si
min(a,b) == 1
, alors le nouvel état deb
est choisi aléatoirement{0,1}
.
L'image suivante montre une évolution possible en 10 étapes d'un seul 1
.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Notez comment deux 1
s adjacents évoluent parfois vers 1
, et parfois vers 0
, et les bits les plus à la frontière sont toujours 1
s. Votre tâche est de produire une évolution automate cellulaire de cette forme.
Contributions
Vos entrées sont un entier positif n
, indiquant le nombre de lignes à afficher, et une liste non vide de bits L
, que nous utilisons comme source de hasard.
Production
Votre sortie est une liste de listes ou un tableau 2D de bits, décrivant l'évolution d'un seul 1
pour les n
pas de temps, comme dans la figure ci-dessus. Vous pouvez remplir la sortie avec 0
s pour obtenir des lignes de longueurs égales, si vous le souhaitez, mais il ne doit pas y avoir de 0
s en tête .
Les choix aléatoires dans l'automate cellulaire doivent être tirés de la liste L
, en remontant au début quand il est épuisé. Plus explicitement, si la sortie est parcourue une ligne à la fois de haut en bas, de gauche à droite, les choix aléatoires successifs formeront la liste L
répétée autant de fois que nécessaire.
Exemple
Supposons que les entrées soient n = 7
et L = [0,1,0]
. Ensuite, l'automate cellulaire évolue comme suit au cours des 7 étapes, où nous avons mis un v
droit au-dessus de chaque choix aléatoire:
[1]
[1,1]
v
[1,0,1]
[1,1,1,1]
v v v
[1,1,0,0,1]
v
[1,1,1,0,1,1]
v v v
[1,0,0,1,1,1,1]
Si nous lisons tous les bits marqués d'un v
, nous obtenons 01001001
, qui est L
répété 2,66 fois. Le bit aléatoire suivant serait 0
.
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites. Le format exact des entrées et sorties est sans importance (dans des limites raisonnables).
Cas de test
Version déterministe, chaque bit aléatoire est 0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
Chaque bit aléatoire est 1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
Versions pseudo-aléatoires:
Inputs: 10 [0,0,1]
Output:
1
11
101
1111
10101
111111
1010011
11110101
101011111
1111101001
Inputs: 10 [1,0,0,1]
Output:
1
11
111
1001
11011
111111
1001101
11010111
111111101
1011001111
Inputs: 15 [1,1,1,0,0,0]
Output:
1
11
111
1111
10001
110011
1110111
11011001
111111011
1100011111
11100100011
111101100101
1001111101111
11011000111111
101101001011101
min(a,b)
para+b>1
etmax(a,b)
aveca+b
? Je me rends compte que vous auriez probablement à faire quelque chose pour gérer le tout premier cas de1
->11
(je pense que vous pourriez faireL=[1]+f()...
, ou trouver un moyen d'insérer 1 à l'avantL
car cela ferait toujours apparaître 1 pour la deuxième ligne)r[x-1]&r[x] else
:)MATLAB,
146143138(Fonctionne également sur Octave en ligne, mais vous devez vous connecter pour enregistrer la fonction dans un fichier).
La fonction prend une entrée
n
etL
, et retourne un tableauo
qui contient la sortie.Pour les valeurs d'entrée,
n
est un scalaire etL
un vecteur de colonne, qui peut être spécifié dans le format[;;;]
. Pas tout à fait ce que vous montrez, mais vous dites qu'il est flexible dans des limites raisonnables et cela semble être le cas.La sortie est formatée comme un
n x n
tableau contenant des 0 et des 1.Et une explication:
Mise à jour: j'ai réussi à optimiser la déclaration if-else pour économiser quelques octets. Le format d'entrée est redevenu vecteur de colonne.
la source
Haskell,
153149 octets%
renvoie une liste de listes de bits. Exemple d'utilisation:Oh cher! Porter la liste aléatoire
L
est une pure douleur. Voyons voir si cela peut être plus court.la source
C #, 152 octets
Il n'y a rien de spécial ici. La fonction renvoie un tableau 2D où le premier rang est la ligne et le second la colonne.
Nouvelles lignes en retrait pour plus de clarté:
la source
TI-BASIC,
10694878687 octetsTI-BASIC n'a pas d'opérateur d'incrémentation, non? Eh bien, en quelque sorte. La variable d'équation
u
, normalement utilisée avec les séquences, a une caractéristique obscure: lorsqueu
est appelée avec un argument, la variable𝑛
est définie sur un supérieur à cet argument. L'incrément conditionnel en dépend. (J'attends de l'utiliser depuis longtemps.)Pour que l'indexation de liste fonctionne correctement,
𝑛
sa valeur par défaut doit être 0 et𝑛Min
sa valeur par défaut 1, donc effacez la RAM de votre calculatrice ou définissez ces valeurs manuellement avant d'exécuter cela.augment({0},Ans)+augment(Ans,{0
calcule une liste de sommes de deux éléments adjacents, il renvoie donc une liste de 0, 1 et 2. Ensuite, la magie est sur cette ligne:Le résultat de cette ligne sera que les éléments de liste sont 0 s'ils étaient 0 ou s'ils étaient 2 et le bit lu était 0.
Cas de test:
la source