Il y a une question bien connue ici qui demande un générateur de séquence de fibonacci court (le moins de caractères).
Je voudrais savoir si quelqu'un peut générer les N premiers éléments seulement, de la séquence des fibonacci, dans un espace très court. J'essaie de le faire en python, mais je suis intéressé par une réponse courte, dans n'importe quelle langue. La fonction F (N) génère les N premiers éléments de la séquence, soit les renvoie comme retour de la fonction, soit les imprime.
Il est intéressant de noter que les réponses au code-golf commencent par 1 1 2
, au lieu de 0 1 1 2
. Est-ce une convention en code-golf ou en programmation en général? (Wikipedia dit que la séquence de fibonacci commence par zéro.).
Exemple Python (5 premiers éléments):
def f(i,j,n):
if n>0:
print i;
f(j,i+j,n-1)
f(1,1,5)
F_0 = 0, F_1 = 1
ou de manière équivalenteF_1 = 1, F_2 = 1
. La différence est de savoir si vous souhaitez démarrer la séquence à l'index 0 (plus courant en programmation) ou 1 (plus courant en mathématiques).F_0 = 0, F_1 = 1
présente un avantage certain en termes de simplicité avec la représentation matricielle[[1 1][1 0]]^n = [[F_{n+1} F_n][F_n F_{n-1}]]
.Réponses:
C
Je n'ai pas pris la peine de compter, mais voici un exemple amusant:
Preuve que ça marche.
J'en suis assez fier: je me suis ennuyé, j'ai donc réorganisé mon code (avec quelques petits ajouts) pour que chaque ligne représente une valeur dans la séquence de Fibonacci.
Preuve que ça marche.
la source
a++<=b
->a++-b
etreturn--n<3?1:f(n)+f(n-1)
. De plus, vous pouvez éviterscanf
si vous avez besoin de n pour êtreargc
.--n
dans la même expression n'est pas pertinent. Brillant!4
qu'il devrait y avoir un3
. Comme actuellement écrit avec le<4
, la séquence produite est 1, 1, 1, 2, 3, 5, 8 ... C'est un de trop de 1.return n<3?n>0:f(--n)+f(--n);
Haskell (26)
Étonnamment, ce n'est un caractère plus que la solution J.
Je rase quelques personnages en:
take
comme opérateur binaire;scanl
au lieu du verbeuxzipWith
.la source
s
c'est tellement élégant, je ne sais pas comment on penserait à une solution comme ça! Ce que je ne savais pas, c'est que vous pouvez utiliser às
nouveau lors de la définitions
. (Je suis toujours un débutant =)Voici un Python à une ligne. Il utilise des virgules flottantes, il peut donc y en avoir
n
pour lesquelles il n'est plus précis.F(n)
renvoie une chaîne contenant les premiersn
nombres de Fibonacci séparés par des espaces.la source
GolfScript, 16 caractères
Exemple de sortie:
la source
Perl, 50 caractères
la source
Scala 71:
impressions
la source
Perl,
2928 octetsExplication
Ceci est basé sur la
$b += $a = $b-$a
récurrence classique qui fonctionne comme suit:$a
contientF(n-2)
et$b
contientF(n)
$a = $b-$a
$a
contientF(n-1)
$b += $a
$b
contientF(n+1)
Le problème ici est l'initialisation. La manière classique est
$b += $a = $b-$a || 1
mais la séquence continue1 2 3 5 ...
En étendant la séquence des fibonacci vers la gauche:
vous voyez que le bon point de départ est
$a = -1
et$b = 0
. L'initialisation de $ a peut être combinée avec la configuration de la boucleRemplacez enfin
$a
par$;
pour vous débarrasser de l'espace avantfor
la source
Je peux vous donner une solution Python à deux lignes. Cela les renverra sous forme de liste.
Vous pouvez le faire imprimer en ajoutant une autre carte pour en faire des chaînes, puis en ajoutant une jointure, mais cela me semble tout simplement inutile.
Malheureusement, je ne sais pas comment mettre un lambda récursif
map
, donc je suis coincé à deux lignes.la source
g(100)
? ;)f(n)
qu'avec desn<=0
retours entiers, etn>0
renvoie des listes, alors .. peut-être que ce n'est pas idéal:f = lambda n: map(f, (-x for x in range(0, n))) if n > 0 else -n if n > -2 else f(n+1) + f(n+2)
0
dans votre réponse. Changerf
pour revenirn if n < 2
est une solution de contournement. :)Python (78 caractères)
J'ai utilisé la formule de Binet pour calculer les nombres de fibonacci -
Ce n'est pas aussi petit que certaines des autres réponses ici, mais mon garçon c'est rapide
la source
print"11235"
:)2**i
.**
ont une priorité plus élevée que*
Schème
Ceci est optimisé en utilisant la récursivité de queue:
la source
Haskell
Preuve que ça marche .
la source
J, 25 caractères
Je me rends compte que les solutions J ne sont probablement pas ce que vous recherchez, mais en voici une quand même. :-)
Usage:
Comment ça fonctionne:
En partant de la droite (car les programmes J sont lus de droite à gauche),
2-~ 6
L'~
opérateur inverse l'argument au verbe donc c'est la même chose que6-2
Ignorant la section entre crochets pour l'instant,
0 1(...)@[&0~ x
prend le verbe entre crochets et l'exécutex
fois en utilisant la liste0 1
comme entrée -~
inverse à nouveau les arguments ici, donnantx (...)@[&0 ] 0 1
, ce qui signifie que je peux garder l'entrée à la fin de la fonction.Entre les crochets se trouve une fourche
],+/&(_2&{.)
composée de trois verbes -]
,,
et+/&(_2&{.)
.Une fourchette prend trois verbes
a b c
et les utilise comme ceci:(x a y) b (x c y)
oùx
ety
sont les arguments du fork. Le,
est le verbe central dans cette fourchette et joint les résultats dex ] y
etx +/&(_2&{.) y
ensemble.]
renvoie l'argument de gauche inchangé afin d'êtrex ] y
évaluéx
.+/&(_2&{.)
prend les deux derniers éléments de la liste donnée(_2&{.)
- dans ce cas0 1
- puis les ajoute ensemble+/
(les&
s agissent simplement comme de la colle).Une fois que le verbe a fonctionné, le résultat est réinjecté pour la prochaine exécution, générant la séquence.
la source
TI-Basic, 43 caractères
Ce code peut être directement inséré dans le programme principal, ou transformé en un programme distinct référencé par le premier.
la source
APL (33)
Usage:
la source
Python (55)
la source
Powershell - 35 caractères
Powershell accepte pipeline d' entrée , donc je suis de la croyance que l'
n |
enn | <mycode>
ne devrait pas être contre mon chef d' accusation, mais est plutôt une partie seulement d'initier une « fonction » dans la langue.La première solution suppose que nous partons de 0:
La deuxième solution suppose que nous pouvons commencer à 1:
Exemple d'appel:
5 | %{for($2=1;$_--){($1=($2+=$1)-$1)}}
Rendements:
Fait intéressant, les tentatives pour éviter la surcharge de la
for()
boucle ont donné lieu dans le même nombre de caractères:%{$2=1;iex('($1=($2+=$1)-$1);'*$_)}
.la source
Python, 43 caractères
Voici trois monolignes fondamentalement différentes qui n'utilisent pas la formule de Binet.
Je n'ai jamais abusé
reduce
si mal.la source
reduce
abusdc, 32 caractères:
En fait, cela affichera toujours les deux premiers 1, donc la fonction ne fonctionne que comme prévu pour N> = 2 .
C, 75 caractères:
Pas aussi cool que la réponse acceptée, mais plus court et beaucoup plus rapide:
Supplémentaire:CL, 64 caractères:
L'un de mes signets les plus utilisés ce semestre a un exemple intéressant qui est plus court que
bon nombredes autres ici, et c'est juste une invocation directe de laloop
macro - essentiellement une seule déclaration! Dépouillé pour tous les espaces que j'ai pu:Assez court, agréable et lisible! Pour lire l'entrée,
n
(y compris les espaces blancs environnants) peut être remplacé par(read)
, en ajoutant 3 caractères.la source
main
prend quatre arguments?FAUX, 28 octets
la source
1_
plutôt que0 1 -
Python 2, 38 octets
Une amélioration par rapport à une solution précédemment publiée:
Cela utilise
exec
et la multiplication de chaînes pour éviter les boucles.Python 3, 46 octets
Pas aussi efficace dans Python 3:
la source
C99, 58 caractères
La fonction suivante remplit un tableau d'entiers avec les premières
n
valeurs de la séquence de Fibonacci commençant par 0.Harnais de test, prenant
n
comme argument de ligne de commande:la source
CoffeeScript, 48
65 en js:
la source
PHP, 87
Utilise
array_sum
et fonction récursive pour générer des séries.Par exemple:
la source
F #, 123
la source
Scala, 65 caractères
Cela imprime, par exemple, les 9 premiers numéros de Fibonacci. Pour une version plus utilisable prenant la longueur de séquence de l'entrée de la console, 70 caractères sont requis:
Attention, l'utilisation d'une plage limite cela aux valeurs Int.
la source
Q 24
N premiers nombres de fibonacci
la source
Lua, 85 octets
J'apprends Lua donc je voudrais ajouter cette langue à la piscine.
et le tout a pris 85 caractères, avec le paramètre comme argument de ligne de commande. Un autre bon point est qu'il est facile à lire.
la source
FAUX, 20 caractères
L'entrée doit être sur la pile avant d'exécuter cela.
la source
Pyt , 3 octets
Essayez-le en ligne!
la source
code machine x86 - 379 octets
La version avec en-têtes ELF totalisant 484 octets:
Version sans en-tête (c'est celle à noter):
Calcule (éventuellement)∞ nombres de fibonacci.
la source