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.


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

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.


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[#," "->"+"]&

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.


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.


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.


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

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!


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.


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.



@ H.PWiz Das ist eine großartige Verwendung von Lex.
Weizen-Assistent


2
Sie sollten in der Lage sein, weitere 2 zu retten, indem Sie am/
H.PWiz


1

Javascript ES6, 62 Bytes

p=prompt;b=p(a=+p()).split`/`;alert((+b[1]*a+ +b[0])+"/"+b[1])

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.

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"

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.


@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

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

@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


@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

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.


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]).


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)

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>

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



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.


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.



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();
        }
    }
}


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.