introduction
Une décimale se termine si elle a un nombre fini de chiffres décimaux. Par exemple, 0.4 (2/5) se termine car il a un chiffre décimal.
Une décimale est purement périodique si elle a un nombre infini de chiffres décimaux et n'a pas de chiffres décimaux avant sa répétition (la partie de la décimale qui se répète.) Par exemple, 0,142857142857142… (1/7) est purement périodique car elle a une répétition 142857, qui commence à se répéter immédiatement après la virgule décimale.
Une décimale est finalement périodique si elle a un nombre infini de chiffres décimaux et a un nombre fini de chiffres décimaux avant sa répétition (la partie de la décimale qui se répète.) Par exemple, 0.16666666666666666… (1/6) est finalement périodique parce que son repetend 6 commence à se répéter après un 1.
Ta tâche
Écrivez un programme ou une fonction qui, lorsque les nombres p et q (nombres entiers, 0 <= p < q <= 100), détermineront si la représentation décimale de p / q se termine, purement périodique ou éventuellement périodique.
Vous devez sortie a
si elle est Terminating (soit 0,1), b
si elle est Purement périodique (c. -à 0,333 ...), ou c
si elle est finalement périodique (c. -à 0,166 ...), où a
, b
et c
sont des chaînes distinctes, constantes de votre choix.
Cas de test
0/1 => Terminating
0/2 => Terminating
1/2 => Terminating
0/3 => Terminating
1/3 => Purely Periodic
2/3 => Purely Periodic
0/4 => Terminating
1/4 => Terminating
2/4 => Terminating
3/4 => Terminating
0/5 => Terminating
1/5 => Terminating
2/5 => Terminating
3/5 => Terminating
4/5 => Terminating
0/6 => Terminating
1/6 => Eventually Periodic
2/6 => Purely Periodic
3/6 => Terminating
4/6 => Purely Periodic
5/6 => Eventually Periodic
0/7 => Terminating
1/7 => Purely Periodic
2/7 => Purely Periodic
3/7 => Purely Periodic
4/7 => Purely Periodic
5/7 => Purely Periodic
6/7 => Purely Periodic
0/8 => Terminating
1/8 => Terminating
2/8 => Terminating
3/8 => Terminating
4/8 => Terminating
5/8 => Terminating
6/8 => Terminating
7/8 => Terminating
0/9 => Terminating
1/9 => Purely Periodic
2/9 => Purely Periodic
3/9 => Purely Periodic
4/9 => Purely Periodic
5/9 => Purely Periodic
6/9 => Purely Periodic
7/9 => Purely Periodic
8/9 => Purely Periodic
0/10 => Terminating
1/10 => Terminating
2/10 => Terminating
3/10 => Terminating
4/10 => Terminating
5/10 => Terminating
6/10 => Terminating
7/10 => Terminating
8/10 => Terminating
9/10 => Terminating
0/11 => Terminating
1/11 => Purely Periodic
2/11 => Purely Periodic
3/11 => Purely Periodic
4/11 => Purely Periodic
5/11 => Purely Periodic
6/11 => Purely Periodic
7/11 => Purely Periodic
8/11 => Purely Periodic
9/11 => Purely Periodic
10/11 => Purely Periodic
0/12 => Terminating
1/12 => Eventually Periodic
2/12 => Eventually Periodic
3/12 => Terminating
4/12 => Purely Periodic
5/12 => Eventually Periodic
6/12 => Terminating
7/12 => Eventually Periodic
8/12 => Purely Periodic
9/12 => Terminating
10/12 => Eventually Periodic
11/12 => Eventually Periodic
0/13 => Terminating
1/13 => Purely Periodic
2/13 => Purely Periodic
3/13 => Purely Periodic
4/13 => Purely Periodic
5/13 => Purely Periodic
6/13 => Purely Periodic
7/13 => Purely Periodic
8/13 => Purely Periodic
9/13 => Purely Periodic
10/13 => Purely Periodic
11/13 => Purely Periodic
12/13 => Purely Periodic
0/14 => Terminating
1/14 => Eventually Periodic
2/14 => Purely Periodic
3/14 => Eventually Periodic
4/14 => Purely Periodic
5/14 => Eventually Periodic
6/14 => Purely Periodic
7/14 => Terminating
8/14 => Purely Periodic
9/14 => Eventually Periodic
10/14 => Purely Periodic
11/14 => Eventually Periodic
12/14 => Purely Periodic
13/14 => Eventually Periodic
0/15 => Terminating
1/15 => Eventually Periodic
2/15 => Eventually Periodic
3/15 => Terminating
4/15 => Eventually Periodic
5/15 => Purely Periodic
6/15 => Terminating
7/15 => Eventually Periodic
8/15 => Eventually Periodic
9/15 => Terminating
10/15 => Purely Periodic
11/15 => Eventually Periodic
12/15 => Terminating
13/15 => Eventually Periodic
14/15 => Eventually Periodic
Vous pouvez trouver tous les cas de test ici .
Vous êtes autorisé à choisir vos propres 3 valeurs pour la sortie, mais il doit être clair quant à laquelle il s'agit.
N'oubliez pas qu'il s'agit de code-golf , donc le code avec le plus petit nombre d'octets l'emporte.
Astuces
Résiliation:
La factorisation principale du dénominateur d'une décimale terminale sous sa forme la plus simple se compose uniquement de 2 et de 5.
Purement périodique:
La factorisation première d'un dénominateur décimal purement périodique sous sa forme la plus simple n'inclut aucun 2 ou 5.
Eventuellement périodique:
La factorisation principale d'un dénominateur décimal éventuellement périodique sous sa forme la plus simple comprend au moins un 2 ou 5, mais comprend également d'autres nombres.
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Réponses:
Gelée , 10 octets
Accepte le dénominateur et le numérateur (dans cet ordre) comme arguments. Renvoie 0 pour terminer, 1 pour purement périodique et 2 pour éventuellement périodique. Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
JavaScript (ES6),
70..6853 octetsRenvoie 0 pour terminer, vrai pour purement périodique et faux pour éventuellement périodique.
Comment ça marche
Ce que nous faisons ici est en fait de simuler une division à la main:
a?...:0
- Si le numérateur est nul, nous nous arrêtons ici et revenons0
. La séquence se termine .(s[a]^=a)?...:x==a
- Si nous avons déjà rencontré ce numérateur auparavant, cela signifie que la séquence est périodique et va se répéter pour toujours. Nous nous arrêtons ici et retournons soittrue
sia
est égal à la première valeurx
de la séquence ( purement périodique ) oufalse
si ce n'est pas ( éventuellement périodique ).f(a*10%b,b,s,x||a)
- Sinon, on multiplie le numérateura
par 10. On calcule le reste de la division par le dénominateurb
. Et nous répétons le processus en utilisant ce reste comme nouveau numérateur. (Nous transmettons égalementa
la première valeur de la séquence si elle n'est pas déjà stockée dansx
.)Exemple
la source
Python,
626159 octetsImprime 1 pour éventuellement périodique, 2 pour purement périodique et 4 pour terminer.
Vérifiez tous les tests sur repl.it .
la source
*r
-il?f(1, *(2, 3), 4)
est équivalent àf(1, 2, 3, 4)
.f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
in
sert un but très différent en JS qu'en Python):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)
cela fonctionnerait aussi.Perl,
494645 octetsComprend +3 pour
-p
Basé sur l' idée élégante de Dennis mais mis en œuvre de manière périlleuse
Donner des numéros d'entrée sur STDIN
termninating.pl
:Imprime un 2 s'il se termine. 1 si périodique et rien si éventuellement périodique
la source
Lot, 247 octets
Utilise mon astuce rapide gcd10 de Fraction à la décimale exacte . Évidemment, je pouvais enregistrer un tas d'octets en utilisant un format de sortie personnalisé.
la source
@if %d%==1 (echo T)else if %d%==%e% (echo P)else echo E
pour économiser 42 octets?JavaScript (ES6),
91888579757478 octetsSorties
NaN
de terminaison,1
purement périodiques etInfinity
éventuellement périodiques.Extrait de test
Afficher l'extrait de code
Explication
Premièrement, nous divisons à la fois n et d par pgcd (d, n) , pour réduire la fraction à sa forme la plus simple. Cela nous permet d'éviter des situations comme 2/6 où le résultat serait autrement calculé comme purement périodique. Nous définissons également la variable t comme pgcd (d, 10) ; cela sera utilisé plus tard.
La première vérification est de savoir si n est 0 ou d est 1 . Si n * (d-1) vaut 0, on retourne
+f
, ou NaN : la fraction se termine .La prochaine vérification est de savoir si t est 1 . Si c'est le cas, nous retournons 1 : la fraction est purement périodique .
Si t n'est pas 1 , nous divisons d par t , exécutons à nouveau la fonction entière et divisons par 0. Si n / (d / t) se termine, cela renvoie NaN / 0 = NaN : la fraction se termine . Sinon, elle renvoie 1/0 = Infinity : la fraction est finalement périodique .
la source
Infinity
pour toutes ces valeurs.n
... Merci de l'avoir signalé.Mathematica, 41 octets
Sort
{3,1,2}
si l'entrée a une expansion décimale terminale,{2,3,1}
si l'entrée a une expansion décimale purement périodique et{3,2,1}
si l'entrée a une expansion décimale éventuellement périodique.Basé sur l'astuce sournoise: si
d
est le dénominateur d'une fraction en termes les plus bas, alors le plus grand diviseur commun ded
et10^d
est égal àd
sid
n'a que 2s et 5s dans sa factorisation principale; est égal à1
sid
n'a ni 2 ni 5 dans sa factorisation principale; et est égal à un entier entre ifd
a 2s / 5s et d'autres nombres premiers.La
Ordering
fonction indique simplement où se trouvent les éléments les plus petits, les plus petits et les plus grands du triple, avec des liens rompus de gauche à droite.Flaw: renvoie la sortie de la variante
{1,2,3}
au lieu de{3,1,2}
si l'entrée est 0.Mathematica, 46 octets, pervers
Renvoie
a[[1]]
si l'entrée a une expansion décimale terminale,b[[1]]
si l'entrée a une expansion décimale purement périodique etb[a]
si l'entrée a une expansion décimale éventuellement périodique. Lance une erreur dans tous les cas!Comme ci-dessus, nous voulons savoir si ce plus grand diviseur commun est égal à 1, d ou quelque part entre les deux. Le logarithme en base d de ce pgcd est égal à 0, 1, ou quelque chose entre les deux.
Maintenant, nous commençons à torturer Mathematica.
b[a][[n]]
désigne lan
partie e de l'expressionb[a]
.b[a][[1]]
Retourne donca
;b[a][[0]]
retourneb
; etb[a][[x]]
, oùx
est un nombre compris entre 0 et 1, oblige Mathematica à renvoyer l'erreur "Part :: pkspec1: l'expressionx
ne peut pas être utilisée comme spécification de pièce." et retourne nonb[a][[x]]
évalué.Cela distingue déjà les trois cas de manière appropriée, sauf que la sortie du cas éventuellement périodique est
b[a][[x]]
, ce qui n'est pas constant carx
c'est le logarithme réel de quelque chose. Nous appliquons[[1]]
donc les sorties déjà décrites. En raison de la façon dont Mathematica représente en interneb[a][[x]]
, le résultatb[a][[x]][[1]]
est simplementb[a]
. D'un autre côté, l'application[[1]]
auxa
résultats génère une erreur différente "Part :: partd: la spécification de pièce a [[1]] est plus longue que la profondeur de l'objet." et retourne nona[[1]]
évalué (et de même pourb
).Défaut: ment à propos de l'entrée 0, renvoyant à la
b[a]
place dea[[1]]
.la source
C 173 octets
Prend deux entiers de stdin, affiche 1 pour purement périodique, -1 pour éventuellement périodique et 0 pour terminer.
Non golfé:
Semi-golf:
la source
En fait , 15 octets
Ceci est basé sur la réponse Jelly de Dennis . 0 se termine, 1 est purement périodique et 2 est finalement périodique. Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
la source
Mathematica, 44 octets
Renvoie
Null
pour Terminer,True
pour purement périodique etFalse
pour éventuellement périodique.Explication
Trouvez l'expansion décimale de N. (les chiffres répétés sont entourés d'une tête supplémentaire
List {}
).Vérifiez si le dernier élément de l'expansion décimale est a
List
.Si la condition ci-dessus est
True
, vérifiez si l'expansion décimale entière consiste en une chose. (AList
compte comme une entité). (retourneTrue
ouFalse
)(Si la condition est
False
, alors aNull
est retourné car il n'y a pas de troisième argument pourIf
)la source
Pyth ,
3127 octetsContribution
Vous pouvez l'essayer ici . Imprime 1 pour éventuellement périodique, 2 pour purement périodique et 0 pour terminer. C'est ma première réponse en codegolf. Toutes suggestions sont les bienvenues.
Explication
Notez que [2,3] filtré par [2,5] = [2] mais [2,3,5] - [2,5] = [3].
la source
PARI / GP, 64 octets
N'affiche rien pour terminer, 0 pour purement et 1 pour éventuellement périodique.
Pas très chic, j'espérais quelque chose de mieux quand j'ai commencé.
la source
05AB1E ,
1611 octets5 octets enregistrés grâce à @Adnan!
Imprime 0 pour purement périodique, 1 pour terminer et 10 pour éventuellement périodique.
Explication:
L'entrée est considérée comme p newline q .
Essayez-le en ligne!
la source
I
. De plus, une constante prédéfinie à10
estT
. Pareil pour2B
, qui estb
:).¿²r/fTrÖbÙJ
comme code final :).PHP, 126 octets
Imprime 0 pour terminé et 1 pour purement périodique 2 pour éventuellement. Permettez-moi de vous expliquer si un numérateur est deux fois dans le tableau commence ici la session périodique si elle est terminée, la
echo end($a);
valeur est0
Si vous ne me faites pas confiance, mettez$t=count($a)>$d?2:0;
dans la bouclePour le rendre plus clair, veuillez ajouter
print_r($a);
ouvar_dump($a);
oujson_encode($a);
après la bouclevous pouvez voir un numérateur deux fois ou un zéro à la fin du tableau si un numérateur est deux fois compter les éléments entre les deux éléments et vous pouvez obtenir la longueur du périodique et vous pouvez voir la position par le premier numérateur où le périodique commence
Donc, après cela, nous pouvons trouver la position et la longueur de la séquence périodique avec
if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}
Visualisez le périodique
Sortie visualiser le terme périodique
Une autre façon avec 130 octets
Version étendue
la source
[3,30,35,32,2,20,41,39,19,31,45,26,48,3]