Les nombres rationnels positifs peuvent être montrés numérotables avec le processus suivant:
- Zéro a l'ordinal 0
- Disposez les autres nombres dans une grille de sorte que la ligne a, la colonne b contienne a / b
- Tracer un zigzag diagonal en haut à droite en bas à gauche
- Gardez un décompte des nombres uniques rencontrés le long du zig-zag
Voici une photo du zig-zag:
Ainsi, les nombres rencontrés sont, afin
1/1, 2/1, 1/2, 1/3, 2/2, 3/1, 4/1, 3/2, 2/3, 1/4, 1/5, 2/4, 3/3, 4/2, 5/1, 6/1, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 2/6, 3/5, 4/4, 5/3 ...
Et les nombres uniques et simplifiés rencontrés sont
1, 2, 1/2, 1/3, 3, 4, 3/2, 2/3, 1/4, 1/5, 5, 6, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 3/5, 5/3, ...
Défi:
- Étant donné deux entiers supérieurs à zéro p et q , afficher le nombre ordinal de p / q
- p et q ne sont pas nécessairement co-amorces
- Victoires de code les plus courtes
- Les failles standard sont interdites
Cas de test:
Voici les 24 premiers nombres rationnels rencontrés et la sortie souhaitée pour chacun:
1/1: 1
2/1: 2
1/2: 3
1/3: 4
2/2: 1
3/1: 5
4/1: 6
3/2: 7
2/3: 8
1/4: 9
1/5: 10
2/4: 3
3/3: 1
4/2: 2
5/1: 11
6/1: 12
5/2: 13
4/3: 14
3/4: 15
2/5: 16
1/6: 17
1/7: 18
2/6: 4
3/5: 19
Et, pour d'autres cas de test, voici les 200 premiers nombres rationnels positifs dans l'ordre:
1, 2, 1/2, 1/3, 3, 4, 3/2, 2/3, 1/4, 1/5,
5, 6, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 3/5, 5/3,
7, 8, 7/2, 5/4, 4/5, 2/7, 1/8, 1/9, 3/7, 7/3,
9, 10, 9/2, 8/3, 7/4, 6/5, 5/6, 4/7, 3/8, 2/9,
1/10, 1/11, 5/7, 7/5, 11, 12, 11/2, 10/3, 9/4, 8/5,
7/6, 6/7, 5/8, 4/9, 3/10, 2/11, 1/12, 1/13, 3/11, 5/9,
9/5, 11/3, 13, 14, 13/2, 11/4, 8/7, 7/8, 4/11, 2/13,
1/14, 1/15, 3/13, 5/11, 7/9, 9/7, 11/5, 13/3, 15, 16,
15/2, 14/3, 13/4, 12/5, 11/6, 10/7, 9/8, 8/9, 7/10, 6/11,
5/12, 4/13, 3/14, 2/15, 1/16, 1/17, 5/13, 7/11, 11/7, 13/5,
17, 18, 17/2, 16/3, 15/4, 14/5, 13/6, 12/7, 11/8, 10/9,
9/10, 8/11, 7/12, 6/13, 5/14, 4/15, 3/16, 2/17, 1/18, 1/19,
3/17, 7/13, 9/11, 11/9, 13/7, 17/3, 19, 20, 19/2, 17/4,
16/5, 13/8, 11/10, 10/11, 8/13, 5/16, 4/17, 2/19, 1/20, 1/21,
3/19, 5/17, 7/15, 9/13, 13/9, 15/7, 17/5, 19/3, 21, 22,
21/2, 20/3, 19/4, 18/5, 17/6, 16/7, 15/8, 14/9, 13/10, 12/11,
11/12, 10/13, 9/14, 8/15, 7/16, 6/17, 5/18, 4/19, 3/20, 2/21,
1/22, 1/23, 5/19, 7/17, 11/13, 13/11, 17/7, 19/5, 23, 24,
23/2, 22/3, 21/4, 19/6, 18/7, 17/8, 16/9, 14/11, 13/12, 12/13,
11/14, 9/16, 8/17, 7/18, 6/19, 4/21, 3/22, 2/23, 1/24, 1/25
Criez à la question inverse , où le premier mouvement est en baisse afin que vous ne puissiez pas utiliser les réponses pour générer des cas de test supplémentaires.
Réponses:
Gelée ,
2120 octetsProbablement battable par un certain nombre d'octets en utilisant des mathématiques intelligentes ...
Un lien monadique acceptant une liste
[p,q]
qui renvoie le nombre naturel attribué àp/q
.Essayez-le en ligne! Ou consultez la suite de tests .
Comment?
Notez d'abord que le N e diagonale rencontrée contient tous les nombres rationnels de la grille pour lesquels la somme du numérateur et du dénominateur est égale à N + 1 , donc étant donné une fonction qui réduit une
[p,q]
paire à la forme la plus simple ([p/gcd(p,q),q/gcd(p,q)]
), nous pouvons construire les diagonales aussi loin que doit être *, réduire toutes les entrées, dédoublonner et trouver l'index de l'entrée simplifiée.* en fait un autre ici pour enregistrer un octet
la source
Perl 6 ,
9490 octetsEssaye-le
Essaye-le
Cela génère essentiellement la séquence entière de valeurs et s'arrête lorsqu'il trouve une correspondance.
É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
Python 2 ,
157144137134126125 125 octetsEssayez-le en ligne!
4 octets enregistrés grâce à M. Xcoder ; 1 octet de Jonathon Frech .
Comme l'a noté M. Xcoder, nous pouvons faire un peu mieux en Python 3 car, entre autres, la division entière par défaut est flottante, et nous pouvons plus facilement décompresser
list
s:Python 3 , 117 octets
Essayez-le en ligne!
la source
**(j%-2|1)
etp-~q
.+1
à la fin, car1,1
«doit» donner1
, non0
.Python 3 ,
157,146,140, 133 octetsEssayez-le en ligne!
a gagné 11 octets grâce à Jonathan Frech
gagné 6 octets de plus puis 7 grâce à Chas Brown
la source
range(max(p,q)+1)
parrange(p+q)
.{*a}
au lieu deset(a)
.J,
41,35, 30 octets-11 octets grâce à FrownyFrog
Essayez-le en ligne!
message original de 41 octets avec explication
non golfé
explication
Essayez-le en ligne!
la source
1+~.@;@([:<@|.`</.%~/~)@(1+i.@*)i.%
%i.~0~.@,@,[:]`|./.[:%/~1+i.@*
Python 3, 121 octets
la source
Rouille, 244 octets
J'ai créé une formule simple pour trouver l'ordinal "simple" d'un zigzag "simple", sans les contraintes du puzzle, en utilisant des formules de nombres triangulaires: https://www.mathsisfun.com/algebra/triangular-numbers.html . Cela a été modifié avec modulo 2 pour tenir compte des zig-zags inversant leur direction chaque rangée diagonale du puzzle. C'est la fonction h ()
Ensuite, pour l'astuce principale de ce puzzle: comment `` ne pas compter '' certaines valeurs répétitives, comme 3/3 vs 1/1, 4/2 vs 2/1, dans la piste en zig-zag. J'ai exécuté les exemples 1 à 200 et j'ai remarqué la différence entre un compteur triangulaire en zig-zag simple et celui que le puzzle souhaite, a un motif. Le schéma des nombres "manquants" est 5, 12, 13, 14, 23, etc., ce qui a entraîné un coup dans l'OEIS. Il s'agit de celui décrit par Robert A Stump, à https://oeis.org/A076537 , afin de "dédupliquer" les nombres comme 3/3, 4/2 et 1/1, vous pouvez vérifier si GCD> 1 pour le x, y de tous les ordinaux "précédents" dans le zigzag. Ce sont les boucles 'for' et g () qui est le gcd.
Je suppose qu'avec un gcd intégré, il aurait été plus court, mais je ne pouvais pas en trouver un très facilement (je suis un peu nouveau chez Rust et Integer m'a confondu), et j'aime le fait que celui-ci utilise l'arithmétique entière directe, et aucun buildins ou bibliothèques d'aucune sorte.
la source
JavaScript (ES6), 86 octets
Prend des entrées dans la syntaxe de curry
(p)(q)
.Essayez-le en ligne!
la source
Javascript, 79 octets
(Je suis nouveau dans le golf de code, donc cela peut probablement être amélioré facilement)
Explication
la source
(3,5)
devrait entraîner19
(non24
) depuis(1,1)==(2,2)==(3,3)
,(2,4)==(1,2)
,(4,2)==(2,1)
et(2,6)==(1,3)
. (c.-à-d. que cela(2,2)
devrait se traduire par1
non5
, etc ...)