Dans la représentation décimale de chaque nombre rationnel p/q
, vous avez une queue périodique, une tête non périodique et une section avant la virgule décimale au format suivant:
(before decimal point).(non-periodic)(periodic)
Quelques exemples:
1/70 = 0.0142857... = (0).(0)(142857)
10/7 = 1.428571... = (1).()(428571) ## no non-periodic part
1/13 = 0.076923... = (0).()(076923)
3/40 = 0.075 = (0).(075)() ## no periodic part
-2/15 = -0.13... = -(0).(1)(3) ## negative
75/38 = 1.9736842105263157894... = (1).(9)(736842105263157894)
## periodic part longer than float can handle
25/168 = 0.148809523... = (0).(148)(809523)
120/99 = 40/33 = 1.212121... = (1).()(21)
2/1 = 2 = (2).()() ## no periodic, no non-periodic
0/1 = 0 = (0).()()
0/2 = 0 = (0).()()
299/792 = 0.37752... = (0).(377)(52)
95/-14 = -6.7857142... = -(6).(7)(857142)
-95/-14 = 6.7857142... = (6).(7)(857142)
Le défi est d'échanger les parties périodiques et non périodiques, en laissant le before decimal point
seul, pour créer un nouveau nombre. Par exemple:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Si un nombre n'a pas de partie périodique, 0.25
transformez ce nombre en un nouveau nombre périodique, et vice versa.
1/4 = 0.25 = (0).(25)() => (0).()(25) = 0.252525... = 25/99
4/9 = 0.444444... = (0).()(4) => (0).(4)() = 0.4 = 2/5
5/1 = 5 = (5).()() => (5).()() = 5 = 5/1
Le défi
- Prenez une fraction
x
en entrée, une chaîne, deux entrées, un nombre rationnel ou toute autre méthode adaptée à votre langue. - Échangez les parties périodiques et non périodiques de la représentation décimale de
x
pour créer un nouveau nombre, en laissant la partie avant la décimale seule. La partie périodique démarre toujours dès que possible afin que la partie non périodique soit aussi courte que possible. Voici des exemples. - Renvoie le nombre échangé en tant que nouvelle fraction. L'entrée n'est pas nécessairement réduite alors que la sortie devrait l'être. Le format d'entrée peut différer du format de sortie.
- Le numérateur
p
dex
sera un entier avec une valeur absolue d'un million ou moins et le dénominateurq
dex
sera un entier non nul avec une valeur absolue d'un million ou moins. - Le numérateur
r
et le dénominateurs
du résultat ne sont pas garantis inférieurs à un million. Étant donné la longueur des parties périodiques de ces nombres, il est recommandé d'éviter la conversion directe en flottants. - C'est le golf de code. La réponse la plus courte en octets gagne.
Exemples
1/70 = (0).(0)(142857) => (0).(142857)(0) = (0).(142857)() = 0.142857 = 142857/1000000
10/7 = (1).()(428571) => (1).(428571)() = 1.428571 = 1428571/1000000
1/13 = (0).()(076923) => (0).(076923)() = 0.076293 = 76923/1000000
3/40 = (0).(075)() => (0).()(075) = 0.075075... = 75/999 = 25/333
-2/15 = -(0).(1)(3) => -(0).(3)(1) = -0.311111... = -28/90 = -14/45
75/38 = (1).(9)(736842105263157894)
=> (1).(736842105263157894)(9) = (1).(736842105263157895)() ## since 0.999... = 1
= 1.736842105263157895 = 1736842105263157895/1000000000000000000
= 347368421052631579/200000000000000000
25/168 = (0).(148)(809523) => (0).(809523)(148) = 0.809523148148... = 870397/1080000
120/99 = (1).()(21) => (1).(21)() = 1.21 = 121/100
2/1 = (2).()() => (2).()() = 2 = 2/1
0/1 = (0).()() => (0).()() = 0 = 0/1
0/2 = (0).()() => (0).()() = 0 = 0/1
299/792 = (0).(377)(52) => (0).(52)(377) = 0.52377377... = 2093/3996
95/-14 = -(6).(7)(857142) => -(6).(857142)(7) = -6.857142777... = -12342857/1800000
-95/-14 = (6).(7)(857142) => (6).(857142)(7) = 6.857142777... = 12342857/1800000
code-golf
math
number
rational-numbers
Sherlock9
la source
la source
0
à la fin du cas de test 2 (10/7
):1428571/100000
devrait l'être1428571/1000000
.1/7
pourrait être représentée comme(0).()(142857)
ou(0).(1)(428571)
,1
pourrait être représentée comme(1).()()
,(0).()(9)
,(0).()(99)
,(0).(9)(9)
, etc.Réponses:
Python 2, 292 octets
Version non golfée, fonctionne à la fois en python 2 et 3. Imprime également la représentation décimale.
la source
d=10**len(p+a)
if n==0: p=''
, utilisez-le``
à chaque endroit que vous utilisezstr
, comme à la`n/d`
place destr(n/d)
, et renommez-len
leL
avecL=len;
au début de la fonction.n=int(b+p+a);d=10**L(p+a)
etimport fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)
. De plus, j'obtiens 295 octets pour votre édition actuelle. Y a-t-il une nouvelle ligne supplémentaire que vous oubliez de laisser de côté?Gelée ,
1021018987838179787774 octetsCela a pris beaucoup de temps à écrire, beaucoup trop de temps à déboguer et a certainement besoin de beaucoup de golf (
huit sept sixcinqquatre liens, sainte vache), mais c'est, à ma connaissance, correct. Un grand merci à Dennis pour son aide ici, surtout avec les deux premiers liens. Merci également à Rainer P., car j'ai fini par emprunter une grande partie de l'algorithme dans leur réponse Python.Modifications du golf: -1 octet grâce à Xanderhall. Correction d'un bug de ne pas utiliser la bonne logique NOT intégrée. -13 octets de golf sur les liens du numérateur. +1 octet de correction d'un bug pour le négatif
d
avec merci à Dennis. Restructuré les liens afin que la génération du numérateur soit tout en un seul lien. -2 octets de la combinaison des deuxième et troisième liens. -4 octets du déplacement de certains éléments communs des troisième et quatrième liens vers le deuxième lien et le lien principal. -2 octets de suppression de certains opérateurs de chaîne superflus. -2 octets de la réorganisation de la liaison du numérateur. -1 octet du déplacementḢ€
à la fin du deuxième lien. Correction d'un bug dans le lien principal. -1 octet de passerṪ ... ,Ḣ
àḢ ... ṭ
. -3 octets de déplacer le lien numérateur dans le lien principal.Suggestions de golf bienvenues! Essayez-le en ligne!
Explication
Tout d'abord, je vais expliquer le lien principal , qui appelle les autres liens.
Ensuite, le premier lien qui obtient les chiffres.
Maintenant, le deuxième lien qui obtient les parties périodiques et non périodiques de
n/d
, et beaucoup d'autres levées de poids.Le troisième maillon , qui donne notre nouveau dénominateur.
la source