Diese Frage muss sich nicht nur auf das Beenden von Dezimalstellen beziehen - wiederholte Dezimalstellen können auch über einen Algorithmus in Brüche umgewandelt werden.
Ihre Aufgabe ist es, ein Programm zu erstellen, das eine wiederholte Dezimalzahl als Eingabe verwendet, und den entsprechenden Zähler und Nenner (in niedrigsten Ausdrücken) auszugeben, der diese Dezimalerweiterung erzeugt. Brüche größer als 1 sollten als ungeeignete Brüche wie dargestellt werden 9/5
. Sie können davon ausgehen, dass der Eingang positiv ist.
Die wiederholte Dezimalzahl wird in folgendem Format angegeben:
5.3.87
mit allem, was nach dem zweiten Punkt wiederholt wird, wie folgt:
5.3878787878787...
Ihr Programm gibt zwei durch einen Schrägstrich getrennte Ganzzahlen aus, die den Zähler und den Nenner darstellen (oder die entsprechende Form in Ihrer Sprache, wenn Sie keinen einfachen Text ausgeben):
889/165
Beachten Sie, dass beim Beenden von Dezimalstellen nach dem zweiten Punkt nichts angezeigt wird und bei Dezimalstellen ohne nicht wiederholten Dezimalstellen zwischen den beiden Punkten nichts angezeigt wird.
Testfälle
Diese Testfälle decken alle erforderlichen Eckfälle ab:
0..3 = 1/3
0.0.3 = 1/30
0.00.3 = 1/300
0.6875. = 11/16
1.8. = 9/5
2.. = 2/1
5..09 = 56/11
0.1.6 = 1/6
2..142857 = 15/7
0.01041.6 = 1/96
0.2.283950617 = 37/162
0.000000.1 = 1/9000000
0..9 = 1/1
0.0.9 = 1/10
0.24.9 = 1/4
Wenn Sie möchten, können Sie auch davon ausgehen, dass Brüche ohne ganzzahlige Teile nichts links vom ersten Punkt haben. Sie können das mit diesen optionalen Testfällen testen:
.25. = 1/4
.1.6 = 1/6
..09 = 1/11
.. = 0/1
quelle
9/99
?(in lowest terms)
dh der Bruch muss vereinfacht werden.13
statt ausgeben13/1
?1.9999...
und Ausgabe zu behandeln2/1
1.9999.
ist19999/10000
, um2/1
dich zu holen1..9
, nicht wahr ?Antworten:
Dyalog APL (
75736968 Zeichen)Hier ist ein weiterer und fünfter Versuch (höchstwahrscheinlich mein letzter); Ich habe den Tag damit verbracht, einen Code zu schreiben, der kürzer als 80 Zeichen ist und den Regeln entspricht. Diese Herausforderung machte meinen Tag!
Endlich habe ich eine APL-Zeile mit 75 Zeichen erhalten, die mit Dyalog APL funktioniert (aber nicht auf der Online-Interpreterseite, da die
⍎
Ausführungsfunktion verwendet wird). Dies ist die folgende:Natürlich könnte ich es etwas kürzer machen, aber die Sonderfälle, in denen ein, zwei oder drei Felder fehlen. Mein Code kann sogar den
..
Eingabefall verarbeiten.Ich weiß, dass APL schwer zu lesen ist, und da die Leute gerne verstehen, wie ein Teil des Codes tatsächlich funktioniert, hier einige Erklärungen. Grundsätzlich berechne ich den letzten Nenner in der Variablen D und den letzten Zähler in der Variablen N.
APL wird von rechts nach links analysiert.
I←
) gespeichert .P←'.'=
) genannt. Zum Beispiel wird '1.2.3' auf 0 1 0 1 0 abgebildet.10⊥
); jetzt ist '1.2.3' 1010.1-⍨
oder mit¯1+
, hier habe ich die zweite gewählt). Jetzt ist '1.2.3' 1009.⍕
) umgewandelt, zwei Anfangsziffern werden entfernt (2↓
), was in unserem anfänglichen '1.2.3'-Beispiel 09 ergibt; Die Zeichenfolge ist umgekehrt (⌽
).'0',
aber ich habe es getan, um einen Fehler zu vermeiden, wenn das zweite und dritte Feld beide leer sind. Die Zeichenfolge wird zurück in eine Zahl (⍎
) konvertiert und in D gespeichert, was der Nenner ist, außer wenn beide letzten Felder leer sind, da in diesem Fall D gleich 0 ist.D←D+0=
des Codes hat D auf 1 gesetzt, wenn es aktuell null ist, und jetzt enthält D den Nenner (jedoch vor der GCD-Division).×
) mit dem Inhalt der Anfangszeichenfolge I bis zu dem zweiten Punkt, mit(⍎'0',I/⍨2>+\P)
dem wieder bei P begonnen wird (0 1 0 1 0 in meinem Beispiel), addiert die aufeinanderfolgenden Zahlen, indem sie kumuliert werden (was 0 1 1 2 ergibt 2 in meinem Beispiel), überprüfen Sie, welche Werte kleiner als 2 sind (was den Booleschen Vektor zu 1 1 1 0 0 macht), und nehmen Sie die entsprechenden Zeichen in I; Eine weitere 0 wird vor der Zeichenfolge hinzugefügt, um eine weitere Überfüllung zu verhindern (wenn die beiden Anfangsfelder leer sind), und das Ganze wird in eine Zahl umgewandelt.(⍎'0',1↓I/⍨2=+\P)
, wobei P erneut verwendet wird, indem erneut kumuliert wird, überprüft wird, welche Werte gleich 2 sind (siehe vorherige Erläuterung), die Zeichen verwendet werden und der erste Punkt entfernt wird , fügt ein vorbeugendes Anfangszeichen 0 hinzu und wandelt es in eine Zahl um.edit: Hier ist ein Fix für 73 Zeichen:
Die Idee dieses Hacks ist, zunächst den Fall zu berechnen, in dem die kumulative Addition Werte gleich 2 hat, diese für später zu speichern und diese bitweise Maske zu invertieren, um den ersten Fall zu erhalten. Die Berechnung des nächsten Falls erfordert daher weniger Zeichen.
Bearbeiten: Hier ist eine weitere Korrektur für 69 Zeichen:
Die Idee dieses Hacks ist es, den kompliziertesten Sonderfall als APL-Code in die zu bewertende Zeichenfolge einzubetten (bei der Konvertierung von Zeichenfolge zu Zahl).
Bearbeiten: Hier ist eine weitere Korrektur für 68 Zeichen:
Die Idee dieses Hacks ist es, das Hinzufügen von -1 zu dem Wert zum Subtrahieren von 1 zu diesem Wert durch die Operation zum Subtrahieren dieses Werts zu 1 zu ersetzen und später ein Zeichen mehr am Anfang zu entfernen (dies ist das Minuszeichen).
bearbeiten: Kosmetische Veränderung:
Keine Größenverbesserung, aber zufriedener damit, die maximale Funktion aus dem zu bewertenden Code herauszuholen.
quelle
INVALID TOKEN
. Wissen Sie, warum?I
): siehe diesen PermalinkPerl 6 (
93101100806866 Bytes)Die Größe wurde erhöht, um nichts zu handhaben, anstatt nur zu versagen. Mouq hat die Verwendung vorgeschlagen
$/
, daher wird sie jetzt verwendet, und der Code ist 20 Byte kürzer. Ayiko vorgeschlagen Ersetzen/
mit, so dass der Code noch kürzer ist (von 12 Bytes). Dann Mouq vorgeschlagen ersetzt
chars
mitcomb
(in numerischem Kontext, sie sind identisch, weil die Liste der Zeichen nach der Umwandlung in Anzahl Anzahl der Zeichen ist).Beispielausgabe:
quelle
0..09
kehrt zurück1/11
,0.0.09
kehrt aber zurück1/110
.0.1 + 0.2 == 0.3
in Perl 6.$/=split ".",get;say join "/",($0+($1+$2/(9 x chars $2 or 1))/10**$1.chars).nude
:)J (
859089 Zeichen)Meine ursprüngliche Funktion, die 5 Zeichen kürzer als die zweite war, hatte ein paar Fehler: Sie gab keine Ganzzahlen als "n / 1" aus und gab die falsche Antwort auf Zahlen mit mehr als einem Dutzend oder so Ziffern. Hier ist eine korrigierte Funktion in J, die auch den Vorschlag von Eelvex enthält, ein Zeichen zu speichern:
Es empfängt eine Zeichenfolge und gibt eine Zeichenfolge zurück. Hier ist eine Beispielsitzung:
quelle
0/1
3/1
('0','x',~])
und speichern Sie ein Byte.C 171
Ziemlich lange. Könnte weiter reduziert werden. Nein
scanf
, die wirklich nicht damit umgehen können, wenn zwischen den Punkten keine Zahlen stehen. Neinstrtol
. Nur Zahlen knacken:Prüfung:
quelle
DC (nicht ganz allgemein, auf 76 Zeichen gekürzt)
Nicht ganz allgemein, aber bitte denken Sie daran, dass ich es mit einem der ältesten Dinge der Welt gemacht habe:
Bearbeiten: Ich bearbeite meine Lösung. es ist nicht allgemeiner, aber etwas kürzer:
Verwenden Sie es als:
Das erste Feld ist nicht erforderlich:
ist in Ordnung.
Zweites und durstiges Feld erfordern mindestens eine Ziffer
quelle
Javascript, 203
Viel zu lang, aber trotzdem lustig. Zeilenumbrüche, da Semikolons nicht lesbar sind.
quelle
889/NaN
wenn ich renne5.3.87
... Mache ich etwas falsch?"889/165"
in die Konsole. Wie läuft es? @rafaelcastrocoutob=1
Teil nach innen bewegenprompt()
.f=(P(10,s[2].length)-1)*P(10,l),f=f?f:1
=>f=(P(10,s[2].length)-1)*P(10,l)||1
J (andere Methode)
Eine andere Lösung basiert auf einer ganz anderen Methode; diesmal ist es ganz allgemein; Es fehlt nur der 1-Nenner, wenn eine Ganzzahl übergeben wird:
quelle
GolfScript (67 Zeichen)
NB Dies unterstützt leere ganzzahlige Teile.
Wenn die Zeichenfolge der Form ist ,
'n.p.q'
dann ist der Wert ,n + p/E + q/(DE) = ((nD + p)E + q)/DE
woD = 10^(len p)
undE = 10^(len q) - 1
, außer wennlen q = 0
, in welchem FallE = 1
(zu vermeiden Division durch 0).Präparation:
Online-Demo, bei der das Programm nacheinander mit jedem Testeingang ausgeführt wird.
quelle
0.1.
Python
Keine Bibliotheken - 156 Zeichen
Verwenden von
fractions
- 127 Zeichenquelle
fractions
Version gibt Dinge wie "Bruch (7, 5)" anstelle von "7/5" aus, nicht wahr?_=lambda a,b:b and _(b,a%b)or a;a,b,c=raw_input().split('.');d,e=int(a+b+c)-bool(c)*int(a+b),
ValueError: need more than 1 value to unpack
print
nutztstr
bei Verfügbarkeit nichtrepr
. Dies ist die Ausgabe auf meinem Ende: puu.sh/7w64w.png_=lambda a,b:b and _(b,a%b)or a;a,b,c=raw_input().split('.');d,e=int(a+b+c)-bool(c)*int(a+b),(10**len(c)-bool(c))*10**len(b);f=_(d,e);print'%i/%i'%(d/f,e/f)
sollte alles in einer Zeile gehen.Mathematica, 143
Wie üblich bietet Mathematica viele Funktionen auf hoher Ebene, um die Aufgabe zu erledigen, gibt ihnen jedoch ausführliche Namen.
Beispielausgabe, die später hinzugefügt wird, wenn ich Zeit habe.
quelle
n/1
, dass er reduziert wirdn
? Ich werde die zusätzlichen ~ 50 Bytes hinzufügen, um die Ganzzahlen später zu konvertieren.FromDigits
also habe ich beschlossen, es auch zu posten.Rubin - 112
Dies ist mein erstes Experiment mit Ruby. Sie können also jederzeit Verbesserungen vorschlagen.
quelle
If you wish
. Ich möchte nicht, also unterstütze ich keine Brüche ohne 1. oder 3. Zifferngruppe. Ich unterstütze jedoch Brüche ohne 2. Zifferngruppe, was der Spezifikation entspricht.C 164
Dies ähnelt der C-Lösung von orion, obwohl ich es von Grund auf getan habe. Ich gestehe jedoch, einige seiner Optimierungen gestohlen zu haben. Es ist nicht viel kürzer, aber es verarbeitet 0,25. = 1/4 und 0,000000,1 = 1/9000000.
quelle
Zwei Python-Antworten ohne Bibliotheken. First behandelt die optionale Eingabe ohne eine Ziffer vor der ersten. und ist 162 Zeichen
Der zweite behandelt nichts vor der ersten Ziffer, behandelt aber alle erforderlichen Eingaben korrekt und hat 150 Zeichen
quelle
Haskell
quelle
span
s zu implementieren, kurze Aliase für Funktionen hinzuzufügen und wenn möglich Leerzeichen zu entfernen.import Data.Ratio v=span(/='.');w=tail;l=length;f n=(r x)%1+(r y)%p+(r z)%((10^t-1)*p)where{(x,b)=v n;(y,d)=v(w b);z=w d;p=10^(l y);r""=0;r n=read n;t=if null z then 9 else l z}
- 178 Zeichen, unten von 321. NBTrue
ist ein Synonym fürotherwise
,null z
istlength z==0
JavaScript (ECMASCript 6)
180175Es ist zwar kein klarer Gewinner für die 300-Kopfgelder ... aber dies ist die kürzeste, die ich mir einfallen lassen kann:
P
Funktion, indem diese in geändert wird,+("1e"+a)
anstattMath.pow(10,a)
ein paar weitere Zeichen zu speichern ...quelle
Mathematica 175
Der größte Teil der Routine wird zum Massieren der Eingabe ausgeführt. Ungefähr 50 Zeichen wurden für die Verarbeitung ganzer Zahlen verwendet.
Beispiele
Mehr Beispiele:
Wie es normalerweise in Mathematica geschehen würde
FromDigits
kann einen Bruch direkt aus einer wiederkehrenden wiederholten Dezimalstelle erhalten, vorausgesetzt, die Eingabe hat eine bestimmte Form. Ganzzahlen werden als Ganzzahlen angezeigt.quelle
J (96 Zeichen)
Ich verwende das Schrägstrichsymbol nicht als Trennzeichen (aber in Mathematica auch nicht, da es eine grafische Darstellung verwendet, die sowieso besser ist). In der Sprache J wird der Bruch mit
r
stattdessen wie folgt angezeigt/
:quelle
APL (nicht ganz allgemein)
Nicht ganz allgemein (wie meine Lösung für DC); funktioniert mit Dyalog APL (aber nicht in der Online-Version von Dyalog APL, nicht sicher warum):
Das erste Feld ist optional, für beide anderen Felder ist jedoch mindestens eine Ziffer erforderlich.
quelle
JavaScript (189)
Beispiel:
Eingang:
Ausgabe:
quelle
C (420 Zeichen wie geschrieben; weniger nach dem Entfernen unnötiger Leerzeichen)
Beachten Sie, dass dies 64-Bit voraussetzt
long
(z. B. 64-Bit-Linux).0.2.283950617
Auf Systemen mit 32-Bit-Version schlägt der Test fehllong
. Dies kann auf Kosten einiger Zeichen behoben werden, indem der Typ auflong long
und dieprintf
Formatzeichenfolge entsprechend geändert werden.quelle
'0'
zu48
.switch
Anweisung als neu schreibenif(c==46) n[++i]=1; else d[i]=10*d[i]+c-48,n[i]*=10;
.GTB , 81
Beispiel
quelle
GTB
Link oben, wenn Sie mir nicht glauben. Sie erhalten ein paar komprimierte Dateien für ein proprietäres Programm, suchen dann nach diesem Programm und stellen fest, dass die Website, die angibt, einen Download bereitzustellen, diese als nicht verfügbar bezeichnet. Wie kompilieren wir es?