Bei dieser Herausforderung werden Sie ein Produkt über Summen und Zahlenunterschiede verteilen , wie hier erläutert .
Beispiele
Input | Output
-------------|-------------
23(12+42) | (23*12)+(23*42)
9(62-5) | (9*62)-(9*5)
4(17+8-14) | (4*17)+(4*8)-(4*14)
15(-5) | -(15*5)
2(3) | (2*3)
8(+18) | +(8*18)
8(-40+18) | -(8*40)+(8*18)
Spezifikation
Die Eingabe ist eine Zeichenfolge des Formulars n(_)
mit einer einzelnen positiven Ganzzahl ohne Vorzeichen, n
gefolgt von einem Ausdruck in Klammern _
. Dieser Ausdruck _
besteht aus Summen und Differenzen eines von mehreren positiv-ganzzahligen Begriffen, die durch +
und -
Zeichen getrennt sind. Dem ersten Begriff kann ein +
Zeichen, ein -
Zeichen oder kein Zeichen vorangestellt werden .
In der Ausgabe sollte die Anfangszahl n
verteilt werden, um jeden der Begriffe zu multiplizieren. Jeder Term von a
sollte mit links multipliziert werden n
, um den Ausdruck in Klammern zu erhalten (n*a)
, und diese neuen Terme sollten mit +
und -
Zeichen genauso kombiniert werden wie die ursprünglichen Terme.
Ungültige Eingaben
Dies sind Beispiele für Eingaben, die Sie nicht verarbeiten müssen.
3(5 plus 3)
6(5 13)
(5+8)(6+6)
(5+3)8
Gewinnen
Dies ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
quelle
8(-40+18)
Antworten:
Pip, 28 Bytes
Erläuterung:
Pips Pattern-Objekte folgen meistens der Python-Regex-Syntax, aber das
&
Ersatzmuster ist von sed entlehnt.Weitere Informationen zu Pip finden Sie im Github-Repository
quelle
JavaScript 65 Bytes
Dies übernimmt die Eingabe. Holen Sie sich das + oder -, dann die Ziffern und ersetzen Sie es in der richtigen Reihenfolge.
Erläuterung
Verwendung
Dies funktioniert nur in Firefox und Safari Nightly vielleicht Edge? weil es ES6-Funktionen verwendet. Sie können es ausführen durch:
quelle
(.?)(\d+)
ist kaputt. Dies scheitert am23(12+42)
Produzieren1(23*2)+(23*42)
.\D?
könnte anstelle von[+-]?
Python 2.7,
110108 BytesDas Programm nimmt Eingaben von stdin entgegen, sucht nach Übereinstimmungen mit -
([+-]?)(\d+)
regex und erstellt die Ausgabezeichenfolge.Testen -
quelle
Netzhaut , 40 Bytes
Jede Zeile sollte in eine eigene Datei gehen, aber Sie können den Code als eine Datei mit dem
-s
Flag ausführen . Z.B:Die ersten beiden Zeilen drücken den Multiplikator neben jede Zahl in der erwarteten Form:
Die letzten beiden Zeilen entfernen den unnötigen nachlaufenden Teil:
quelle
sed, 105 Bytes
Ich wollte nur sehen, ob dies mit sed möglich ist.
Vielleicht ein bisschen altmodisch, aber es funktioniert.
quelle
rs , 77 Bytes
Live-Demo und alle Testfälle.
Dies ist das erste Mal, dass die Makros von rs tatsächlich verwendet wurden!
quelle
REGXY , 45 Bytes
Verwendet REGXY, eine auf Regex-Substitution basierende Sprache.
quelle
//
? Ich nehme an, es wird nach oben geschleift, bis sich die Zeichenfolge ändert, aber ich kann auf der Esolang-Seite nicht finden, warum.//
eine Endlosschleife erstellt wird, danothing
diese immer übereinstimmt, sodass wir immer zur ersten Zeile zurückkehren.Perl, 36 Bytes
35-Byte-Code + 1-Byte-Befehlszeile
Verwendung:
quelle
Pyth,
3938 BytesEine schreckliche Regex-Lösung:
quelle
Ruby, 94 Bytes
quelle
CJam, 50 Bytes
Probieren Sie es online aus
CJam bietet keine Regex-Unterstützung oder etwas anderes als das Suchen und Teilen von Zeichenfolgen, das für das Parsen von Ausdrücken sehr praktisch ist. Hier ist also etwas Arbeit erforderlich.
Erläuterung:
quelle
gawk -
6058Puh ... habe seit einiger Zeit nicht mehr mit Regexp gearbeitet.
quelle
Perl 5,
70605544 Bytes + 1 StrafeEine Perl-Lösung, die nur Split und 1 regulären Ausdruck verwendet.
Berechnet auch die längeren Eingaben.
Prüfung
Eine Version, die einen Parameter akzeptiert
Eine Version, die nur reguläre Ausdrücke verwendet.
Dieser funktioniert über eine Erfassungsgruppe innerhalb eines positiven Lookaheads und eines faulen Matchings. Wahrscheinlich hätte ein positives Aussehen verwendet, wenn Perl 5 es unterstützt hätte, aber leider. Ich habe eine Weile gebraucht, um herauszufinden, dass so etwas mit Regex möglich ist.
quelle
-p
Befehlszeilenoption speichern (ich denke, dies ist +1 Zeichen gegenüber 9 für,<>
und;print
), da dies standardmäßigsplit
funktioniert$_
(was auch immer darin enthalten ist<>
) und der Druck auch in der Schleife enthalten ist ! Ich hoffe, das hilft!Netzhaut ,
505143 BytesIch denke, dies könnte mein erstes Retina-Programm sein. Wenn nicht, ist es mein erstes Retina-Programm, das so komplex ist (eigentlich nicht so komplex). Jede Zeile wird in einer eigenen Datei abgelegt.
Ich habe dies nicht mit Retina getestet, sondern mehrmals mit einem Regex-Replace-Tester, aber es sollte funktionieren.
Beschreibung für das erste Beispiel:
Da es eine gerade Anzahl von Dateien gibt, verwendet Retina den Ersetzungsmodus. Das erste Ersetzen (die ersten beiden Dateien) entfernt eine zu verteilende Nummer und fügt dieses Verteilungspaar
(23*12)
am Ende hinzu23(+42)(23*12)
.+`
Zu Beginn weist Retina an, wiederholt zu ersetzen, bis das Muster nicht mehr übereinstimmt. Da dies erneut übereinstimmt, ersetzt das Muster dies durch23()(23*12)+(23*42)
. Dies stimmt nicht mehr überein, daher werden die nächsten 2 Dateien für das nächste Ersetzen verwendet. Dieses Mal wird lediglich das entfernt23()
. Das funktioniert gut: Da Produkte an das Ende angehängt werden, muss ich nichts Seltsames tun, wenn eine Nummer kein Zeichen hat, da die einzige Nummer, die ohne Zeichen sein kann, die erste Nummer ist.BEARBEITEN: Ersetzt
$'
als Ersatz den Rest der Zeichenfolge nach dem Match, sodass ich die nachfolgenden(.*)
s entfernen kann .quelle
k, 98 Bytes
Nicht sehr golfen.
Auf nicht-Ziffern teilen, Parens entfernen, leere Zeichenfolgen entfernen und dann
x
als erste Zeichenfolge konstant halten ,*
mit jeder verbleibenden Zeichenfolge kombiniereny
, in Klammern setzen und das Zeichen an den Anfang verschieben, falls vorhanden; Reduzieren Sie die Ausgabe in eine einzelne Zeichenfolge.quelle