Le mot de Fibonacci infini est une séquence infinie spécifique de chiffres binaires, qui sont calculés par concaténation répétée de mots binaires finis.
On définit qu'une séquence de mots de type Fibonacci (ou séquence FTW ) est une quelconque séquence ⟨W n ⟩ qui est formé comme suit.
Commencez avec deux tableaux arbitraires de chiffres binaires. Appelons ces tableaux W -1 et W 0 .
Pour chaque n> 0 , soit W n ≔ W n-1 ∥ W n-2 , où ∥ désigne la concaténation.
Une conséquence de la définition récursive est que W n est toujours un préfixe de W n + 1 et, par conséquent, de tout W k tel que k> n . Dans un sens, cela signifie que la séquence ⟨W n ⟩ converge vers un mot infini.
Formellement, soit W ∞ le seul tableau infini tel que W n soit un préfixe de W ∞ pour tout n ≥ 0 .
Nous appellerons tout mot infini formé par le processus ci-dessus un FTW infini .
Tâche
Écrivez un programme ou une fonction qui accepte deux mots binaires W -1 et W 0 en entrée et imprime W ∞ , en respectant les règles supplémentaires suivantes:
Vous pouvez accepter les mots dans n'importe quel ordre; comme deux tableaux, un tableau de tableaux, deux chaînes, un tableau de chaînes ou une seule chaîne avec un délimiteur de votre choix.
Vous pouvez imprimer les chiffres du mot infini sans délimiteur ou avec un délimiteur cohérent entre chaque paire de chiffres adjacents.
À toutes fins utiles, supposez que votre code ne manquera jamais de mémoire et que ses types de données ne débordent pas.
En particulier, cela signifie que toute sortie vers STDOUT ou STDERR résultant d'un plantage sera ignorée.
Si j'exécute votre code sur ma machine (Intel i7-3770, 16 Go de RAM, Fedora 21) pendant une minute et que je dirige sa sortie vers
wc -c
, il doit imprimer au moins un million de chiffres de W ∞ pour (W -1 , W 0 ) = (1, 0) .Les règles de code-golf standard s'appliquent.
Exemple
Soit W -1 = 1 et W 0 = 0 .
Alors W 1 = 01 , W 2 = 010 , W 3 = 01001 , W 4 = 01001010 … et W ∞ = 010010100100101001010… .
C'est le mot infini de Fibonacci.
Cas de test
Tous les cas de test contiennent les 1 000 premiers chiffres du FTW infini.
Input: 1 0
Output: 0100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001
Input: 0 01
Output: 0100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001
Input: 11 000
Output: 0001100000011000110000001100000011000110000001100011000000110000001100011000000110000001100011000000110001100000011000000110001100000011000110000001100000011000110000001100000011000110000001100011000000110000001100011000000110000001100011000000110001100000011000000110001100000011000110000001100000011000110000001100000011000110000001100011000000110000001100011000000110001100000011000000110001100000011000000110001100000011000110000001100000011000110000001100000011000110000001100011000000110000001100011000000110001100000011000000110001100000011000000110001100000011000110000001100000011000110000001100000011000110000001100011000000110000001100011000000110001100000011000000110001100000011000000110001100000011000110000001100000011000110000001100011000000110000001100011000000110000001100011000000110001100000011000000110001100000011000000110001100000011000110000001100000011000110000001100011000000110000001100011000000110000001100011000000110001100000011000000110001100000011000110000001100000011
Input: 10 010
Output: 0101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001001010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010010100101001001010010100100101001001010010100100101001010010010100100101001010010010100100101001010010010100101001001010010010100101001001010010100100101001001010
Input: 101 110
Output: 1101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101101011101011101101011101101011101011101101011101011101101011101
Réponses:
Pyth, 8 octets
Saisie dans le formulaire
"W-1", "W0"
.Preuve d'achèvement:
Preuve de correction:
Voici la série générée en interne. Il est imprimé en concaténation par le programme.
Comparez avec les éléments suivants, imprimés en concaténation, qui est simplement la chaîne ajoutée à la chaîne précédente à chaque étape:
Nous voulons prouver qu'ils sont équivalents.
De toute évidence, ils sont les mêmes lors des premières étapes. Comparons-les après un peu:
On voit que les paires de cordes sont alternativement des formes:
Où a et b sont des séquences arbitraires sur 0 et 1. Continuons un peu la séquence, pour prouver qu'elle se poursuit indéfiniment:
2 étapes plus tard, il est de la bonne forme.
2 étapes plus tard, il est de la bonne forme.
Ainsi, par induction, les chaînes correspondent toujours une fois concaténées.
la source
W0
mais au lieu d'imprimerW1
il imprimeW-1 || W0
, ce qui est de l'ordre de concaténation « mal ». Je pense que cela fonctionne pour être équivalent, mais je n'ai pas trouvé de preuve ...Haskell, 15 octets
La fonction infixe
%
produit une chaîne infinie, que Haskell imprime pour toujours car Haskell est cool comme ça.L'idée récursive est similaire à la solution de Zgarb . Écrivant
f
pour la fonction%
et+
pour la concaténation de chaînes, il implémente:La chaîne de sortie infinie commence par
w
, et le reste est le résultat des chaînes décalées de Fibonacciw
etv+w
.Cela n'a aucun problème à générer un million de caractères en une minute.
la source
Haskell, 31 octets
Cela définit une fonction infixe
#
qui prend deux chaînes et renvoie une chaîne infinie. Usage:Si je recherche le millionième élément de la séquence définie par "1" et "0", même l' interprète en ligne imprime le résultat en moins d'une seconde:
Explication
Fondamentalement, nous savons cela
w#v == v#(v++w)
etw#v
commençons parv
, et utilisons ces faits pour définir le résultat. Puisque Haskell est paresseux, cela fonctionne "par magie".la source
Pip, 8 octets
Hé, à égalité avec Pyth!
Définition récursive simple empruntée à la réponse Haskell de xnor . Avec des espaces ajoutés pour plus de clarté:
Chaque programme dans Pip est une fonction implicite qui prend les arguments de la ligne de commande comme arguments (affectés aux variables
a
viae
) et affiche sa valeur de retour.O
est un opérateur qui génère puis renvoie son opérande, donc la première chose qui se produit ici est le deuxième argument affiché (sans retour à la ligne).Maintenant, la syntaxe inspirée de Lisp
(f x y)
dans Pip est un appel de fonction, équivalent àf(x,y)
dans les langages de type C. Laf
variable fait référence à la fonction actuelle - dans ce cas, le programme de niveau supérieur. Ainsi, le programme s'appelle récursivement avecb
eta.b
comme les nouveaux arguments.J'ai été agréablement surpris de constater que cette approche est très rapide:
Il faut environ 30 secondes sur ma machine Ubuntu pour que le programme atteigne la profondeur de récursivité maximale, moment auquel il a imprimé quelque part plus d'un milliard de chiffres.
Cette solution itérative est légèrement plus rapide et monopolise moins de mémoire, au prix d'un octet:
la source
CJam,
1211 octetsCela prend les deux mots sur des lignes distinctes, dans l'ordre inverse, par exemple
donne
Explication
L'idée est de construire le mot naïvement (en se souvenant du mot actuel et en y ajoutant le précédent) et pendant que nous faisons cela, nous imprimons tout ce que nous venons d'ajouter (afin de ne pas répéter le préfixe déjà imprimé) . Pour éviter d'avoir à gérer le point de départ séparément, nous partons d'un mot vide, tel que W 0 est la première chose que nous ajoutons (et imprimons).
la source
PowerShell,
9776 octetsEdit - Umm, écrire juste
$e.substring($b.length)
après avoir concaténé$a
et$b
ensemble équivaut à écrire juste$a
... derp.Wow, verbeux. Par défaut, PowerShell crache une nouvelle ligne chaque fois que vous sortez quelque chose. Vraiment la seule façon de se déplacer c'est avec
write-host -n
(abréviation de-NoNewLine
), et cela tue absolument la longueur ici.Essentiellement, cela se répète à travers la séquence, en construisant
$e
comme le "courant" W n au fur et à mesure. Cependant, comme nous voulons construire le mot infini au lieu de la séquence, nous utilisons nos variables précédentes pour imprimer le suffixe$a
qui a été rempli dans notre boucle précédente. Ensuite, nous configurons nos variables pour le prochain tour et répétons la boucle. Notez que cela s'attend à ce que l'entrée soit explicitement délimitée sous forme de chaînes, sinon l'+
opérateur est utilisé pour l'arithmétique au lieu de la concaténation.Exemple:
la source
APL,
2418L' utilisation de la formulation de xnor a permis de raser quelques caractères.
Sur une machine infinie en un temps infini, elle afficherait en fait W ∞ trois fois - d'abord de manière incrémentielle lors de l'exécution de la boucle, puis deux fois en résultat de l'expression entière lorsque l'
⍣≡
opérateur fixpoint reviendra finalement.Ce n'est pas très rapide mais assez rapide. Dans GNU APL:
la source
⍣≡
; cela semble très utile.Pure bash, 58
Je manque de mémoire avant 1 minute, mais j'ai beaucoup de chiffres d'ici là - après 10 secondes, j'ai 100 millions de chiffres:
la source
Mathematica, 56 octets
la source
C, 76 (gcc)
Il s'agit d'une imprimante récursive assez simple, implémentée comme une fonction imbriquée (une extension GNU C non prise en charge par clang) pour éviter d'avoir à passer
v
.p(n)
imprime W n-2 , où W -1 et W 0 doivent être fournis dansv[1]
etv[2]
. Cela appelle initialementp(4)
à imprimer W 2 . Il boucle ensuite: il appellep(3)
à imprimer W 1 , ce qui rend la sortie complète W 2 W 1 , qui est W 3 . Il appelle ensuitep(4)
à imprimer W 2 , ce qui rend la sortie complète W4 , etc. Les performances sont légèrement meilleures que ma réponse précédente: je vois les valeurs de 1875034112 en une minute.C, 81 (clang)
C'est une approche complètement différente de ce qui précède que je pense qu'il vaut la peine de suivre, même si elle obtient un score pire.
Cela a toutes sortes de comportements indéfinis, principalement pour le plaisir. Il fonctionne avec clang 3.6.2 sous Linux et avec clang 3.5.2 sur Cygwin pour les cas de test de la question, avec ou sans options de ligne de commande spéciales. Il ne se casse pas lorsque les optimisations sont activées.
Cela ne fonctionne pas avec d'autres compilateurs.
J'accepte les mots comme arguments de ligne de commande au format chaîne.
J'utilise la nouvelle ligne comme délimiteur cohérent.
J'accède
s
hors des limites. Cela doit sûrement se terminer par une erreur de segmentation ou une violation d'accès à un moment donné.s
arrive à être placé à la fin du segment de données, il ne devrait donc pas encombrer d'autres variables et donner une sortie erronée avant ce segfault. J'espère.En testant
{ ./program 1 0 | tr -d '\n' & sleep 60; kill $!; } | wc -c
, j'obtiens 1816784896 chiffres en une minute sur ma machine lorsque le programme a été compilé avec-O3
, et 1596678144 quand il a été compilé avec des optimisations désactivées.Non golfé, pas d'UB, avec explication:
la source
s[]
truc fonctionne bien avec clang (je viens de l'installer). Je suis assez surpris que cela fonctionne réellement. À toutes fins utiles, supposez que votre code ne manquera jamais de mémoire et que ses types de données ne débordent pas. Malheureusement, cela signifie simplement que l'impression de W97 n'est pas considérée comme valide. Pourriez-vous appelerp
récursivement? Cela éliminerait le besoin d'unmain
.p
enp
lui - même , sans ajouter plus de code, mais si je trouve une façon que je vais modifier à nouveau.Javascript (53 octets)
L'entrée doit être une chaîne et non un nombre (
'0'
et pas seulement0
).la source
Perl 5,
455549 octets44 octets, plus 1 pour
-E
au lieu de-e
Utiliser comme par exemple
Cela imprime des approximations successives de W ∞ et donc, si vous attendez assez longtemps, imprime, sur sa dernière ligne de sortie, W ∞ à n'importe quelle longueur souhaitée, selon les besoins. Les chiffres du mot sont concaténés sans délimiteur.
Depuis que je suis sous Windows, je l'ai testé pour l' exigence «au moins un million de chiffres de W ∞ » en l'exécutant avec une sortie redirigée vers un fichier et en le tuant après environ 59 secondes, puis en exécutant GnuWin32
wc -L
, qui imprimait 701408733.Mise à jour:
L'OP a précisé dans un commentaire sur cette réponse (et j'aurais probablement dû m'en rendre compte de toute façon) que la sortie supplémentaire précédant W ∞ disqualifie ce qui précède. Voici donc une solution de 55 octets qui imprime uniquement W ∞ :
Utilisé de la même manière, mais avec les arguments dans l'ordre inverse , et ne nécessite pas
-E
:Sans aucun doute, il peut être joué plus loin, mais je ne vois pas comment le faire pour le moment.
Mise à jour supplémentaire:
Dennis a rasé cinq octets en utilisant
-a
(donc en lisant<>
pour supprimersub
) et en réaffectant le paramètre passéprint
à la fin duredo
bloc:Avec
-ane
et lecture de<>
(les deux entrées sur une ligne, séparées par des espaces, dans l'ordre inverse); 48 + 2 octets:Et, sur cette base, j'ai rasé un octet de plus (comme ci-dessus, mais maintenant les entrées sont dans le bon ordre); 47 + 2 octets:
la source
REXX , 48
ftw.rex
exec ftw.rex 0 1
Actuellement, je ne peux pas tester les performances car j'ai utilisé un compilateur en ligne pour l'écrire. Le "pour toujours" peut être remplacé par n'importe quel nombre alors que les numéros ftw imprimés sont (nombre + 2).
J'ai également écrit une petite solution (désordonnée) dans Prolog. Je n'ai pas compris comment tester les performances avec celui-ci, mais c'est probablement atroce de toute façon.
la source
Python 2, 67 octets
Accepte l'entrée comme une paire de chaînes séparées par des virgules:
"1","0"
par exemple dans la question.Pas d'interprète en ligne car les boucles infinies sont mauvaises.
La sortie tamponnée m'a fait gagner beaucoup d'octets. :(Merci Dennis d'avoir souligné qu'un chiffre par ligne est valide.Synchronisation sur ma machine (significativement plus faible):
la source
Dyalog APL, 9
Celui-ci utilise
∇
pour définir une fonction récursive. C'est une traduction directe de la réponse Python 3 de ce xnor . Il prend W 0 comme droite et W −1 comme argument gauche, les deux devraient être des vecteurs de caractères.la source
Minkolang 0,11 , 62 octets
Essayez-le ici. Attend une entrée dans l'ordre W 0 , W -1 avec un espace entre les deux.
Explication
La méta-explication de ce qui suit est qu'à ce stade, nous avons deux nombres suivis d'une chaîne de "0" et de "1" sans séparation. Si les longueurs de W 0 et W -1 sont
a
etb
, respectivement, alors les deux nombres à l'avant de la pile sont<a+b>
et<a>
, dans cet ordre. Le mot formé en concaténant W i + 1 et W i , c'est-à-dire W i + 1 + W i , est égal à 2 * W i + 1 - W i . Ainsi, le code suivant duplique la pile (2 * W i + 1 ), apparaît en haut<a>
(- W i ), puis remplace<a+b>
et<a>
par leurs successeurs,<a+2b>
et<b>
.la source
Python 3, 32
La même idée récursive que ma réponse Haskell , sauf que le préfixe est imprimé car Python ne peut pas gérer des chaînes infinies.
Utilisé une astuce de Sp3000 pour imprimer sans espaces en plaçant la chaîne comme
end
argument dans Python 3la source
Perl, 32 octets
En comptant le shebang comme deux, l'entrée est tirée de stdin, l'espace séparé par W 0 , W -1 . Sortie pendant 1 Mo à ~ 15 ms, dont la plupart peuvent être attribuées au lancement de l'interpréteur.
Exemple d'utilisation
la source
Prolog, 69 octets
Exemple d'entrée: p ('1', '0')
N'a pas trouvé de moyen de supprimer l'écriture supplémentaire.
Je devrais pouvoir améliorer cela si je trouve comment faire ça.
la source