Schreiben Sie ein Programm oder eine Funktion, die mit zwei Ganzzahlen a, b eine Zeichenfolge ausgibt, die eine Dezimalzahl enthält, die den Bruch a / b genau darstellt .
Wenn a / b eine Ganzzahl ist, geben Sie einfach den Wert ohne Dezimalpunkt oder führende Nullen aus:
123562375921304812375087183597 / 2777 -> 44494913907563850333124661
81 / 3 -> 27
-6 / 2 -> -3
Wenn a / b keine Ganzzahl ist, sondern eine endliche Darstellung in der Basis 10 hat, geben Sie den Wert ohne führende oder nachfolgende Nullen aus (mit Ausnahme einer einzelnen Null vor dem Punkt):
1 / 2 -> 0.5
3289323463 / -250000000 -> -13.157293852
Schließlich wird , wenn , und nur wenn (also keine 0.999...
) a / b nicht ganze Zahl ist , und nicht über eine finite Darstellung, die endliche Ausgangsteil , gefolgt von der sich wiederholenden Teil in Klammern. Der sich wiederholende Teil muss so klein wie möglich sein und so früh wie möglich beginnen.
-1 / 3 -> -0.(3)
235 / 14 -> 16.7(857142)
123 / 321 -> 0.(38317757009345794392523364485981308411214953271028037)
355 / 113 -> 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)
Ihr Programm muss auf einem modernen Desktop-PC in weniger als 10 Sekunden für alle oben genannten Beispiele funktionieren. Das kleinste Programm in Bytes gewinnt.
Antworten:
Perl 6 ,
63 5850 BytesProbier es aus
Wenn es Ihnen egal ist, dass es nur mit Nennern funktioniert, die in eine 64-Bit-Ganzzahl passen, kann es auf nur 43 Byte verkürzt werden:
Erweitert:
quelle
Python 2, 174 Bytes
Ich bin nicht ganz überzeugt von der Gültigkeit dieser Antwort, aber es hat für die obigen Testfälle und andere Testfälle funktioniert, die ich darauf geworfen habe. Es sieht allerdings nach einem richtigen Durcheinander aus, daher bin ich mir sicher, dass es viel Platz zum Golfen gibt.
Bei der Ersteinrichtung werden für beide Argumente Absolutwerte verwendet, um sicherzustellen, dass es sich um nichtnegative Zahlen handelt (die Vorzeichenberechnung wird für später gespeichert), und der Quotiententeil des Ergebnisses wird an Pythons Arithmetik mit willkürlicher Genauigkeit delegiert. Der Bruchteil wird mit dem Algorithmus der Grundschuleinteilung erledigt, bis wir im Rest eine Wiederholung erhalten. Wir schauen dann nach, wann wir diese Wiederholung das letzte Mal gesehen haben, um den Punkt zu erhalten, und konstruieren den String entsprechend.
Beachten Sie, dass der Algorithmus aufgrund der O (n) -Operation eigentlich ziemlich langsam ist
in
, aber für die Beispiele schnell genug.quelle
Batch,
349344 BytesBearbeiten: 5 Bytes durch Entfernen unnötiger Zeichen gespeichert. "Ungolfed":
quelle
set /a
.Java,
625605Golf Code:
Hinweis: Ich zähle den statischen Import als Teil der Funktion für Golfzwecke.
Diese Funktion beginnt mit dem Divisionsergebnis. Bei Bedarf werden der ganzzahlige Teil und das Vorzeichen hinzugefügt. Wenn es dann einen Rest gibt, führt es eine lange Division der Basis 10 durch. Führen Sie bei jedem Schritt die Unterteilung durch. Speichern Sie die berechnete Ziffer und den Rest in zwei Listen. Wenn wir wieder auf dieselbe Ziffer und denselben Rest stoßen, gibt es einen wiederholten Teil und wir wissen, bei welchem Index er beginnt. Der Code fügt entweder die Ziffern (keine Wiederholung) oder die Vorwiederholungsziffern und dann die in Klammern gesetzten Wiederholungsziffern hinzu.
Dies ist vor allem wegen ein bisschen groß
BigInteger
. Wenn die Eingänge nicht einmal übergelaufen sindlong
, könnte es etwas kürzer sein. Ich gehe jedoch davon aus, dass es Möglichkeiten gibt, diesen Eintrag zu verbessern.Ungolfed Code mit Hauptmethode zum Testen:
Programmausgabe:
quelle
a, BigInteger
. Ich denke auch du könntest aliasBigInteger.TEN
undBigInteger.ZERO
.while (true)
->,for (;;)
die es mir auch ermöglichten, Dinge in denfor
Initialisierer einzufügen und ein weiteres Byte zu speichern.BigInteger
mein Code acht Instanzen , und ich sehe nicht, wie es sich auszahlt, wenn ich mehr Code hinzufüge, um sie auf einen einzelnen Zeichenklassennamen zu verkleinern. Und mit Sicherheit Code hinzufügen, um damit umzugehenint[]
(was BigInteger bereits intern tut) wird meine Antwort nur aufblähen lassen.BigInteger
Methode überschreibe , die ich aufrufe , um eine Instanz der Unterklasse zurückzugeben, mehrere Casts hinzufügen muss, die den Code weiter aufblähen. Zusätzlich zu den verschwendeten Bytes für den Overhead einer Unterklasse würde dies sicherlich die Codegröße erhöhen.PHP, 277 Bytes
quelle
Mathematica 198 Bytes
Ungolfed
Tests
{27, -27, 0,25, -4. (3), 2. (714285), 131572.93852, 16,7 (857142), 94,6 (428571)}
quelle