Fast das Gegenteil, wenn diese Herausforderung, und ich vermute, es wird etwas einfacher sein.
Ihre Aufgabe ist es, zwei Ganzzahlen im Format a/b
(Bildung einer rationalen Zahl) zu nehmen und die Zahl dann genau dezimal auszugeben.
Wenn Sie beispielsweise eingeben 1/3
, wird Folgendes ausgegeben:
0.33333333333333333
Und würde 3s bis zum Ende der Zeit mit einer optionalen führenden 0 drucken. (Sie können auch ein Zeichen pro Zeile drucken, wenn Ihre Sprache nicht das Drucken in derselben Zeile zulässt.)
Das Verhalten für x/0
wird undefiniert sein. Für eine Zahl, die so aussieht, als würde sie sich nicht wiederholen (etwa 5/4
), wird sie tatsächlich wiederholt. Eine der beiden folgenden Formen wäre akzeptabel für 5/4
:
1.25000000000000000
1.24999999999999999
(Dasselbe mit ganzen Zahlen 1.9999999
oder 2.000000
)
Die Fraktion kann nicht in seiner einfachsten Form sein, und a
oder b
kann negativ sein (Hinweis -a/b = -(a/b)
, -a/-b = a/b
, a/-b = -a/b
, und -.6249999
ist ungültig, aber -0.6249999
akzeptabel ist , aber man kann immer noch verwenden.
quelle
bc
, oder ist das Betrug?a
und / oderb
negativ sein?a
oderb
(oder beide) können negativ sein)Antworten:
CJam,
3837 BytesWie es funktioniert
quelle
C 108,
79Bearbeiten Geändert, um mit negativen Zahlen zu arbeiten.
Eingabe von stdin. Alter K & R-Stil.
quelle
Ruby,
83691029189 BytesEinfache Implementierung einer manuellen Ganzzahldivision basierend auf der Ganzzahldivision des Computers.
Vielen Dank an @blutorange für die Hilfe beim Golfen.
Bearbeiten: Die Lösung für negative Zahlen wurde korrigiert.
quelle
->s{a,b=s.split(?/).map &:to_i;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}
Ich mag Ruby einfach.?/
, Zeichen zu bezeichnen, und wusste auch nicht , wie ich$><<
drucken sollte oder welchesloop
Schlüsselwort ich verwenden sollte . Danke vielmals!!$>
ist eine Abkürzung für$stdout
und<<
ist ein Operator. Sie können ein weiteres Byte in der zweiten Zeile speichern, indem Sie es in ändernc*d<0&&$><<?-
. ein paar Bytes durch Kombinieren der 3./4. Zeile mit$><<a/b<<?.
und eines durch Entfernen des Leerzeichens nach<<
in der letzten Zeile. Und hier ist eine Idee, um es auf 91 Bytes zu reduzieren:->s{a,b=s.scan(/\d+/).map &:to_i;1==s.count(?-)&&$><<?-;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}
(ruby 2.2.0)$><<a/b
hat nicht richtig funktioniert, deshalb habe ich das Leerzeichen dort platziert. Der Rest scheint gut zu sein, vielen Dank!Rational(2,3) == 2/3r
), das verwendet werden kann, um die zweite Zeile zu verkürzen:eval(s+?r)<0&&$><<?-
Java,
177176170Der Algorithmus ist einfach; Der schwierige Teil war, den Druck zum Laufen zu bringen. Am Ende hatte ich den Computer für eine Sekunde zwischen jedem Schritt, damit er drucken konnte.
Erweiterte, lauffähige Version
quelle
R
103137109103Etwas glücklicher jetzt damit. Durch die Verwendung von Scan mit einem Trennzeichen werden viele Bytes gespart. Möglicherweise gibt es noch Verbesserungspotenzial. Ersetzt
<-
durch=
. Ich hatte nicht immer viel Glück damit, aber diesmal hat es funktioniert.Testläufe
quelle
Python 3,
107115 BytesZiemlich einfach:
-1/3
->-0.
)* (Obwohl die Berechnung für
a
innerhalb der Schleife verschoben wurde, um ein paar Bytes zu sparen.)Bearbeiten: Fehler mit negativen Brüchen> -1 behoben.
quelle
Python 2.7, 209 Bytes
bearbeiten:
Jetzt werden alle Zeichen in derselben Zeile ausgegeben, wie angefordert.edit2:
Liest nun den Bruch aus dem Kommandozeilenargument, wie gewünscht :)quelle
map
anstelle des Listenverständnisses spart einiges; 2) nicht brauchen die Klammern umm*a
in allen seinen Standorten, wie*
,%
und/
sind alle gleich Vorrang und linksassoziativ; 3) Die 0-Punkt-Logik in Zeile 3 kann vereinfacht werden"0."[m==1]
, da Sie sie ohnehin nur drucken. 4) Spart wahrscheinlich Zeichen, um numerische Argumente mit Backticks nach Bedarf zu setzeno=stdout.write
und in Zeichenketten umzuwandeln .1/-3
gibt-1.666666666
statt-0.333333333
.