La séquence de Fibonacci est une séquence bien connue dans laquelle chaque entrée est la somme des deux précédentes et les deux premières entrées sont 1. Si nous prenons le modulo de chaque terme par une constante, la séquence deviendra périodique. Par exemple, si nous décidions de calculer la séquence mod 7, nous obtiendrions ce qui suit:
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...
Celui-ci a une période de 16. Une séquence apparentée, appelée la séquence de Pisano , est définie telle que a(n)
c'est la période de la séquence des fibonacci lorsqu'elle est calculée modulo n.
Tâche
Vous devrez écrire un programme ou une fonction qui, une fois donné n
, calculera et affichera la période du mod de séquence de Fibonacci n
. C'est le nième terme de la séquence de Pisano.
Vous ne devez prendre en charge que des entiers sur la plage 0 < n < 2^30
Il s'agit d'une compétition de golf de code , vous devez donc viser à minimiser la taille de votre code source telle que notée par octets.
Cas de test
1 -> 1
2 -> 3
3 -> 8
4 -> 6
5 -> 20
6 -> 24
7 -> 16
8 -> 12
9 -> 24
10 -> 60
11 -> 10
12 -> 24
f(i),f(i+1)
peut prendre au plus desn^2
valeurs modn
. Ainsi,n
limité à2^30
pourrait finir par produire une période allant jusqu'à2^60
. Restreindren <= 2^16
donneraitP(n) <= 2^32
.f(i+2) = f(i+1)+f(i)
, ainsi l '«état» d'une machine en boucle sur la période peut être décrit avec une paire d'entiers modn
. Il y a au plus desn^2
états, donc la période est au plusn^2
. Oh! Wikipedia prétend que la période est tout au plus6n
. Peu importe ma trivialité.Réponses:
GolfScript (
28 25 2423 caractères)Prend l'entrée dans stdin, la laisse sur stdout (ou sur la pile, si vous souhaitez la traiter plus avant ...)
Cela gère correctement les cas d'angle ( démo ).
En tant que point d'intérêt pour les programmeurs GolfScript, je pense que c'est le premier programme que j'ai écrit avec un dépliant qui est sorti plus court que les autres approches que j'ai essayées.
la source
GolfScript, 24 caractères
Prochaine itération d'une implémentation GolfScript. La deuxième version gère désormais également 1 correctement. C'est devenu assez long mais peut-être que quelqu'un peut trouver un moyen de raccourcir cette version. Vous pouvez essayer la version ci-dessus en ligne .
la source
1
correctement l' entrée ?1
- et toujours seulement 24 caractères.Python,
188132101 1019587 caractèresUsage
Par exemple:
la source
cat
Tingwc -c
et je reçois le même numéro.if k>0 and s[0:k]==s[k:]:break
peut être changé enif s and s[:k]==s[k:]:break
. Vous pouvez également réduire de manière significative en supprimant l'itérateur, en changeant lafor
bouclewhile 1:
et en effectuanta,b=a,a+b
à la fin de la boucle while.Python
908596949082Edit: Suggestions mises en œuvre par beary et primo
la source
a.append(c) -> a+=[c]
((n>1)>>(c in a)) -> (n>1)>>(c in a)
append
a en fait une fonctionnalité différente de celle+=
. Merci pour les conseils.(n>1)>>(c in a)
->
(c in a)<1%n
pour 3 octets. Et je suis d'accord avec Beary sur l'appendice. Que vous ajoutiez une référence àc
ou étendeza
par la valeur dec
, c'est exactement la même chose dans les deux cas (car vous détruisez immédiatement votre référence dec
toute façon).a+=c
au lieu dea+=[c]
Mathematica 73
la source
PHP -
6157 octetsCe script rapportera
2
par erreur pourn=1
, mais toutes les autres valeurs sont correctes.Exemple d'E / S, une série tronçable à gauche où π (n) = 2n + 2:
la source
1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN)
Oh mon dieu, c'est un ordre d'exploitation de l'exploitation juste là.PowerShell: 98
Code golf:
Non golfé, avec commentaires:
Remarques:
Je ne sais pas exactement quelle est la limite maximale fiable pour $ n avec ce script. C'est probablement moins de 2 ^ 30, car $ x pourrait déborder un int32 avant que $ n n'y arrive. En plus de cela, je n'ai pas testé la limite supérieure moi-même car les durées d'exécution du script atteignaient déjà environ 30 secondes sur mon système pour $ n = 1e7 (ce qui n'est que légèrement supérieur à 2 ^ 23). Pour la même raison, je ne suis pas rapidement enclin à tester et à dépanner la syntaxe supplémentaire nécessaire pour mettre à niveau les variables vers uint32, int64 ou uint64 lorsque cela est nécessaire afin d'élargir la plage de ce script.
Exemple de sortie:
J'ai enveloppé cela dans une autre boucle for:
Définissez ensuite
$n=$i
au lieu de=read-host
et modifiez la sortie"$i | $x"
pour obtenir une idée de la fiabilité générale du script. Voici une partie de la sortie:...
Sidenote:
Je ne sais pas vraiment comment certaines périodes Pisano sont significativement plus courtes que $ n. Est-ce normal ou quelque chose ne va pas avec mon script?Peu importe - je viens de me rappeler qu'après 5, les nombres de Fibonacci deviennent rapidement beaucoup plus grands que leur place dans la séquence. Donc, cela a un sens total maintenant.la source
Perl,
75,61, 62 + 1 = 63Usage
Non golfé
+1 octet pour le
-n
drapeau. Rasé de 13 octets grâce à Gabriel Benamy.la source
$n=<>;
(-6) et le remplacer par le-n
drapeau (+1), puis toutes les instances de$n
peuvent être remplacées par$_
. Vous pouvez utiliser-M5.010
gratuitement, ce qui vous permet d'utiliser lasay
commande au lieu deprint
(-2). Leswhile
instructions de modification n'ont pas besoin de parenthèses autour de la condition (-2). Au lieu de@{[%h]}/2
, vous pouvez avoir un compteur$a++,
avant($m,$k)=
et ensuite juste avoirsay$a-1
à la fin (-2). Au lieu d'"$m,$k"
utiliser$m.$k
(-2). Cela devrait ressortir$k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)while!$h{$m.$k}++;say$a-1
avec l'-n
indicateur, pour 61 + 1 = 62 octets."$m,$k"
au lieu de$m.$k
, (+2), mais vous pouvez enregistrer 1 octet en passantwhile!$h
àuntil$h
(-1). Pardon!$m.$k
échoue? Cela semblait fonctionner de mon côté.Clojure, 102 octets
Pas trop excitant, itère la formule jusqu'à ce que nous revenions
[1 1]
(j'espère que c'est toujours le cas). Traitement spécial au(f 1)
fur et à mesure qu'il converge[0 0]
.la source