Einführung
Eine Dezimalstelle endet, wenn sie eine endliche Anzahl von Dezimalstellen hat. Beispielsweise endet 0,4 (2/5), weil es eine Dezimalstelle hat.
Eine Dezimalstelle ist rein periodisch, wenn sie eine unendliche Anzahl von Dezimalstellen und keine Dezimalstellen vor ihrer Wiederholung aufweist (der sich wiederholende Teil der Dezimalstelle). Beispiel: 0,142857142857142… (1/7) ist rein periodisch, weil sie eine Wiederholung aufweist 142857, die unmittelbar nach dem Komma wiederholt wird.
Eine Dezimalstelle ist schließlich periodisch, wenn sie eine unendliche Anzahl von Dezimalstellen und eine endliche Anzahl von Dezimalstellen vor ihrer Wiederholung aufweist (der sich wiederholende Teil der Dezimalstelle). Beispiel: 0,16666666666666666… (1/6) ist schließlich periodisch, weil seine repetend 6 beginnt nach einer 1 zu wiederholen.
Deine Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die bei Angabe der Zahlen p und q (ganze Zahlen, 0 <= p < q <= 100) bestimmt, ob die Dezimaldarstellung von p / q terminiert, rein periodisch oder schließlich periodisch ist.
Sie müssen ausgegeben , a
wenn es Terminating (dh 0,1), b
wenn es rein Periodic (dh 0,333 ...), oder c
wenn es schließlich Periodic (dh 0,166 ...), wo a
, b
und c
sind alle verschieden, konstante Strings Ihrer Wahl.
Testfälle
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
Sie können alle Testfälle finden hier .
Sie können Ihre eigenen 3 Werte für den Ausgang wählen, aber es muss klar sein, welcher es ist.
Denken Sie daran, dies ist Code-Golf , also gewinnt der Code mit der geringsten Anzahl von Bytes.
Hinweise
Beenden:
Die Primfaktorisierung des Nenners einer abschließenden Dezimalstelle besteht in einfachster Form nur aus 2s und 5s.
Rein periodisch:
Die Primfaktorisierung eines rein periodischen Dezimalnenners in einfachster Form enthält keine 2s oder 5s.
Eventuell periodisch:
Die Primfaktorisierung des Nenners einer eventuell periodischen Dezimalstelle enthält in einfachster Form mindestens eine 2 oder 5, aber auch andere Zahlen.
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu erstellen.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Antworten:
Gelee , 10 Bytes
Akzeptiert Nenner und Zähler (in dieser Reihenfolge) als Argumente. Gibt 0 zum Beenden, 1 für rein periodisch und 2 für eventuell periodisch zurück. Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
JavaScript (ES6),
70..6853 BytesGibt 0 zum Beenden zurück, true für rein periodisch und false für eventuell periodisch.
Wie es funktioniert
Was wir hier tun, simuliert tatsächlich eine Teilung von Hand:
a?...:0
- Wenn der Zähler Null ist, stoppen wir hier und kehren zurück0
. Die Sequenz wird beendet .(s[a]^=a)?...:x==a
- Wenn wir diesen Zähler bereits kennen, bedeutet dies, dass die Sequenz periodisch ist und sich für immer wiederholen wird. Wir stoppen hier und kehren entweder zurück,true
wenna
der erste Wertx
der Sequenz ( rein periodisch ) oderfalse
nicht ( schließlich periodisch ) ist.f(a*10%b,b,s,x||a)
- Sonst multiplizieren wir den Zählera
mit 10. Wir berechnen den Rest der Division durch den Nennerb
. Und wir wiederholen den Vorgang, indem wir diesen Rest als neuen Zähler verwenden. (Wir übergeben aucha
als ersten Wert der Sequenz, wenn es nicht bereits in gespeichert istx
.)Beispiel
quelle
Python,
626159 BytesDruckt 1 für evtl. periodisch, 2 für rein periodisch und 4 zum Beenden.
Überprüfen Sie alle Testfälle auf repl.it .
quelle
*r
das?f(1, *(2, 3), 4)
ist äquivalent zuf(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
das in JS einen ganz anderen Zweckf=(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)
würde auch funktionieren.Perl,
494645 BytesBeinhaltet +3 für
-p
Basierend auf Dennis 'eleganter Idee, aber perlmuttartig umgesetzt
Geben Sie bei STDIN die Eingangsnummern ein
termninating.pl
:Gibt beim Beenden eine 2 aus. 1 wenn periodisch und nichts wenn schließlich periodisch
quelle
Batch, 247 Bytes
Benutzt meinen schnellen gcd10-Trick von Bruch bis zur exakten Dezimalstelle . Offensichtlich konnte ich eine Menge Bytes mit einem benutzerdefinierten Ausgabeformat speichern.
quelle
@if %d%==1 (echo T)else if %d%==%e% (echo P)else echo E
sparen Sie nicht einfach 42 Bytes?JavaScript (ES6),
91888579757478 ByteAusgänge
NaN
zum Beenden,1
für rein periodische undInfinity
für eventuell periodische.Testschnipsel
Code-Snippet anzeigen
Erläuterung
Zunächst dividieren wir sowohl n als auch d durch gcd (d, n) , um den Bruch auf seine einfachste Form zu reduzieren. Auf diese Weise vermeiden wir Situationen wie 2/6, in denen das Ergebnis ansonsten als rein periodisch berechnet würde. Wir definieren auch die Variable t als gcd (d, 10) ; Dies wird später verwendet.
Die erste Prüfung ist , ob n ist 0 oder d ist 1 . Wenn n * (d-1) 0 ist, kehren wir zurück
+f
oder NaN : Der Bruch endet .Die nächste Überprüfung ist , ob t ist 1 . In diesem Fall geben wir 1 zurück : Der Bruch ist rein periodisch .
Wenn t ist nicht 1 , teilen wir d von t , führen die gesamte Funktion wieder und Dividieren durch 0. Wenn n / (d / t) ist , beendet wird , kehrt diese NaN / 0 = NaN : Die Fraktion wird beendet . Andernfalls wird 1/0 = Unendlich zurückgegeben : Der Bruch ist schließlich periodisch .
quelle
Infinity
für alle diese Werte zurückgegeben.n
... Danke, dass du darauf hingewiesen hast .Mathematica, 41 Bytes
{3,1,2}
Wird ausgegeben, wenn der Eingang eine endende Dezimalerweiterung aufweist,{2,3,1}
wenn der Eingang eine rein periodische Dezimalerweiterung aufweist und{3,2,1}
wenn der Eingang eine eventuell periodische Dezimalerweiterung aufweist.Basierend auf dem hinterhältigen Trick: Wenn
d
der Nenner eines Bruchs in niedrigsten Begriffen ist, dann ist der größte gemeinsame Teiler vond
und10^d
gleich,d
wennd
nur 2s und 5s in seiner Primfaktorisierung enthalten sind; ist gleich,1
wennd
weder 2s noch 5s in der Primfaktorisierung enthalten sind; und entspricht einer ganzen Zahl dazwischen, wennd
2s / 5s und andere Primzahlen vorliegen.Die
Ordering
Funktion meldet nur, wo sich die kleinsten, nächstkleinsten und größten Elemente des Tripels befinden, wobei die Bindungen von links nach rechts unterbrochen sind.Fehler: Gibt die variante Ausgabe zurück,
{1,2,3}
anstatt{3,1,2}
wenn die Eingabe 0 ist.Mathematica, 46 Bytes, pervers
Gibt zurück,
a[[1]]
wenn die Eingabe eine endende Dezimalerweiterung aufweist,b[[1]]
wenn die Eingabe eine rein periodische Dezimalerweiterung aufweist undb[a]
wenn die Eingabe eine eventuell periodische Dezimalerweiterung aufweist. Wirft auf jeden Fall einen Fehler!Wie oben wollen wir wissen, ob dieser größte gemeinsame Teiler 1, d oder irgendwo dazwischen ist. Der Logarithmus zur Basis d dieses gcd ist gleich 0, 1 oder etwas dazwischen.
Jetzt fangen wir an, Mathematica zu quälen.
b[a][[n]]
bezeichnet denn
th Teil des Ausdrucksb[a]
. Alsob[a][[1]]
kehrt zurücka
;b[a][[0]]
kehrt zurückb
; undb[a][[x]]
, wox
eine Zahl zwischen 0 und 1 ist, veranlasst Mathematica, den Fehler "Part :: pkspec1: Der Ausdruckx
kann nicht als Teilespezifikation verwendet werden." und kehrtb[a][[x]]
unbewertet zurück.Dies unterscheidet die drei Fälle bereits angemessen, mit der Ausnahme, dass die Ausgabe für den schließlich periodischen Fall
b[a][[x]]
nicht konstant ist, dax
es sich um den tatsächlichen Logarithmus von etwas handelt. Dann wenden wir uns[[1]]
den bereits beschriebenen Ausgängen zu. Aufgrund der internen Darstellung von Mathematicab[a][[x]]
ist das Ergebnis vonb[a][[x]][[1]]
einfachb[a]
. Wenn Sie dagegen auf anwenden[[1]]
,a
wird ein anderer Fehler ausgegeben: "Part :: partd: Teilespezifikation a [[1]] ist länger als die Objekttiefe." und kehrta[[1]]
unbewertet (und ähnlich fürb
) zurück.Fehler: Liegt an der Eingabe 0 und kehrt
b[a]
stattdessen zurücka[[1]]
.quelle
C 173 Bytes
Nimmt zwei Ganzzahlen aus stdin, gibt 1 für rein periodisch, -1 für eventuell periodisch und 0 für das Beenden aus.
Ungolfed:
Halbgolf:
quelle
Eigentlich 15 Bytes
Dies basiert auf Dennis 'Jelly-Antwort . 0 endet, 1 ist rein periodisch und 2 ist schließlich periodisch. Golfvorschläge sind willkommen. Probieren Sie es online!
Ungolfing
quelle
Mathematica, 44 Bytes
Gibt
Null
für Terminating,True
für rein periodische undFalse
für eventuell periodische zurück.Erläuterung
Finden Sie die Dezimalerweiterung von N. (wiederholte Ziffern sind von einem zusätzlichen Kopf umgeben
List {}
).Überprüfen Sie, ob das letzte Element der Dezimalerweiterung a ist
List
.Wenn die obige Bedingung erfüllt ist
True
, überprüfen Sie, ob die gesamte Dezimalerweiterung aus einer Sache besteht. (AList
zählt als eine Einheit). (RückgabeTrue
oderFalse
)(Wenn die Bedingung lautet
False
,Null
wird a zurückgegeben, da es kein drittes Argument für gibt.If
)quelle
Pyth ,
3127 BytesEingang
Sie können es hier ausprobieren . Gibt 1 für evtl. periodisch, 2 für rein periodisch und 0 zum Beenden aus. Ich antworte zum ersten Mal mit Codegolf. Anregungen sind willkommen.
Erläuterung
Beachten Sie, dass [2,3] gefiltert nach [2,5] = [2], aber [2,3,5] - [2,5] = [3].
quelle
PARI / GP, 64 Bytes
Gibt nichts zum Beenden aus, 0 für rein und 1 für eventuell periodisch.
Nicht sehr ausgefallen, ich hoffte auf etwas Besseres, als ich anfing.
quelle
05AB1E ,
1611 Bytes5 Bytes gespart dank @Adnan!
Gibt 0 für "Nur periodisch", 1 für "Beenden" und 10 für "Eventuell periodisch" aus.
Erläuterung:
Die Eingabe erfolgt als p newline q .
Probieren Sie es online!
quelle
I
. Weiterhin vordefiniert eine Konstante10
istT
. Das Gleiche gilt für2B
, das istb
:).¿²r/fTrÖbÙJ
als endgültigen Code angeben :).PHP, 126 Bytes
Gibt 0 für beendet und 1 für rein periodisch 2 für schließlich aus. Lassen Sie mich erklären, ob ein Zähler zweimal im Array ist. Hier beginnt die periodische Sitzung, wenn sie beendet wird. Der
echo end($a);
Wert lautet0
Wenn Sie mir nicht vertrauen, geben Sie ihn$t=count($a)>$d?2:0;
in die Schleife einZur Verdeutlichung fügen Sie bitte
print_r($a);
odervar_dump($a);
oderjson_encode($a);
nach der Schleife hinzuSie können einen Zähler zweimal oder eine Null am Ende des Arrays sehen, wenn ein Zähler zweimal die Elemente zwischen den beiden Elementen zählt und Sie können die Länge der Periodik abrufen und Sie können die Position des ersten Zählers sehen, an dem die Periodik beginnt
Danach können wir die Position und die Länge der periodischen Folge mit finden
if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}
Visualisieren Sie die Zeitschrift
Ausgabe visualisieren den periodischen Term
Ein anderer Weg mit 130 Bytes
Erweiterte Version
quelle
[3,30,35,32,2,20,41,39,19,31,45,26,48,3]