Aujourd'hui, votre objectif est de trouver des entiers a et b étant donné un entier non négatif n tel que:
Vous devez écrire un programme ou une fonction qui prend le paramètre n et génère a et b dans un format de votre choix.
Des échappatoires standard s'appliquent. De plus, il est prévu que vous implémentiez vous-même le problème ci-dessus en utilisant l'arithmétique de base. Vous ne pouvez donc pas utiliser la fonctionnalité d'algèbre exacte intégrée, les rationnels ou les fonctions mettant en œuvre des constructions mathématiques non triviales (par exemple la séquence de Lucas ).
Le code le plus court en octets gagne.
Exemple d'entrée / sortie:
0 → 1, 0
1 → 3, 1
2 → 14, 6
3 → 72, 32
4 → 376, 168
5 → 1968, 880
6 → 10304, 4608
7 → 53952, 24128
8 → 282496, 126336
9 → 1479168, 661504
la source
[3 5;1 3]**input('')*[1;0]
c'est 26 octets, pas 41.@(n)[3 5;1 3]^n*[1;0]
(poignée de fonction) vous ferait économiser cinq caractères, bonne idée!Python 2, 50
Multiplie par à
3+sqrt(5)
plusieurs reprises par son action sur la paire(a,b)
représentanta+b*sqrt(5)
. Équivaut à commencer par le vecteur colonne[1,0]
et à multiplier lesn
temps par la matrice[[3,5],[1,3]]
.la source
Julia,
2220 octetsCela crée une fonction lambda qui prend un seul entier en entrée et retourne un vecteur à 2 éléments d'entiers correspondant à la solution [a, b]. Pour l'appeler, donnez-lui un nom, par exemple
f=n->...
.Commencez par multiplier
On peut alors traduire le côté droit de cette équation en une matrice à 2 colonnes, où la première correspond au coefficient de a et la seconde au coefficient de b :
Multipliez cette matrice par elle-même n fois, puis multipliez à droite par le vecteur colonne (1, 0), et POOF! Sort le vecteur de solution.
Exemples:
la source
J, 20 octets
Multipliez le vecteur
[1 0]
par les[[3 5] [1 3]]
n
temps matriciels .2 octets enregistrés grâce à @algorithmshark.
Utilisation et test:
la source
+/ .*(3 5,:1 3&)&1 0
.(+/@:*&(3 5,.1 3)&1 0)
marche et(+/@:*&1 0&(3 5,.1 3))
pas? Le deuxième ne devrait-il pas se lier correctement et le premier devrait-il être échangé?&
fait la mise sous tension / boucle donc vous modifiez l'entrée du côté gauche pendant la mise sous tension (contrairement à la modification normale du côté droit).Pyth, 20 octets
u
qui est réduit en général, est utilisé ici comme boucle d'application répétée. La fonction de mise à jour estG
->,+*3sGyeG+sGyeG
, oùG
est un tuple 2. Cette fonction se traduit par3*sum(G) + 2*G[1], sum(G) + 2*G[1]
.s
estsum
,y
est*2
.la source
APL (22)
Explication:
{
...}⍣⎕⍨2↑1
: lire un nombre et exécuter la fonction suivante autant de fois, en utilisant[1,0]
comme entrée initiale.2 2⍴3 5 1
: la matrice[[3,5],[1,3]]
⍵+.×⍨
: multipliez le premier nombre dans ⍵ par 3, le second par 5, et additionnez-les, c'est le nouveau premier nombre; multipliez ensuite le premier nombre dans ⍵ par 1, le second par 3 et additionnez-les, c'est-à-dire le nouveau deuxième nombre.la source
Gelée , 13 octets
Essayez-le en ligne!
Comment ça marche
la source
Mathematica, 31
la source
CJam, 21 octets
Essayez-le en ligne.
Comment ça marche
la source
Javascript,
6361 octetsJ'utilise une évaluation récursive du binôme: (x + y) ^ n = (x + y) (x + y) ^ {n-1}
Nouveau (merci à @ edc65)
Vieux
la source
F=n=>{for(i=y=0,x=1;i++<n;)[x,y]=[3*x+5*y,x+3*y];return[x,y]}
n=>[...Array(n)].map(_=>[x,y]=[3*x+5*y,x+3*y],y=0,x=1)[n-1]
même longueurC, 114 octets
Cela implémente la multiplication matricielle de la manière ennuyeuse. Pour une solution plus amusante (citation: "horriblement horrible") de 238 octets, ne cherchez plus!
Démêlé:
Cela pourrait probablement être un peu raccourci. Essayez un programme de test en ligne !
la source
k2 - 22 car
Fonction prenant un argument.
_mul
est la multiplication matricielle, donc nous la recoupons avec la matrice(3 5;1 3)
, puis la frappons avec l'adverbe de puissance fonctionnelle:f/[n;x]
s'appliquef
àx
,n
fois. Encore une fois, nous le curry, cette fois avec le vecteur de départ1 0
.Cela ne fonctionnera pas dans Kona, car pour une raison quelconque, il
f/[n;x]
n'est pas correctement implémenté. Seule lan f/x
syntaxe fonctionne, donc le correctif le plus court est{x _mul[(3 5;1 3)]/1 0}
à 23 caractères.la source
isé, 25 octets (20 caractères)
J'espérais mieux, mais il y a juste trop de croisillons nécessaires pour le rendre compétent, la priorité de l'opérateur n'est pas optimale pour le golf.
Il s'attend à ce que l'entrée soit dans un emplacement de mémoire de 1 $, donc cela fonctionne:
Pour n = 0, le zéro est ignoré (sorties 1, au lieu de 1 0). Si c'est un problème, remplacez la finale
1
par~[2]
.la source
Sérieusement, 32 octets, sans compétition
Vidage hexadécimal:
Essayez-le en ligne
Évidemment pas un concurrent pour le plus court, mais au moins la méthode est originale. (Notant qu'un tel problème indique nécessairement une séquence de Lucas, comme mentionné dans la description, ce programme génère des termes successifs des séquences en utilisant la relation de récurrence
a_n = 6 * a_ {n-1} - 4 * a_ {n-2}.)
la source
Haskell, 41 octets
Exemple d'utilisation:
(iterate(\(a,b)->(3*a+5*b,a+3*b))(1,0)!!) 8
->(282496,126336)
.la source
C / C ++ 89 octets
Formaté:
Même concept:
Le banc d'essai:
Le résultat:
la source
K, 37 octets
ou
Ils sont tous les deux la même chose.
la source
Python 3, 49 octets
bien que sur ma machine, cela ne donne que la bonne réponse pour les entrées de la gamme
0 <= n <= 18
.Ceci implémente la formule du formulaire fermé
et profite du fait que la
v ** n
pièce est petite et peut être calculée par arrondi plutôt que par calcul direct.la source
Schéma, 97 octets
la source
C 71 octets (60 avec variables pré-initialisées)
Des possibilités pour le golf, mais juste pour prouver que C n'a pas à être "terriblement horrible".
Si les valeurs de a sont initialisées à {1,0}, nous faisons mieux.
Ceci utilise itérativement les mappages a-> 3a + 5b, b-> a + 3b mais en évitant une variable temporaire en calculant a à partir de la nouvelle valeur de b.
la source
a[*a=1]=0
place de*a=1,a[1]=0
(non concurrent) Gelée, 10 octets
Essayez-le en ligne!
Utilise la matrice. Calcule ([[3,1], [5,3]] ** input ()) [0].
la source