La séquence Stern-Brocot est une séquence de type Fibonnaci qui peut être construite comme suit:
- Initialisez la séquence avec
s(1) = s(2) = 1
- Régler le compteur
n = 1
- Ajouter
s(n) + s(n+1)
à la séquence - Ajouter
s(n+1)
à la séquence - Incrémenter
n
, revenir à l'étape 3
Cela équivaut à:
Entre autres propriétés, la séquence de Stern-Brocot peut être utilisée pour générer chaque nombre rationnel positif possible. Chaque nombre rationnel sera généré une seule fois, et il apparaîtra toujours dans ses termes les plus simples; par exemple, 1/3
est le 4e nombre rationnel de la séquence, mais les nombres équivalents 2/6
, 3/9
etc. n'apparaîtront pas du tout.
Nous pouvons définir le nième nombre rationnel comme r(n) = s(n) / s(n+1)
, où s(n)
est le nième nombre de Stern-Brocot, comme décrit ci-dessus.
Votre défi consiste à écrire un programme ou une fonction qui produira le nième nombre rationnel généré à l'aide de la séquence Stern-Brocot.
- Les algorithmes décrits ci-dessus sont indexés 1; si votre entrée est indexée 0, veuillez l'indiquer dans votre réponse
- Les algorithmes décrits sont à titre illustratif uniquement, la sortie peut être dérivée de la manière que vous souhaitez (autre que le codage en dur)
- L'entrée peut être via STDIN, les paramètres de fonction ou tout autre mécanisme d'entrée raisonnable
- Ouptut peut être vers STDOUT, console, valeur de retour de fonction ou tout autre flux de sortie raisonnable
- La sortie doit être sous forme de chaîne dans le formulaire
a/b
, oùa
etb
sont les entrées pertinentes dans la séquence Stern-Brocot. L'évaluation de la fraction avant la sortie n'est pas autorisée. Par exemple, pour l'entrée12
, la sortie doit être2/5
non0.4
. - Les failles standard sont interdites
C'est le code-golf , donc la réponse la plus courte en octets gagnera.
Cas de test
Les cas de test ici sont indexés 1.
n r(n)
-- ------
1 1/1
2 1/2
3 2/1
4 1/3
5 3/2
6 2/3
7 3/1
8 1/4
9 4/3
10 3/5
11 5/2
12 2/5
13 5/3
14 3/4
15 4/1
16 1/5
17 5/4
18 4/7
19 7/3
20 3/8
50 7/12
100 7/19
1000 11/39
Entrée OEIS: A002487
Excellente vidéo Numberphile discutant de la séquence: Infinite Fractions
True
s au lieu de1
s?True/2
n'est pas une fraction valide (en ce qui me concerne). En passant, ceTrue
n'est pas toujours le cas1
- certains langages utilisent à la-1
place pour éviter les erreurs potentielles lors de l'application d'opérateurs au niveau du bit. [citation nécessaire]True
est équivalent1
et leTrue/2
serait1/2
.Réponses:
Gelée , 14 octets
Essayez-le en ligne!
Ooh, on dirait que je peux battre la réponse acceptée par @Dennis, et dans la même langue. Cela fonctionne en utilisant une formule d'OEIS: le nombre de façons d'exprimer (le nombre moins 1) en hyperbinaire (c'est-à-dire binaire avec 0, 1, 2 comme chiffres). Contrairement à la plupart des programmes Jelly (qui fonctionnent soit comme un programme complet soit comme une fonction), celui-ci ne fonctionne que comme un programme complet (car il envoie une partie de la sortie à stdout et renvoie le reste; lorsqu'il est utilisé comme programme complet, la valeur de retour est envoyé à stdout implicitement, donc toute la sortie est au même endroit, mais cela ne fonctionnerait pas pour une soumission de fonction).
Cette version du programme est très inefficace. Vous pouvez créer un programme beaucoup plus rapide qui fonctionne pour toutes les entrées jusqu'à 2ⁿ en plaçant n juste après le
ẋ
sur la première ligne; le programme a des performances O ( n × 3ⁿ), donc garder n petit est assez important ici. Le programme tel qu'il est écrit définit n égal à l'entrée, ce qui est clairement assez grand, mais aussi clairement trop grand dans presque tous les cas (mais bon, il économise des octets).Explication
Comme d'habitude dans mes explications Jelly, le texte entre accolades (par exemple
{the input}
) montre quelque chose qui est automatiquement rempli par Jelly en raison d'opérandes manquants dans le programme d'origine.Fonction d'aide (calcule le n ème dénominateur, c'est-à-dire le n + 1 ème numérateur):
Les cinq premiers octets génèrent simplement tous les nombres hyperbinaires possibles jusqu'à une longueur donnée, par exemple avec l'entrée 3, la sortie de
Ḷ
est [[0,1,2], [0,1,2], [0,1,2 ]] donc le produit cartésien est [[0,0,0], [0,0,1], [0,0,2], [0,1,0],…, [2,2,1], [2,2,2]].Ḅ
multiplie simplement la dernière entrée par 1, l'avant-dernière entrée par 2, l'entrée antépénultième par 4, etc., puis ajoute; bien que cela soit normalement utilisé pour convertir le binaire en décimal, il peut très bien gérer le chiffre 2 et fonctionne donc également pour l'hyperbinaire. Ensuite, nous comptons le nombre de fois où l'entrée apparaît dans la liste résultante, afin d'obtenir une entrée appropriée dans la séquence. (Heureusement, le numérateur et le dénominateur suivent la même séquence).Programme principal (demande le numérateur et le dénominateur et formate la sortie):
D'une certaine manière, je continue d'écrire des programmes qui prennent presque autant d'octets pour gérer les E / S que pour résoudre le problème réel…
la source
CJam (20 octets)
Démo en ligne . Notez qu'il s'agit d'un index 0. Pour le rendre indexé 1, remplacez l'initiale
1_
parT1
.Dissection
Cela utilise la caractérisation due à Moshe Newman qui
Si
x = s/t
alors nous obtenonsMaintenant, si nous supposons que
s
ett
sont coprime alorsFonctionne donc
a(n+2) = a(n) + a(n+1) - 2 * (a(n) % a(n+1))
parfaitement.la source
Haskell,
78 77 6558 octetsVoler sans vergogne l'approche optimisée nous donne:
Merci à @nimi d'avoir joué quelques octets en utilisant une fonction infixe!
(Toujours) utilise une indexation basée sur 0.
L'ancienne approche:
Merde le format de sortie ... Et les opérateurs d'indexation. EDIT: Et la priorité.
Fait amusant: si les listes hétérogènes étaient une chose, la dernière ligne pourrait être:
la source
s!!n
devrait être un octet plus court:f n|x<-s!!n=x:x+x+1:f$n+1
s!!n+1
ne l'est pas(s!!n)+1
maiss!!(n+1)
c'est pourquoi je ne peux pas faire ça: /s!!n
là-dedans!++'/':(show.s$n+1)
inr
pour enregistrer un octet.(s#t)0=show...
,(s#t)n=t#(s+t-2*mod s t)$n-1
,r=1#1
. Vous pouvez même omettrer
, c'est-à-dire que la dernière ligne est juste1#1
.Gelée , 16 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
05AB1E ,
34332523 octetsExplication
Essayez-le en ligne
Enregistré 2 octets grâce à Adnan.
la source
XX‚¹GÂ2£DO¸s¦ìì¨}R2£'/ý
.ý
on peut formater une liste. Agréable.MATL , 20 octets
Celui-ci utilise la caractérisation en termes de coefficients binomiaux donnée dans la page OEIS .
L'algorithme fonctionne en théorie pour tous les nombres, mais en pratique, il est limité par la précision numérique de MATL, et donc il ne fonctionne pas pour les entrées de grande taille. Le résultat est précis pour des entrées jusqu'à
20
au moins.Essayez-le en ligne!
Explication
la source
Python 2,
8581 octetsCette soumission est indexée 1.
En utilisant une fonction récursive, 85 octets:
Si une sortie comme
True/2
est acceptable, en voici une à 81 octets:la source
JavaScript (ES6), 43 octets
1 indexé; remplacer par
n=1
pour 0 indexé. La page OEIS liée a une relation de récurrence utile pour chaque terme par rapport aux deux termes précédents; Je l'ai simplement réinterprété comme une récurrence pour chaque fraction en termes de la fraction précédente. Malheureusement, nous n'avons pas de TeX en ligne, vous n'aurez donc qu'à le coller sur un autre site pour découvrir comment ces formats:la source
Python 2, 66 octets
Utilise la formule récursive.
la source
C (GCC), 79 octets
Utilise l'indexation basée sur 0.
Ideone
la source
x?:y
est une extension gcc.En fait, 18 octets
Essayez-le en ligne!
Cette solution utilise la formule de Peter et est également indexée sur 0. Merci à Leaky Nun pour un octet.
Explication:
la source
MATL ,
3230 octetsCela utilise une approche directe: génère suffisamment de membres de la séquence, sélectionne les deux membres souhaités et formate la sortie.
Essayez-le en ligne!
la source
R, 93 octets
Littéralement la mise en œuvre la plus simple. Travailler un peu au golf.
la source
m4, 131 octets
Définit une macro
r
telle qu'eller(n)
évalue selon la spécification. Pas vraiment joué au golf, je viens de coder la formule.la source
Rubis, 49 octets
Il est indexé sur 0 et utilise la formule de Peter Taylor. Suggestions de golf bienvenues.
la source
> <> , 34 + 2 = 36 octets
Après avoir vu l'excellente réponse de Peter Taylor, j'ai réécrit ma réponse de test (qui était un embarrassant de 82 octets, utilisant une récursion très maladroite).
Il s'attend à ce que l'entrée soit présente sur la pile, donc +2 octets pour l'
-v
indicateur. Essayez-le en ligne!la source
Octave, 90 octets
la source
C #,
9190 octetsS'exécute vers
Func<int, string>
. Il s'agit de l'implémentation récursive.Non golfé:
Édition: -1 octet. Il s'avère que C # n'a pas besoin d'espace entre
return
et$
pour les chaînes interpolées.la source
Python 2, 59 octets
Utilise la formule de Peter et est également indexé sur 0.
Essayez-le en ligne
la source
J, 29 octets
Usage
Les grandes valeurs de n nécessitent un suffixe
x
qui indique l'utilisation d'entiers étendus.la source
100
compte comme une «grande valeur»?Mathematica,
108106101 octetsla source
R , 84 octets
Essayez-le en ligne!
L' ancienne implémentation R ne suit pas les spécifications, renvoyant un point flottant plutôt qu'une chaîne, alors en voici une qui le fait.
la source