Gemischte Zahl zu einem falschen Bruch

19

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/zin dem x, y, z beliebige nichtnegative Ganzzahlen sind. Sie müssen die Ausgabe nicht vereinfachen.


Das ist also gewinnt der kürzeste Code in Bytes.

Downgoat
quelle
5
Sie sollten den Tag "Parsing" hinzufügen. Ich bin sicher, dass die meisten Antworten mehr Byte für das Parsen der Eingabe und das Formatieren der Ausgabe als für das Berechnen ausgeben.
Nimi
3
Kann die Ausgabe ein rationaler Zahlentyp sein oder muss es eine Zeichenfolge sein?
Martin Ender
2
@AlexA .: ... aber ein großer Teil der Herausforderung. Laut Beschreibung sollte das Tag in solchen Fällen verwendet werden.
Nimi
7
Kann x, yund znegativ sein?
Dennis
2
Basierend auf der Herausforderung, die ich annehme, aber ist das Eingabeformat "xy / z" obligatorisch, oder kann das Leerzeichen eine neue Zeile sein und / oder x,y,zmüssen die Eingaben getrennt werden? Bei den meisten Antworten wird davon ausgegangen, dass das Eingabeformat in der Tat obligatorisch ist x y/z, bei einigen ist dies jedoch nicht der Fall. Daher muss diese Frage endgültig beantwortet werden.
Kevin Cruijssen

Antworten:

1

Japt, 10 Bytes

Woohoo, derzeit gegen CJam!

U*W+V+'/+W

Probieren Sie es online!

Wie es funktioniert

       // Implicit: [U,V,W] = eval(input). This automatically discards the slash.
U*W+V  // Calculate the new numerator: (whole part * denominator) + numerator.
+'/+W  // Add the slash and the denominator.
       // Implicit: output last expression
ETHproductions
quelle
Ich habe gestern ein bisschen Zeit damit verbracht herauszufinden, wie ich 15 Wiederholungen einer Antwort verdient habe, bis mir klar wurde: Mein erstes grünes Häkchen! \ o /
ETHproductions
7

CJam, 16 15 14 Bytes

l'/']er~:Xb'/X

oder

l'/']er~_@b'/@

Teste es hier.

Erläuterung

l      e# Read input.
'/']er e# Replace the "/" with a "]".
~      e# Evaluate the string as code. If the input was "i n/d", this pushes [i n] d.
:X     e# Store the denominator in X.
b      e# Treat [i n] as base-d digits. This effectively computes i*d + n.
'/     e# Push a slash.
X      e# Push the denominator.

Die andere Version vermeidet die Verwendung einer Variablen durch etwas mehr Stack-Shifting.

Martin Ender
quelle
Ich muss wirklich mehr mit der Basiskonvertierung in CJam anfangen.
Esolanging Fruit
Eine alternative Version: '//~\S/1$b'/@Das sind 13 Bytes. Edit : oh ich habe die eingabe vergessen l.
Chromium
4

Mathematica, 58 Bytes

