Die Multiplikation zwischen 2 ganzen Zahlen kann wie folgt zu einer Reihe von Additionen reduziert werden
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
Die Potenzierung (Erhöhen von a zur Potenz von b ) kann auch in eine Reihe von Multiplikationen reduziert werden:
5 ^ 3 = 5 * 5 * 5
Daher kann die Exponentiation durch Erzeugen eines Multiplikationsausdrucks in eine Reihe von Additionen und dann in eine Reihe von Additionen reduziert werden. Zum Beispiel kann 5 ^ 3
(5 Würfel) als umgeschrieben werden
5 ^ 3 = 5 * 5 * 5
= (5 + 5 + 5 + 5 + 5) * 5
= (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5)
= 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5
Ihre Aufgabe ist es, gegebene Ausdrücke, die aus Exponentiation, Multiplikation und Addition bestehen, auf die kürzeste Additionsserie zu reduzieren. Der "kürzeste" Ausdruck ist definiert als der Ausdruck mit der geringsten Anzahl von +
Symbolen, wobei immer noch nur eine der beiden Zahlen im ursprünglichen Ausdruck verwendet wird. Zum Beispiel kann der kürzeste Ausdruck 10 * 2
ist 10 + 10
.
Die an der Eingabe beteiligten Zahlen sind alle positive Ganzzahlen, und der Ausdruck besteht nur aus +
(Addition), *
(Multiplikation) und ^
(Exponentiation) sowie aus Ganzzahlen und Klammern ( ()
), um die Vorrangstellung anzuzeigen.
Die Ausgabe sollte nur aus positiven Ganzzahlen und +
Symbolen bestehen. Sie sollten nicht die einzelnen Reduktionsschritte ausgeben, sondern nur die endgültige Ausgabe. Die Ausgabe darf keine Zahlen enthalten, die nicht in der Eingabe enthalten sind. Sie können jedoch auch 3 verschiedene Symbole anstelle von verwenden +*^
. Geben Sie jedoch an, um welche Symbole es sich handelt
Die Leerzeichen zwischen Ein- und Ausgängen können in Ihren Programmen verwendet werden oder auch nicht, dh sie 3 * 5
können entweder als 5 + 5 + 5
oder ausgegeben werden 5+5+5
.
Beachten Sie, dass die Addition in den meisten Fällen nicht durchgeführt wird. Der einzige Fall, in dem das Hinzufügen durchgeführt werden soll, ist, wenn Sie so etwas 5 ^ (1 + 2)
haben. In diesem Fall ist das Hinzufügen erforderlich, um fortzufahren -> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Siehe Testfall 4.
Ihr Code muss keine Eingaben verarbeiten, die zu einem mehrdeutigen Ausdruck führen. Zum Beispiel (2 + 2) * (4 + 1)
. Aufgrund der bisher festgelegten Regeln ist es nicht das Ziel, die Antwort zu berechnen, sondern das Ziel, das Hinzufügen zu vereinfachen. Das Ergebnis kann je nach der Reihenfolge, in der Ausdrücke aufgelöst oder umgewandelt werden, unterschiedlich sein (welche Zusätze sind zu vereinfachen, welche zu belassen?). Ein weiteres ungültig Beispiel: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
Das ist Code-Golf, also gewinnt der kürzeste Code
Testfälle
Input => output
5 ^ 3 + 4 * 1 ^ 5 => 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 4
2 ^ 1 * 2 + 3 + 9 => 2 + 2 + 3 + 9
2 ^ 1 * (2 + 3) + 9 => 2 + 3 + 2 + 3 + 9
2 ^ (1 * (2 + 3)) + 9 => 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 9
10 + 3 * 2 + 33 ^ 2 => 10 + 3 + 3 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33
100 * 3 => 100 + 100 + 100
2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1 => 2 + 2 + 2 + 2 + 8
(1 + 2 + 5 * 8 + 2 ^ 4) * 2 => 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
quelle
**
statt verwenden^
?using only one of the two numbers in the original expression.
, kann der ursprüngliche Ausdruck aber mehr als zwei Zahlen haben. Ich verstehe nicht, warum8 + 8
keine gültige Ausgabe für ist2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Diese Frage ist mir noch ziemlich unklar.Antworten:
Retina , 302 Bytes
Ich bin mir sicher, dass man Golf spielen kann, aber jetzt bin ich froh, dass es funktioniert. Exponentiation und Multiplikation sind sich sehr ähnlich, aber da die Reihenfolge der Operationen wichtig ist, weiß ich nicht, wie ich sie kombinieren soll.
y
- Potenzierungx
- Multiplikationp
- AdditionProbieren Sie es online aus - alle Testfälle
Testfall-Konverter
Erläuterung
Möglicherweise stellen Sie auch fest, dass die am häufigsten verwendete Gruppe ist
(\(\w+\)|1+)
. Dies entspricht einem inneren Ausdruck mit Klammern oder einer ganzen Zahl. Ich habe mich für die Symbole entschieden, die ich verwendet habe, damit ich keine\w
Zeichenklasse verwenden kann. Ich bin mir nicht sicher, ob es besser ist, Symbole zu verwenden, die keine Wörter sind, und einige Lookarounds durch Wortrahmen zu ersetzen (\b
).quelle
Mathematica,
250218183170 BytesEs klappt! Endlich!
Definiert die Funktion in
f
.Die Eingabe ist ein einfacher mathematischer Ausdruck. (dh
1 + 2
nicht"1 + 2"
).Probieren Sie es online!
Beachten Sie, dass der TIO-Link einen etwas anderen Code hat, als der TIO (der vermutlich den Mathematica-Kernel verwendet)
Infix
. Ich habeRiffle
stattdessen das gleiche Aussehen wie Mathematica REPL erhalten.Ungolfed
quelle
Mathematica,
405 -406 BytesUngolfed und erklärte
Ich ging zu einem sehr viel Mühe den folgenden Effekt zu erhalten: Diese Funktion nimmt als Eingabe einen Standard - Mathematica - Ausdruck, mit der üblichen
+
,*
und^
Operationen (und Klammern) darin und gibt , was aussieht wie ein Standard - Mathematica - Ausdruck (aber mit "deaktiviert" (Pluszeichen) als Antwort.Die obige Funktion beginnt mit dem Deaktivieren aller Operationen im Eingang. Dann werden wiederholt Erweiterungsregeln angewendet, bis nichts mehr vereinfacht werden kann. Immer wenn es auf ein Produkt wie z. B. stößt
2 * 3 * 4
, das auf verschiedene Arten erweitert werden kann, erstellt es eine Liste möglicher Erweiterungen und fährt fort. Am Ende erhalten wir eine Liste möglicher endgültiger Antworten, und die kürzeste wird ausgewählt.quelle