Imaginez un "fil" qui a des n
espaces. Imaginez de plus qu'il y a des "électrons" dans ce fil. Ces électrons ne vivent que pour une unité de temps. Tous les espaces dans le fil qui sont adjacents à exactement un électron deviennent un électron. Dans la terminologie de Game of Life, c'est B1/S
.
Par exemple, il s’agit d’un fil de longueur 10, de période 62.
Règles
- L'entrée,
n
est un seul entier positif. - La sortie doit être un entier indiquant la période d’un fil de longueur n.
- L'état de départ est un seul électron à une extrémité du fil.
- La période n'inclut pas nécessairement l'état de départ. Certaines longueurs ne reviennent jamais à l'état de départ, mais elles sont toutes périodiques.
- Un fil statique (c'est-à-dire sans électrons) a la période 1.
- Les conditions aux limites ne sont pas périodiques. C'est-à-dire que le fil n'est en aucun cas toroïdal.
Cas de test
Un merci spécial à Orlp pour la production de cette liste. (Je l'ai vérifié jusqu'à n = 27.)
1 1
2 2
3 1
4 6
5 4
6 14
7 1
8 14
9 12
10 62
11 8
12 126
13 28
14 30
15 1
16 30
17 28
18 1022
19 24
20 126
21 124
22 4094
23 16
24 2046
25 252
26 1022
27 56
28 32766
29 60
30 62
31 1
32 62
33 60
34 8190
35 56
36 174762
37 2044
38 8190
39 48
40 2046
41 252
42 254
43 248
44 8190
45 8188
Vous pouvez voir des scénarios de test pour n = 2 à 21 ici avec mon simulateur Game-of-Life-esque: Variations of Life .
EDIT: la séquence ici a été publiée sous le numéro A268754 !
code-golf
cellular-automata
El'endia Starman
la source
la source
2^n-1
, car c'est le nombre d'états non nuls possibles du "fil"The period does not necessarily include the starting state. Some lengths never return to the starting state, but all of them are periodic.
Avez-vous un exemple?Réponses:
Python 2,
14814287 octetsUtilise l'algorithme de détection de cycle de Brent et fonctionne donc rapidement.
J'ai également écrit une animation en Python (travaux 2 et 3). Il faut
pyglet
courir. Vous pouvez voir l'animation en lançant:(N'hésitez pas à télécharger le résumé et à inspecter le code avant d'exécuter.) Vous pouvez appuyer sur les touches + et - pour augmenter / diminuer le n en cours de visualisation.
Et enfin, pour ceux intéressés à explorer davantage cette séquence de numéros, voici une version lisible (utilisée pour générer les cas de test ci-dessus):
la source
Mathematica, 127 octets
Explication
Règle 18 :
Cas de test
la source
Python 2, 68 octets
La détection de cycle pourrait être meilleure, mais l'étape itérative est agréable.
En représentant le tableau sous forme de nombre binaire
k
, la mise à jour peut être effectuée en prenant le XOR dek
décalage avec un gauche/2
et un droit avec*2
, puis en tronquantn
octets comme%2**n
.la source
Python
32,134121118 octetsFondamentalement identique à ma réponse Pyth , mais quelque peu adapté en raison du manque de certaines fonctions intégrées dans Python.
Version non-golfée:
la source
Pyth,
3936 octetsUtilise la fonction "cumulative fixed-point" pour effectuer une itération jusque juste avant qu'une configuration ne se reproduise, et renvoie toutes les configurations intermédiaires sous forme de liste de listes. Cela fonctionne parce que les règles sont déterministes et que la configuration de la génération suivante est fonction de la configuration actuelle. Cela signifie qu'une fois la même configuration réapparue, les automates ont terminé un cycle.
Après avoir atteint cela (la dernière itération du cycle), il appelle la fonction next-gen une dernière fois sur le dernier élément de la liste "historique" pour obtenir la configuration suivante (qui est la configuration de départ d'un cycle), et trouve son index dans l'historique. Maintenant, la période est simplement la longueur (1 + indice de fin de cycle) moins l'indice de début de cycle.
En pseudocode pythonique:
La suite de tests prend trop de temps à tuer par le serveur. Vous devez donc utiliser le programme standard et le tester un par un, ou installer Pyth (si ce n’est pas déjà le cas) et utiliser un script pour le tester.
la source
Jelly,
191817 octetsCe code calcule les premiers 2 n états, il est donc pas particulièrement rapide ou efficace de la mémoire ...
Essayez-le en ligne! ou vérifiez les 16 premiers cas de test .
Version alternative, 13 octets (non concurrente)
Les versions de Jelly postérieures à ce défi comportent une détection de boucle intégrée, ce qui permet une solution à la fois plus courte et plus efficace.
Cela gère facilement le dernier cas de test. Essayez-le en ligne!
Comment ça fonctionne
Notez que le lien d'assistance est appliqué à 2 n lors de la première itération, ce qui ne code pas un état valide. Cependant, ((2 n ÷ 2) ^ (2 n × 2))% 2 n = (2 n - 1 + 2 n + 1 )% 2 n = 2 n - 1 , qui est l'un des états de départ possibles.
Puisque nous bouclons 2 n + 1 fois, nous sommes assurés de rencontrer un état deux fois, ce qui rend la détection de boucle réussie.
la source
CJam,
4134312725 octetsMerci à Dennis d'avoir économisé 3 octets. Emprunter une idée de sa réponse sur Jelly en a sauvé 4 autres.
Testez-le ici.
Explication
Je représente le fil simplement comme un entier (dont les bits indiquent les positions des électrons) au lieu d'utiliser une liste de bits. L'état est mis à jour via des calculs au niveau des bits assez simples.
Pour trouver la période, nous collectons tous les résultats intermédiaires sur la pile, exécutons la simulation pour 2 n-1 +1 étapes, puis déterminons la période comme le nombre d'éléments depuis la dernière occurrence de l'état final (plus 1).
Voici une ventilation du code:
la source
JavaScript (ES6) 99
104Tester
la source
Haskell, 170 octets
x!p
donne l’élément à l’indice p si dans les bornes, sinon 0.n
calcule l’étape suivante.g i
donne lei
th pas.c x
donne la période, si on commence parx
.f
enveloppe tout ensemble.(Remarque: posté à partir du téléphone qui a l'interprète câlins, qui n'est pas complet, peut avoir des fautes de frappe.)
la source
MATL ,
38373635 octetsCela utilise une boucle qui continue à calculer les nouveaux états jusqu'à ce que le nouvel état soit égal à l'un des précédents. Chaque état est un vecteur de zéros et de uns. Ces vecteurs sont stockés sous forme de lignes d'un tableau 2D en croissance.
Le calcul de chaque nouvel état est effectué en convertissant l'état actuel en convolution avec la séquence
[1,0,1]
, en ne conservant que la partie centrale et en définissant0
toute entrée qui ne l'est pas1
.EDIT (13 mai 2016) Le code dans le lien suivant a été légèrement modifié conformément aux modifications introduites dans la langue après la rédaction de cette réponse
Essayez-le en ligne!
la source
Perl 6, 81 octets
Élargi et ungolfé un peu
Un peu d'explication:
[op]
réduit la liste en utilisant op. Par exemple[+] @list
, la somme@list
R
est une méta-opération qui inverse les arguments donnés à un op. Par exemple, vous1 R- 3
obtiendrez 2.la source
C ++, 211 octets
Golfé
Avec des espaces ajoutés pour la lisibilité
Bonne pratique pour les bitset C ++; et une excellente éducation sur l'algorithme de détection de cycle de Brent (utilisé par @orlp)
la source
Pyth, 95 octets
Vous pouvez l'essayer ici .
la source
Pyth, 29 octets
Utilise l'algorithme
a(n+1) = ((a(n) << 1)^(a(n) >> 1)) % (2 ** N)
.la source
Ruby, 72 octets
Fonction anonyme.
la source