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 mapSnd
von Data.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 wir lex
die 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 Functors
können wir verwenden (<$>)
einen Alias für fmap
anwenden , lex
um 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):_)
a
schnappt den ganzen Teil der Fraktion, unser erstes Zeichen. :_
packt die Liste aus, die sich aus unserer zweiten ergibt lex
. c
schnappt uns den zweiten Token, den wir geschrieben haben, das ist der Zähler des Bruchs. Alles, was übrig bleibt, ist gebunden, um s: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:
show(r a*r d+r c)++s:d
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 das Maybe
kein ist, weiß ich nicht.