ToExpression@StringReplace[#," "->"+"]~ToString~InputForm&

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:

ToExpression@StringReplace[#," "->"+"]&
Martin Ender
quelle
4

PowerShell, 47 44 42 Bytes

Durchgestrichen 44 ist immer noch regulär 44; (

$l,$n,$d=$args-split'\D';"$(+$l*$d+$n)/$d"

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 $lEFT-Zahl $dmultipliziert mit dem Enominator plus dem $nUmerator), die als Codeblock, /Schrägstrich und dann erneut als $dEnominator ausgeführt wird.

AdmBorkBork
quelle
Hallo, ich denke, Sie können -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')|iexes 40 Bytes und eine viel coolere Ausgabe, da die Zahlen sogar übereinander liegen!
TessellatingHeckler
1
@TessellatingHeckler Danke für die Regex-Unterstützung. Ich habe Downgoat um Eingabe gebeten. Aber $l,$n,$d=$args-split'\D';+$l*$d+$n;$dkürzer noch bei 37, und folgt logisch das gleiche Muster wie hier.
AdmBorkBork
Oh ja, nur Mathe! (Das würde auch ausreichen, um eine Perl-Antwort zu
unterbieten
3

Java mit zehn Fuß Laser Pole 1.03, 79 + 25 (Import) = 104 Bytes

Benötigt import sj224.tflp.math.*;

String m(String[]a){return ""+new BigRational(a[0]).add(new BigRational(a[1]));}

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.

SuperJedi224
quelle
3

JavaScript (ES6), 44 41 Byte

m=>([x,y,z]=m.match(/\d+/g),+y+x*z+"/"+z)

3 Bytes gespart dank @ETHproductions !

Erläuterung

Sehr einfach.

m=>
  ([x,y,z]=m.match(/\d+/g), // x, y and z = numbers from input
    +y+x*z                  // numerator
    +"/"+z                  // denominator
  )

Prüfung

Test ist ohne destrukturierende Zuordnung in den meisten Browsern zu arbeiten.

user81655
quelle
Nett! Sie können verwendet werden [p,q,r]=anstelle von p=, dann ersetzen p[0], p[1]und p[2]mit p, qund r, respectively. Nach dieser Änderung bekomme ich 41:m=>([p,q,r]=m.match(/\d+/g),+q+p*r+"/"+r)
ETHproductions
@ETHproductions Danke für den Tipp! Eigentlich habe ich überlegt, eine Destrukturierungsaufgabe zu verwenden, aber sie funktionieren nicht in Chrome und ich hatte Firefox nicht zur Hand, um sie zu testen. : P
user81655
Mein erstes durchgestrichenes 44! : D
user81655
Sie können m.split(/\W/g)stattdessen verwenden, um ein Byte zu speichern
Kritixi Lithos
2

Julia, 58 50 Bytes

s->eval(parse((r=replace)(r(s," ","+"),"/","//")))

Dies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und ein Typobjekt zurückgibt Rational. Um es zu nennen, geben Sie ihm einen Namen, z f=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/2in 4+1//2, wird das ausgewertete Ergebnis 9//2.

Ungolfed:

function f(s::AbstractString)
    # Replace the space in the input with a plus
    r1 = replace(s, " ", "+")

    # Replace the / with //
    r2 = replace(r1, "/", "//")

    # Parse the resulting expression as a rational
    return eval(parse(r2))
end
Alex A.
quelle
2

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!

Compiler evaluate:'|p|p:=0.#(',FileStream stdin nextLine,')do:[:q|p:=p+q].p'

Es ist schade, dass Vereinfachung keine Voraussetzung war, Smalltalk macht es automatisch!


quelle
2

Bash + Coreutils, 28

dc<<<${@/\// }sarla*+n47Plap

$@Erweitert auf alle Befehlszeilenparameter, also ${@/\// }auf alle Befehlszeilenparameter mit /Ersetzt durch , die auf dcden Stapel gelegt werden. Der Rest ist einfache Stapelmanipulation und Arithmetik.

Digitales Trauma
quelle
2

Haskell , 74 67 63 Bytes

r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d

Probieren 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 wie mapSndvon Data.Tuple.

Der Pattern Guard teilt unseren Code in die drei Zahlen auf, die wir verwenden möchten lex. lexruft 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 wir lexdie Eingabe auf

lex x

Dann packen wir es aus der Liste und erhalten ein 2-Tupel

lex x!!0

Der erste Token ist der gesamte Teil der gemischten Fraktion, wobei der Fraktion ein Leerzeichen vorangestellt bleibt, um das Parsen fortzusetzen. Dann , da Tupel Functorskönnen wir verwenden (<$>)einen Alias für fmapanwenden , lexum das zweite Element des Tupels.

lex<$>lex x!!0

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 ist

(a,(c,s:d):_)

aschnappt den ganzen Teil der Fraktion, unser erstes Zeichen. :_packt die Liste aus, die sich aus unserer zweiten ergibt lex. cschnappt uns den zweiten Token, den wir geschrieben haben, das ist der Zähler des Bruchs. Alles, was übrig bleibt, ist gebunden, um s:des 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:

show(r a*r d+r c)++s:d

Wo rist die Lesefunktion, die wir früher gebunden haben?

Es ist wichtig zu beachten, dass lexeine Liste leer zurückgegeben wird, wenn sie fehlschlägt, und nicht leer, wenn sie erfolgreich ist. Warum das Maybekein ist, weiß ich nicht.

Weizen-Assistent
quelle
1
67 Bytes
H.PWiz
@ H.PWiz Das ist eine großartige Verwendung von Lex.
Weizen-Assistent
2
65 Bytes: Probieren Sie es online!
Laikoni
2
Sie sollten in der Lage sein, weitere 2 zu retten, indem Sie am/
H.PWiz
1
59 Bytes
H.PWiz
1

Javascript ES6, 62 Bytes

p=prompt;b=p(a=+p()).split`/`;alert((+b[1]*a+ +b[0])+"/"+b[1])
SuperJedi224
quelle
1
Sehr schön! Einige Tipps: Sie können [b,c]=anstelle von b=, dann verwenden Sie bstatt b[0]und canstelle von b[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)
ETHproductions
1

Perl, 82 61 38 Bytes

#!perl -paF/\D/
$_=$F[0]*$F[2]+$F[1]."/$F[2]"

Damit kann wohl mehr golfen werden.

Änderungen

  • 16 Bytes durch Verwendung eines regulären Ausdrucks in splitund 5 durch Verwendung von <>anstelle von gespeichert <STDIN>.
  • Dank Dennis wurden weitere 16 Bytes gespeichert.
ASCIIThenANSI
quelle
Mit shebang #!perl -paF/\D/(9 Bytes) können Sie verwenden $_=$F[0]*$F[2]+$F[1]."/$F[2]".
Dennis
@Dennis Ich habe das hinzugefügt. Danke!
ASCIIThenANSI
Der #!perlTeil des Schebangs und der Zeilenvorschub zählen nicht. Dies sind nur 38 Bytes.
Dennis
@ Tennis Oh, OK. Ich werde es jetzt korrigieren. (Auf der
positiven
1

Mathematica, 51 Bytes

Interpreter["ComputedNumber"]@#~ToString~InputForm&

Interessanterweise unterstützt Mathematica dies mit einem eingebauten. Wenn die Ausgabe einer Zahl erlaubt ist, benötigen wir nur 28 Bytes:

Interpreter@"ComputedNumber"
LegionMammal978
quelle
1

Java, 159 148 142 120 110 Bytes

String m(String[]a){Long b=new Long(a[0]),d=new Long((a=a[1].split("/"))[1]);return b*d+new Long(a[0])+"/"+d;}

Dank FlagAsSpam wurden viele Bytes gespeichert.

SuperJedi224
quelle
@FlagAsSpam Fertig.
SuperJedi224
@FlagAsSpam Aber dann werden die Variablen nicht deklariert!
SuperJedi224
Ignorieren Sie alles, was ich gerade gesagt habe - ein kurzer Weg, was Sie tun, istLong b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
Addison Crump
1

ARBLE , 13 Bytes

a*c+b.."/"..c

Probieren Sie es online!

Ein Taco
quelle
Ich bin mir ziemlich sicher, dass das Eingabeformat "x y/z"für diese spezielle Herausforderung obligatorisch ist, aber nur für den Fall, dass ich OP um Bestätigung gebeten habe.
Kevin Cruijssen
1

05AB1E , 17 15 Bytes

#`'/¡R`Š©*+®'/ý

-2 Bytes dank @MagicOctopusUrn .

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

#`         # Split input by spaces and push all items to the stack
           #  i.e. "4 1/2" → "4" and "1/2"
  '/¡      # Push the second item by "/"
           #  i.e. "1/2" → [1,2]
     R`    # Revert the list, and also push all items to the stack
           #  i.e. [1,2] → [2,1] → 2 and 1
Š          # Triple-swap the stack
           #  [4,2,1] → [1,4,2]
 ©         # Store the 2 in the register
  *        # Multiple the top two items
           #  4 and 2 → 8
   +       # Add the top two items
           #  1 and 8 → 9
®          # Push the 2 from the register to the stack again
 '/ý       # Join the two items by "/"
           #  9 and 2 → "9/2"

Mit dem flexiblen Eingabe- und Ausgabeformat, bei dem die ganzen Zahlen in der Reihenfolge genommen x,z,yund der Nominator und der Nenner in getrennten Zeilen ausgegeben werden, wären es 4 Bytes (weshalb ich der Herausforderung das Tag hinzugefügt habe ):

*+²»

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

*        # Multiply the first two inputs (x and z)
         #  i.e. 4 and 2 → 8
 +       # Add the third input (y)
         #  i.e. 8 and 1 → 9
  ²      # Take the second input again (z)
   »     # Join the stack by newlines and implicitly print it
Kevin Cruijssen
quelle
@MagicOctopusUrn Danke, aber das Eingabeformat unterscheidet sich von der Beschreibung der Herausforderung. Anscheinend ist das Format (als einzelne Zeichenfolge) 4 1/2fü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)
Kevin Cruijssen
1
15 Bytes
Magic Octopus Urn
@MagicOctopusUrn Oh, ich wusste nicht einmal über "Schiebe alle Gegenstände ain den Stapel " Bescheid. O. Genau das, was ich für diese Herausforderung brauchte! Und schlau mit dem Join von "/". Vielen Dank! :)
Kevin Cruijssen
Ich hasse es, den Befehl "Alle Elemente von a in den Stapel schieben" zu verwenden, weil er "` "ist und nicht durch Inline-Code-Tags gezähmt werden kann.
Magic Octopus Urn
@MagicOctopusUrn Ja, es ist auch ein bisschen nervig in Kommentaren (weshalb ich " Push all the items of ain the stack " zitiert habe, anstatt '`'..
Kevin Cruijssen
1

Python 3 , 78 76 Bytes

def f(s):a,b=s.split();b,c=b.split('/');return'%s/'%(int(a)*int(c)+int(b))+c

Probieren Sie es online!

xbarbie
quelle
return'%s/'%(int(a)*int(c)+int(b))+cist 2 Bytes kürzer
ovs
1

Stax , 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.

rekursiv
quelle
1

Perl 5 mit -la -Mfeature = 32 Bytes 25 Bytes

m|/|;say$_*$'+$F[1],"/$'"

Probieren Sie es online!

(-7 Bytes dank Dom Hastings)

$_ist die gesamte Eingabe x y/z, die den Wert von xin numerischen Kontexten (wie *hier) auswertet . $'ist der regex post-match - String, der hier enthält alles , was danach kommt /- so, z. Um den yWert zu erhalten, verwenden wir das -aFlag, das die Eingabe auf Leerzeichen aufteilt und sie im @FArray platziert. Also hier, @F = ("x", "y/z")was bedeutet, $F[1]="y/z"dass yin numerischen Kontexten ausgewertet wird (da yist die anfängliche zusammenhängende Folge von Ziffern mit $F[1]).

Sundar - Setzen Sie Monica wieder ein
quelle
Sie müssen das -pFlag nicht in Ihrer Byteanzahl zählen. Stattdessen zählt man die Sprache als Perl 5 with -p flag, 32 bytes. In diesem Meta-Beitrag finden Sie den aktuellen Konsens.
Giuseppe
Netter Ansatz! Ich habe mich gerade ein wenig damit beschäftigt und es geschafft, eine 25-Byte-Version zu erstellen : Probieren Sie es online aus! . Benutzung $'war der einzige wirkliche Unterschied da wirklich!
Dom Hastings
Die Kombination von sowohl Regex- $'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.
Sundar - Wiedereinsetzung von Monica
0

Lua, 123 Bytes

m=io.read()z=string x=z.find c=z.sub b=tonumber s=x(m," ")f=x(m,"/")d=c(m,f+1)print(b(c(m,1,s))*b(d)+b(c(m,s,f-1)).."/"..d)
Nikolai97
quelle
0

Milchstraße 1.6.0 , 31 Bytes

'" "\="/"\=>;<A;A;:>*;A+"/"+<+!

Es dauerte viel länger, als ich erwartet hatte.


Erläuterung

'" "\="/"\=>;<A;A;:>*;A+"/"+<+!

'                                # read input from the command line
 " "  "/"               "/"      # push a string to the stack
    \    \                       # split the STOS at the TOS
     =    =                      # dump the TOS to the stack
           >       >             # rotate the stack rightward
            ;  ; ;   ;           # swap the TOS and STOS
             <              <    # rotate the stack leftward
              A A     A          # push the integer representation of the TOS
                  :              # duplicate the TOS
                    *            # multiply the STOS by the TOS
                       +   + +   # add the TOS and STOS
                              !  # output the TOS

Verwendung

./mw <path-to-code> -i <input>
Zach Gates
quelle
0

Python 2.7, 88 Bytes

a = input (). split ('/'); print int (a [-1]) * int (a [0] .split () [0]) + int (a [0] .split () [1 ]), '/', a [1]

Probieren Sie es online !

Sie müssen die Eingabe in Anführungszeichen eingeben.

Wahrscheinlich nicht die beste ...

Alex
quelle
76 Bytes
Koishore Roy
0

C 64

main(i,d,n){scanf("%d %d/%d",&i,&n,&d);printf("%d/%d",i*d+n,d);}

Liest die Eingabe von STDIN. Ziemlich selbsterklärend, denke ich.

Digitales Trauma
quelle
0

Überprüfen Sie , 120 Bytes

>]+>:>32r#v
#d@0+\)  ##:>4;:>5'=:>48-\R-?
dd)R>32-#v
#>15-#v  #?
47r@>@   #v
#dd#v #?
r@>@     #v
    #\d@\: @*@+pd"/"op

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.

Esolanging Fruit
quelle
0

C #, 112 Bytes

s=>{string[]a=s.Split(),b=a[1].Split('/');int o=int.Parse(b[1]);return int.Parse(a[0])*o+int.Parse(b[0])+"/"+o;}

Voll / Formatierte Version:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<string, string> f = s =>
            {
                string[] a = s.Split(), b = a[1].Split('/');
                int o = int.Parse(b[1]);
                return int.Parse(a[0]) * o + int.Parse(b[0]) + "/" + o;
            };

            Console.WriteLine(f("4 1/2"));
            Console.WriteLine(f("12 2/4"));
            Console.WriteLine(f("0 0/2"));
            Console.WriteLine(f("11 23/44"));

            Console.ReadLine();
        }
    }
}
TheLethalCoder
quelle
0

PHP, 65 Bytes

Probieren Sie es online aus

Code

<?=(($a=preg_split("/[\s,\/]/",$argv))[0]*$a[2]+$a[1])."/".$a[2];

Erläuterung

$a=preg_split("/[\s,\/]/",$argv); # Split the string on "/" and " "
(($a)[0]*$a[2]+$a[1]) # as always denominator*whole number + numerator 
."/"                  # echo an slash
.$a[2];               # echo de denominator
Francisco Hahn
quelle
0

Java 10, 87 Bytes

Ein Lambda von Stringbis String.

s->{var p=s.split(" |/");return new Long(p[0])*new Long(p[2])+new Long(p[1])+"/"+p[2];}

Probieren Sie es online

Jakob
quelle