Nous savons tous que chaque fois qu'un nombre rationnel est écrit en décimal, le résultat est soit final soit (éventuellement) périodique. Par exemple, lorsque 41/42 est écrit en décimal, le résultat est
0.9 761904 761904 761904 761904 761904 761904 761904 ...
avec une séquence initiale de chiffres 0.9
suivie de la séquence 761904
répétée encore et encore. (Une notation pratique pour cela est l' 0.9(761904)
endroit où les parenthèses entourent le bloc de chiffres répétitifs.)
Votre objectif dans ce défi est de prendre un nombre rationnel positif, de supprimer le premier chiffre faisant partie de la séquence répétée et de renvoyer le nombre rationnel résultant. Par exemple, si nous faisons cela au 41/42, nous obtenons
0.9 61904 761904 761904 761904 761904 761904 761904 ...
ou 0.9(619047)
pour faire court, qui est 101/105.
Si le nombre rationnel a une expansion décimale terminale, comme 1/4 = le 0.25
fait, rien ne devrait se produire. Vous pouvez penser à 1/4 comme 0.250000000...
ou comme 0.249999999...
mais dans les deux cas, la suppression du premier chiffre de la partie répétitive laisse le nombre inchangé.
Détails
- L'entrée est un nombre rationnel positif, soit sous la forme d'une paire d'entiers positifs représentant le numérateur et le dénominateur, ou (si votre langue de choix le permet et si vous le souhaitez) comme une sorte d'objet de nombre rationnel.
- La sortie est également un nombre rationnel, également sous l'une ou l'autre forme. Si le résultat est un entier, vous pouvez renvoyer l'entier au lieu d'un nombre rationnel.
- Si vous prenez une paire de nombres en entrée, vous pouvez supposer qu'ils sont relativement premiers; si vous produisez une paire de nombres en sortie, vous devez les rendre relativement premiers.
- Veillez à trouver le premier chiffre qui commence un bloc répétitif. Par exemple, on pourrait écrire 41/42 comme
0.97(619047)
mais cela ne fait pas de 2041/2100 (avec l'expansion décimale0.97(190476)
) une réponse valide. - Vous pouvez supposer que dans l'entrée que vous obtenez, le premier chiffre périodique est après le point décimal, ce qui
120/11
=10.909090909...
entrée non valide: (son premier chiffre périodique pourrait être considéré comme le0
dans10
). Vous pouvez faire tout ce que vous voulez sur une telle entrée. - C'est le code-golf : la solution la plus courte l'emporte.
Cas de test
41/42 => 101/105
101/105 => 193/210
193/210 => 104/105
104/105 => 19/21
1/3 => 1/3
1/4 => 1/4
2017/1 => 2017/1
1/7 => 3/7
1/26 => 11/130
1234/9999 => 2341/9999
la source
2017
au lieu de2017/1
?(2017,1)
.)2/4
se produire dans l'entrée?120/11
la bonne réponse111/11
ou210/11
?111/11
sauf que la réponse la plus votée du moment revient210/11
, donc je vous laisse choisir pour éviter d'invalider les réponses existantes.Réponses:
Wolfram Language (Mathematica) , 59 octets
Essayez-le en ligne!
Explication
Trouvez les chiffres décimaux de l'entrée.
S'il y a des chiffres qui se répètent,
RotateLeft
eux. (List@@#
empêche le code de tenter de faire pivoter le dernier chiffre décimal si le nombre rationnel se termine).Convertissez en rationnel.
la source
Gelée ,
36323130 octets-1 octet merci à Erik l'Outgolfer !
Essayez-le en ligne!
Doit être correct. L'imprécision en virgule flottante ajoute 3 octets pour
+.Ḟ
.Dépend de l'entrée irréductible.
Explication
Cela repose sur:
n/d
dans sa forme la plus simple. Ensuite, le lienọ2,5Ṁ
appliquéd
donnera le nombre de chiffres non périodiques après le point de radix.la source
Python 2 ,
237235214 octets-21 octets grâce à M. Xcoder
Essayez-le en ligne!
L'entrée se fait comme un tuple
(numerator, denominator)
; la sortie est unfractions.Fraction
objet.Cela utilise une méthode de style à longue division pour obtenir les chiffres de début et de répétition de la réponse, puis déplace le premier chiffre de répétition à la fin et utilise la manipulation de chaînes et
fraction.Fraction
pour la reconvertir en un rapport.Version non golfée:
la source
Python 3 ,
177173169 169 octetsEssayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
7067 octetsMerci à cette astuce (maintenant supprimée) pour -3 octets!
Essayez-le en ligne!
Un port de mon réponse Jelly . Plus long que la réponse Mathematica existante de 8 octets ...
La fonction prend 2 entrées
[denominator, numerator]
, telles queGCD[denominator, numerator] == 1
.la source
Perl 6 , 102 octets
Essayez-le
Prend un nombre Rational et renvoie un nombre Rational ou Int .
Étendu:
Remarque gérera les dénominateurs jusqu'à
uint64.Range.max
gérer les dénominateurs plus grands. UtilisezFatRat(9 x$1.chars)
Try it .la source