Créez une fonction qui prend un nombre naturel (à partir de 0 inclus) et renvoie une paire d'entiers positifs, qui sont respectivement le numérateur et le dénominateur. Utilisez la traversée diagonale. Les nombres comptés précédemment doivent être ignorés. (vous pouvez mémoriser l'ensemble des valeurs ignorées)
Diagramme:
Les valeurs rouges sont ignorées
Valeurs:
- f (0) = 1, 1
- f (1) = 2, 1
- f (2) = 1, 2
- f (3) = 1, 3
- f (4) = 3, 1 (remarquez le saut)
- f (5) = 4, 1
- f (6) = 3, 2
- f (7) = 2, 3
- f (8) = 1, 4
- f (9) = 1, 5
- f (10) = 5, 1 (remarquez le saut)
Vous pouvez utiliser la structure de données Rational et leurs opérations si elles existent. Le code le plus court gagne.
code-golf
rational-numbers
Ming-Tang
la source
la source
Réponses:
J,
4136 caractèresPrend un entier et retourne un vecteur comprenant deux entiers. Ma première solution qui n'est ni entièrement tacite ni entièrement explicite.
Voici la solution avec des espaces insérés le cas échéant:
Une explication:
x (, % +.) y
–Un vecteur de longueur 2 représentant la fraction avec numérateurx
et dénominateury
réduit au plus petit dénominateur1 + i. 1 + y
–Un vecteur d'entiers de1
ày + 1
(, % +.)"0/~ 1 + i. 1 + y
–Une matrice de toutes les fractions réduites avec dénominateur et numérateur non réduits dans la plage de1
ày + 1
.<`(<@|.)/. y
–Un tableau des diagonales obliques de la matricey
, mutuellement inversées en diagonale~. ; y
–Un tableau de diagonales réduites en un vecteur d'éléments dont les doublons ont été supprimésx { y
-Le point à la positionx
dansy
(u v) y
–Le même quey u v y
. Dans ce cas d'utilisation particulier,u
est{
etv
est3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'
la source
Haskell, 78 caractères
Exemple d'exécution:
cycle
et fonctions pour alterner l'ordre des lignescycle
par la liste infinie construite à la maind
gcd
identité appliquée comme suggéré par Matíasla source
gcd (r-b) b == gcd r b
et vous pouvez raser quatre autres personnages.Python, 144 caractères
la source
Rubis 1.9,
109106la source
OCaml + Batteries,
182168 caractèresC'est ce qui serait naturel dans Haskell mais n'est à peine possible que dans OCaml:
Edit: la diagonale n'est pas nécessaire
la source
Perl 6 , 75 octets
Essaye-le
Cela génère essentiellement la séquence entière de valeurs rationnelles, ne s'arrêtant qu'une fois la valeur indexée générée.
(Basé sur mon golf à un autre défi.)
Étendu:
({1…($+=2)…1}…*)
génère la séquence infinie de numérateurs (|(…)
est utilisé ci-dessus pour aplatir)(1,{1…(($||=1)+=2)…1}…*)
génère la séquence infinie de dénominateursla source