Gemischte Zahl zu einem falschen Bruch
In dieser Herausforderung wandeln Sie eine gemischte Zahl in einen falschen Bruch um.
Da unzulässige Brüche weniger Zahlen verwenden, muss Ihr Code so kurz wie möglich sein.
Beispiele
4 1/2
9/2
12 2/4
50/4
0 0/2
0/2
11 23/44
507/44
Spezifikation
Sie können davon ausgehen, dass der Nenner der Eingabe niemals 0 ist. Die Eingabe hat immer das Format, x y/z
in dem x, y, z beliebige nichtnegative Ganzzahlen sind. Sie müssen die Ausgabe nicht vereinfachen.
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.
code-golf
number
parsing
rational-numbers
Downgoat
quelle
quelle
x
,y
undz
negativ sein?x,y,z
müssen die Eingaben getrennt werden? Bei den meisten Antworten wird davon ausgegangen, dass das Eingabeformat in der Tat obligatorisch istx y/z
, bei einigen ist dies jedoch nicht der Fall. Daher muss diese Frage endgültig beantwortet werden.Antworten:
Japt, 10 Bytes
Woohoo, derzeit gegen CJam!
Probieren Sie es online!
Wie es funktioniert
quelle
LabVIEW, 29 LabVIEW-Grundelemente
quelle
CJam,
161514 Bytesoder
Teste es hier.
Erläuterung
Die andere Version vermeidet die Verwendung einer Variablen durch etwas mehr Stack-Shifting.
quelle
'//~\S/1$b'/@
Das sind 13 Bytes. Edit : oh ich habe die eingabe vergessenl
.Mathematica, 58 Bytes
Dies gibt das vereinfachte Ergebnis zurück. Wenn die Ausgabe einer rationalen Zahl anstelle einer Zeichenfolge in Ordnung ist, können 19 Bytes eingespart werden:
quelle
PowerShell,
474442 BytesDurchgestrichen 44 ist immer noch regulär 44; (
Golf ein paar Bytes mit Regex
-split
. Ich habe dank TessellatingHeckler ein paar mehr Golf gespielt, indem ich den Regex getauscht habe.Das
$args-split'\D'
nimmt unser Eingabeargument und teilt auf nicht-stellige Zeichen auf. Hier werden zwei Teilungen ausgeführt, eine im Leerzeichen und die andere im/
Zeichen. Die Ergebnisse werden dann unter Verwendung einer gleichzeitigen Zuordnung in den drei Variablen gespeichert. Wir formulieren dann die String-Ausgabe als (die$l
EFT-Zahl$d
multipliziert mit dem Enominator plus dem$n
Umerator), die als Codeblock,/
Schrägstrich und dann erneut als$d
Enominator ausgeführt wird.quelle
-split ' |/'
ein Zeichen mit einem Regex "entweder diesem oder jenem entsprechen |" speichern oder verwenden-split '\D'
, um auf etwas aufzuteilen, das keine Ziffer ist und s (h) zwei Zeichen hat. Wenn @Downgoat bereit ist, im Ausgabeformat ein wenig flexibel zu sein, hat'{0}*{2}+{1};{2}'-f($args-split'\D')|iex
es 40 Bytes und eine viel coolere Ausgabe, da die Zahlen sogar übereinander liegen!$l,$n,$d=$args-split'\D';+$l*$d+$n;$d
kürzer noch bei 37, und folgt logisch das gleiche Muster wie hier.Java mit zehn Fuß Laser Pole 1.03, 79 + 25 (Import) = 104 Bytes
Benötigt
import sj224.tflp.math.*;
Dies wird mit ziemlicher Sicherheit auch mit 1.04 funktionieren, aber bisher habe ich es nur mit 1.03 getestet, da ich zufällig bereits ein Java-Projekt mit 1.03 im Build-Pfad eingerichtet habe.
quelle
JavaScript (ES6),
4441 Byte3 Bytes gespart dank @ETHproductions !
Erläuterung
Sehr einfach.
Prüfung
Test ist ohne destrukturierende Zuordnung in den meisten Browsern zu arbeiten.
Code-Snippet anzeigen
quelle
[p,q,r]=
anstelle vonp=
, dann ersetzenp[0]
,p[1]
undp[2]
mitp
,q
undr
, respectively. Nach dieser Änderung bekomme ich 41:m=>([p,q,r]=m.match(/\d+/g),+q+p*r+"/"+r)
m.split(/\W/g)
stattdessen verwenden, um ein Byte zu speichernJulia,
5850 BytesDies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und ein Typobjekt zurückgibt
Rational
. Um es zu nennen, geben Sie ihm einen Namen, zf=s->...
.Wir können die Tatsache ausnutzen, dass die Eingabe leicht manipuliert werden kann, um einen Ausdruck zu erhalten, der als rational bewertet wird. Insbesondere ist eine Ganzzahl plus ein Rational ein Rational, und Rationalen werden mit doppelten Schrägstrichen bezeichnet. Also , wenn wir drehen
4 1/2
in4+1//2
, wird das ausgewertete Ergebnis9//2
.Ungolfed:
quelle
Smalltalk - 76 Zeichen
Die Eingabe stimmt genau mit dem Array-Begrenzer und der inhärenten Bruchdarstellung von Smalltalk überein. Wenn es nur nicht so ausführlich wäre, könnte es ein ernsthafter Anwärter sein!
Es ist schade, dass Vereinfachung keine Voraussetzung war, Smalltalk macht es automatisch!
quelle
Bash + Coreutils, 28
$@
Erweitert auf alle Befehlszeilenparameter, also${@/\// }
auf alle Befehlszeilenparameter mit/
Ersetzt durch, die auf
dc
den Stapel gelegt werden. Der Rest ist einfache Stapelmanipulation und Arithmetik.quelle
Haskell ,
746763 BytesProbieren Sie es online!
Erläuterung
Wie H.PWiz herausgefunden hat, können wir hier Haskells Lexer verwenden, um die Saite in ihre Teile zu zerlegen . (Früher habe ich verwendet
span(>'/')
) Und Laikoni wies darauf hin, dass es<$>
genauso funktioniert wiemapSnd
vonData.Tuple
.Der Pattern Guard teilt unseren Code in die drei Zahlen auf, die wir verwenden möchten
lex
.lex
ruft haskells lexer auf, um das erste token abzubrechen. Es wird eine Liste zurückgegeben, wobei jedes Element eine mögliche Methode zum Parsen der Zeichenfolge darstellt. Diese Elemente sind Tupel, wobei das erste Element das erste Token und der Rest der Zeichenfolge das zweite Element ist. Da das Eingabeformat sehr regelmäßig ist, wird immer nur genau eine Analyse durchgeführt, sodass immer die erste durchgeführt werden kann. Als erstes rufen wirlex
die Eingabe aufDann packen wir es aus der Liste und erhalten ein 2-Tupel
Der erste Token ist der gesamte Teil der gemischten Fraktion, wobei der Fraktion ein Leerzeichen vorangestellt bleibt, um das Parsen fortzusetzen. Dann , da Tupel
Functors
können wir verwenden(<$>)
einen Alias fürfmap
anwenden ,lex
um das zweite Element des Tupels.Dies frisst sich durch den Raum und bricht das nächste Zeichen ab, den Zähler unseres Bruchs. Nun binden wir dies mit einem Pattern Match
<-
. Unser Muster ista
schnappt den ganzen Teil der Fraktion, unser erstes Zeichen.:_
packt die Liste aus, die sich aus unserer zweiten ergibtlex
.c
schnappt uns den zweiten Token, den wir geschrieben haben, das ist der Zähler des Bruchs. Alles, was übrig bleibt, ist gebunden, ums:d
es in sein erstes Zeichen aufzuteilen, was durch das Format a/
und den Rest, der der Nenner sein wird , garantiert wird.Nachdem wir die Eingabe analysiert haben, führen wir die eigentliche Berechnung durch:
Wo
r
ist die Lesefunktion, die wir früher gebunden haben?Es ist wichtig zu beachten, dass
lex
eine Liste leer zurückgegeben wird, wenn sie fehlschlägt, und nicht leer, wenn sie erfolgreich ist. Warum dasMaybe
kein ist, weiß ich nicht.quelle
/
Javascript ES6, 62 Bytes
quelle
[b,c]=
anstelle vonb=
, dann verwenden Sieb
stattb[0]
undc
anstelle vonb[1]
. Außerdem können Sie die Gleichung neu anordnen, sodass Sie überhaupt keine Klammern benötigen:p=prompt;[b,c]=p(a=+p()).split
/;alert(+b+c*a+"/"+c)
Perl,
826138 BytesDamit kann wohl mehr golfen werden.
Änderungen
split
und 5 durch Verwendung von<>
anstelle von gespeichert<STDIN>
.quelle
#!perl -paF/\D/
(9 Bytes) können Sie verwenden$_=$F[0]*$F[2]+$F[1]."/$F[2]"
.#!perl
Teil des Schebangs und der Zeilenvorschub zählen nicht. Dies sind nur 38 Bytes.Mathematica, 51 Bytes
Interessanterweise unterstützt Mathematica dies mit einem eingebauten. Wenn die Ausgabe einer Zahl erlaubt ist, benötigen wir nur 28 Bytes:
quelle
Java,
159148142120110 BytesDank FlagAsSpam wurden viele Bytes gespeichert.
quelle
Long b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
ARBLE , 13 Bytes
Probieren Sie es online!
quelle
"x y/z"
für diese spezielle Herausforderung obligatorisch ist, aber nur für den Fall, dass ich OP um Bestätigung gebeten habe.05AB1E ,
1715 Bytes-2 Bytes dank @MagicOctopusUrn .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Mit dem flexiblen Eingabe- und Ausgabeformat, bei dem die ganzen Zahlen in der Reihenfolge genommen
x,z,y
und der Nominator und der Nenner in getrennten Zeilen ausgegeben werden, wären es 4 Bytes (weshalb ich der Herausforderung das Parsing- Tag hinzugefügt habe ):Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
4 1/2
für diese besondere Herausforderung obligatorisch. Sonst würde ich meine 4-Byte - Version verwendet hat (oder wenn der Ausgang war obligatorisch, aber flexiblen Eingang Ich würde diesen 6-byter benutzen*+'/²J
)a
in den Stapel " Bescheid. O. Genau das, was ich für diese Herausforderung brauchte! Und schlau mit dem Join von "/". Vielen Dank! :)a
in the stack " zitiert habe, anstatt'`'
..Python 3 ,
7876 BytesProbieren Sie es online!
quelle
return'%s/'%(int(a)*int(c)+int(b))+c
ist 2 Bytes kürzerStax , 1 Byte
Führen Sie es aus und debuggen Sie es (obwohl es nicht viel zu debuggen gibt)
Die Herausforderungsspezifikation besagt: "Sie müssen die Ausgabe nicht vereinfachen." Angenommen, es ist erlaubt zu vereinfachen, dann gibt es eine eingebaute Anweisung in stax, um dies zu tun. Die Eingabe wird implizit als Ganzzahl und als rationale Zahl interpretiert. Der
+
Befehl erweitert sich sowohl zu rationalen als auch zu addierenden und vereinfachten Befehlen. Das Ergebnis wird implizit gedruckt.quelle
Perl 5 mit -la -Mfeature =
32 Bytes25 BytesProbieren Sie es online!
(-7 Bytes dank Dom Hastings)
$_
ist die gesamte Eingabex y/z
, die den Wert vonx
in numerischen Kontexten (wie*
hier) auswertet .$'
ist der regex post-match - String, der hier enthält alles , was danach kommt/
- so,z
. Um deny
Wert zu erhalten, verwenden wir das-a
Flag, das die Eingabe auf Leerzeichen aufteilt und sie im@F
Array platziert. Also hier,@F = ("x", "y/z")
was bedeutet,$F[1]="y/z"
dassy
in numerischen Kontexten ausgewertet wird (day
ist die anfängliche zusammenhängende Folge von Ziffern mit$F[1]
).quelle
-p
Flag nicht in Ihrer Byteanzahl zählen. Stattdessen zählt man die Sprache alsPerl 5 with -p flag, 32 bytes
. In diesem Meta-Beitrag finden Sie den aktuellen Konsens.$'
war der einzige wirkliche Unterschied da wirklich!$'
als auch-a
-$F[n]
, um Teile der Zeichenkette zu erhalten, ist eine ziemlich gute Idee, ich muss mich daran erinnern! Danke, hat den Beitrag aktualisiert.Lua, 123 Bytes
quelle
Milchstraße 1.6.0 , 31 Bytes
Es dauerte viel länger, als ich erwartet hatte.
Erläuterung
Verwendung
quelle
Python 2.7, 88 Bytes
Probieren Sie es online !
Sie müssen die Eingabe in Anführungszeichen eingeben.
Wahrscheinlich nicht die beste ...
quelle
C 64
Liest die Eingabe von STDIN. Ziemlich selbsterklärend, denke ich.
quelle
Überprüfen Sie , 120 Bytes
Probieren Sie es online!
Ich könnte in der Lage sein, einige Bytes zu sparen, indem ich nicht versuche, die Parsing-Schleife (die zweite Zeile) wiederzuverwenden. Auf diese Weise könnte ich die Schleife präzisieren, das große Durcheinander von Bedingungen vermeiden und das Register für andere Dinge verwenden.
quelle
Ruby , 23 Bytes
Probieren Sie es online!
quelle
C #, 112 Bytes
Voll / Formatierte Version:
quelle
APL (Dyalog Unicode) , 31 Byte
Probieren Sie es online!
Danke an ngn für den
⊃⊥1∘↓
Trickquelle
PHP, 65 Bytes
Probieren Sie es online aus
Code
Erläuterung
quelle
Java 10, 87 Bytes
Ein Lambda von
String
bisString
.Probieren Sie es online
quelle