Fügen Sie bei einer Zeichenfolge +=-
mit mindestens einem Zeichen =
positive Ganzzahlen zwischen allen Symbolen sowie am Anfang und am Ende ein, damit die mathematischen Gleichungen erfüllt sind.
Zum Beispiel angesichts der Eingabe
+-=-=
Sie müssen positive ganze Zahlen A bis F wie folgt einfügen
A+B-C=D-E=F
so dass die Gleichungen alle erfüllt sind, dh A + B - C
und D - E
und F
sind alle die gleiche Zahl.
Es gibt viele Möglichkeiten, dies zu tun, da, solange die Gleichungen funktionieren, ein beliebiger Satz positiver Ganzzahlen verwendet werden kann. Jede Zeile hier ist eine mögliche gültige Ausgabe zur Eingabe +-=-=
:
2+3-4=6-5=1
1+1-1=2-1=1
4+2-4=4-2=2
100+1-10=182-91=91
89+231-77=1024-781=243
Beachten Sie, dass der Wert der Ausdrücke keine positive ganze Zahl sein muss, wie dies bei den eingefügten Zahlen der Fall ist. Beispielsweise sind bei einer gegebenen Eingabe -=-
die Ausgaben 1-10=8-17
(evals bis -9) und 10-1=17-8
(evals bis 9) beide gleich gültig. Natürlich ist es für einige Eingaben wie zum Beispiel =
unmöglich, ein Negativ als Ausdruck zu verwenden, da nur positive Zahlen wie 5=5
eingefügt werden können.
Beachten Sie auch, dass Null keine positive ganze Zahl ist.
Der kürzeste Code in Bytes gewinnt.
Sie können die Zahlen als Liste ausgeben, anstatt sie direkt in die Zeichenfolge einzufügen. Wenn Sie die Zeichenfolge ausgeben, können zwischen Symbolen und Zahlen Leerzeichen stehen. Also, für die Eingabe +-=-=
, Ausgabe
2, 3, 4, 6, 5, 1
oder
2 + 3 - 4 = 6 - 5 = 1
ist gleichbedeutend mit der Ausgabe
2+3-4=6-5=1
Testfälle
Input | One Possible Output
= | 1=1
== | 2=2=2
+= | 1+3=4
=+ | 2=1+1
-= | 30-10=20
=- | 1=2-1
=-= | 3=7-4=3
=+= | 2=1+1=2
=== | 100=100=100=100
+=- | 3+2=7-2
-=+ | 7-2=3+2
+=+ | 3+3=3+3
-=- | 1-10=8-17
--= | 60-1-1=58
++= | 60+1+1=62
-+= | 60-9+1=52
+-= | 60+9-1=68
+-=-= | 2+3-4=6-5=1
--=-- | 2-1-1=2-1-1
==-== | 47=47=50-3=47=47
=++=+-=-+=--= | 3=1+1+1=3+1-1=1-1+3=5-1-1=3
+--++-=-+-+- | 35+10-16-29+20+107-1000=5-4+3-2+1-876
====== | 8=8=8=8=8=8=8
quelle
Antworten:
Netzhaut , 58 Bytes
Probieren Sie es online!
Alternative Lösung bei gleicher Byteanzahl:
Probieren Sie es online!
Erläuterung
Die Grundidee ist es, alle zu drehen
+
s und-
s in einfacher+1
und-1
Operationen und dann eine ausreichend große Zahl vorangestellt wird, dass alle Gleichungen Arbeit macht. Damit die Gleichungen übereinstimmen, können wir einfach jedem die gleiche Zahl voranstellen und sie dann für jeden+1
um eins verringern und danach für jeden um eins erhöhen-1
. Da wir mit unären Zahlen arbeiten, besteht der einzige Haken darin, dass die erste Zahl groß genug sein muss, damit wir sie um das 1-fache reduzieren können.Wir beginnen mit dem Einfügen eines
1
nach jedem-
oder+
.Die
\B
sorgt dafür , dass diese Begegnungen sind entweder zu Beginn des Eingangs oder zwischen ein=
und einem+
oder-
, dh alle Positionen , an denen wir die führende Nummer eines Ausdrucks eingefügt werden sollen. Der((\+1)|(-1))*
Teil zählt dann einfach die Anzahl der+1
s und-1
s in Gruppen2
und3
jeweils. Lassen Sie uns nun die Ersetzungszeichenfolge aufschlüsseln:Lassen Sie
1_
die Zeichenfolge wiederholt los und stornieren Sie die+1
s.Ersetzen Sie abschließend alle Zeichenfolgen von
1
s durch ihre Längen, um sie von unär nach dezimal zu konvertieren.quelle
Python 2 , 76 Bytes
Probieren Sie es online!
quelle
eqtn_len + plus_signs + minus_signs - 2 * plus_signs = eqtn_len + minus_signs - plus_signs
. Da alle anderen Zahlen im Chunk Eins sind, ergibt sich die Summe für den Chunk zueqtn_len + minus_signs - plus_signs - minus_signs + plus_signs = eqtn_len
. Die Gleichungslänge muss positiv sein, damit alles funktioniert.Python 2,
199179178172162158156152151 BytesViel zu lang, aber die Lösung war einfach zu erstellen.
Probieren Sie es online aus
Dies wird jede Möglichkeit versuchen, bis es eine Lösung findet. Das Programm ist extrem langsam. Außerdem wird der String bei jeder Iteration ersetzt. Der "172" -Edit hat es drastisch langsamer gemacht, da er nicht mit einem kleinen Bereich beginnt, sondern mit dem max. Zum Beispiel müssen die Eingaben
-=
oder=+
2 ** 32 Versuche versuchen, bevor eine Lösung erreicht wird.Um das Programm zu beschleunigen, verwenden Sie die Version mit 178 Bytes aus dem Bearbeitungsverlauf.
quelle
range
Erstellt python2 nicht sofort den gesamten Bereich als Liste? IIRC können Sie es beschleunigen, indem Siexrange
stattdessen, wie ich denke, das ist die Lazy-Loading-Version (Python3 verwendet Lazy als Standardrange
)print range(1,65537)
und in 0.034 s fertig.l=...
, aber das in das Feld rechts setzenproduct(range(...),repeat=len(s)+1)
. Wenn Sie Klammern benötigen, wird nur ein Bytelen(s)+1
, könnte ich-~len(s)
stattdessen verwenden, was keine Parens erfordert.JavaScript (ES6),
9282 Byte8 Bytes mit einem Trick von @xnor gespielt
Der Trick besteht hier darin,
1
nach jedem+
oder ein einzufügen-
und jedem Ausdruck die Zahl voranzustellen, die bewirkt, dass der Ausdruck der Länge der Eingabe entspricht. Auf diese Weise können wir garantieren, dass die Zahl immer positiv ist. Da=
die Zeichenfolge immer mindestens 1 enthält , kann die Anzahl der+
s niemals die Länge der Zeichenfolge erreichen, sodass der Rest immer mindestens 1 ist1
. Sie können dies überprüfen, indem Sie im+
obigen Snippet eine beliebige Anzahl von s eingeben .quelle
Python 2 ,
120119 Bytes-1 Byte dank mbomb007
Probieren Sie es online! oder Überprüfen Sie alle Testfälle
Zuerst
1
füge ich in jede Position ein, um den höchsten Wert zu überprüfen, und füge ihn dann als Versatz in jede Gleichung ein. Dies funktioniert, weil Sie keine negativen Zahlen hinzufügen können, sodass das minimale Ergebnis durch die Menge von+
in der Gleichung angegeben wird, die nur hat+
.quelle
GNU Prolog, 156 Bytes
Erläuterung
Wir müssen eine Reihe von Gleichungen lösen. Warum also nicht einen tatsächlichen Gleichungslöser verwenden?
x
ist im Grunde ein Gleichungsauswerter für Gleichungen der Form+-+
; Zusätzlich zur Gleichung selbst gibt es zwei zusätzliche Argumente (eine DifferenzlisteL,R
, die die Werte der Gleichung enthält, und einen WertV
, den die Gleichung auswertet). Wie üblich in Prolog, kann es jede mögliche Weise Runde verwendet werden (zB können Sie festlegen ,V
ein und erhaltenL,R
, gebenL,R
und eine bekommenV
, die beide angeben , und stellen Sie sicher , dass der Wert korrekt ist, oder keines von beiden in diesem Fall entsprechende Beschränkungen angeben wird auf beide gesetzt werdenV
undL,R
). Das "aktuelle Element" vonL,R
wird benanntE
, und wir fügen auch eine Behauptung hinzu, dassE
ist größer als 0 (da für die Frage die Verwendung positiver Zahlen erforderlich ist). Diese Funktion ist etwas ausführlicher, als ich es gerne hätte, z. B. musste ich die[E|R]
Musterübereinstimmung zweimal schreiben , da Listen rechtsassoziativ sind, Addition und Subtraktion jedoch linksassoziativ. Leider müssen wir eine tatsächliche Liste verwenden, anstatt unseren eigenen linksassoziativen Listentyp aus Konsolen zu erfinden, damit wirfd_labeling
arbeiten können.q
ist ähnlich wiex
, enthält aber auch=
. Es ruft im Grunde nur aufx
und selbst rekursiv. Im übrigen ist es eine sehr klare Demonstration, wie Differenzlisten arbeiten, die zeigen , dass Sie zwei Differenzlisten verkettenL,T
undT,R
zu einem einzigen DifferenzlisteL,R
. Die Grundidee ist, dass eine Differenzliste eine Teilfunktion ist, die ein Argument annimmtR
und einen Wert zurückgibt,L
demR
die Liste selbst vorangestellt ist. Indem wir also das Argument einer Differenzliste und den Rückgabewert einer anderen identifizieren, können wir die Funktionen zusammensetzen und somit die Listen verketten.Schließlich ist
s
das die Funktion, die die Aufgabe in der Frage tatsächlich löst, eine Wrapper-Funktion, dieq
mit Argumenten aufruft . Wir wandeln die Differenzliste in eine reguläre Liste um, indem wir[]
als Argumentfd_labeling
angeben und eine Lösung für die von uns erstellte Gleichung finden. (Standardmäßig scheint es zu gefallen, Werte auf 1 zu setzen, wenn es keinen Grund gibt, sie auf etwas anderes zu setzen. Sie kann jedoch konfiguriert werden. Sievalue_method(random)
bietet "interessantere" Lösungen, als beispielsweise überall eine 1 zu setzen, und ist immer noch sehr schnell. )Beispielausgabe
Mit dem Programm wie geschrieben:
Wenn ich das Programm etwas länger mache, um a hinzuzufügen
value_method(random)
, variiert das Ergebnis, sieht aber ungefähr so aus:In beiden Fällen
?
bedeutet das Ende der Ausgabe, dass es möglicherweise mehr als eine Lösung gibt. (Natürlich wissen wir in diesem Fall, dass es viel mehr als eine Lösung gibt!)quelle
Mathematica, 116 Bytes
Reine Funktion, die eine Zeichenfolge als Eingabe verwendet und eine Liste positiver Ganzzahlen zurückgibt. Grundlegende Strategie: Wir addieren immer nur 1 und subtrahieren 1 und wählen die Anfangszahlen in jedem Ausdruck, um alles gleich zu machen.
c=Characters@StringSplit[#,"="]/."+"->-1/."-"->1
würde die Eingabezeichenfolge bei jedem Gleichheitszeichen aufteilen und dann jeweils+
durch-1
und-
durch ersetzen1
. Wenn jedoch am Anfang oder Ende ein Gleichheitszeichen steht, wird es ignoriert. Deshalb fügen wir an jedem Ende künstlich ein neues Zeichen hinzu ("0"<>#<>"0"
) und lassen es verschwinden, nachdem die Aufteilung der Zeichenfolgen abgeschlossen ist (/."0"->Nothing
).Die Summe jeder Unterliste entspricht nun einer ganzen Zahl, die wir vor das
+
s und-
s stellen können, um jeden Ausdruck gleich zu machen.1-Min[Tr/@c]
ist die kleinste Ganzzahl, die wir zu jeder Summe addieren können, um sie alle positiv zu machen. AlsoPrepend[#^2,1-Min[Tr/@c]+Tr@#]&
nimmt jede Unterliste (die^2
alle ihre Einträge1
aufdreht) und stellt ihre Summe um diese kleinste kompensierende Ganzzahl verschoben voran. Die resultierenden Listen werdenJoin
zusammengefügt, um die Ausgabe zu erzeugen.quelle
Rubin, 76
Der Zielwert für die Ausdrücke ist
5**8
aus Golfgründen auf minus 1 festgelegt ! Ursprünglich habe ichs.size+1
minus 1 verwendet.Ungolfed im Testprogramm
Ausgabe
quelle
PHP
207204197114 Bytesdirekter anflug: viel kürzer und schneller
Laufen Sie mit
echo '<input>' | php -nR '<code>'
oder testen Sie es online .Nervenzusammenbruch
!$c
ist wahr in der ersten Iteration, die1
für die Indexierung von Zeichenfolgen verwendet wird;"="[1]
ist leer.Danach
$c
wird gesetzt und!$c
false, umgewandelt in0
und"="[0]
ist das erste Zeichen.Wir sind also mit der Länge der Eingabe auf jeden Fall sicher. Alle Begriffe werden dahingehend bewertet.
chunk_split($s,$n,$i)
fügt$i
nach jedem$n
Zeichen von$s
- und am Ende ein.Um zu verhindern, dass leere Begriffe in geändert werden,
1
wird ein Fehler erzwungen, indem die Blocklänge auf festgelegt wird0
.quelle
Röda ,
112110109 BytesProbieren Sie es online!
Die Split-Funktion funktionierte mit diesem Programm nicht so, wie ich es wollte. Gibt beispielsweise
split("", sep="")
eine leere Zeichenfolge anstelle von nichts zurück. Wie ist das logisch? Aufgrund dessen ist das Programm fast 20 Bytes größer als es sein könnte, wenn die geteilte Semantik ideal wäre.Die Idee dieser Antwort ist, dass wir wissen, dass die Länge der Eingabezeichenfolge größer oder gleich dem Wert der Gleichung sein muss, daher definieren wir den Wert der Gleichung als Länge der Zeichenfolge. Für jeden Teil der Gleichung denken wir, dass jeder Operator
+1
oder ist,-1
und subtrahieren und addieren sie zum Wert der Gleichung.Ungolfed:
quelle