Überblick
Suchen Sie anhand einer Liste mit Ziffern die wenigsten Operationen, um 100 zu erhalten
Eingang
Eine Zeichenfolge, die in numerischer Reihenfolge vorliegen kann oder nicht. Die Reihenfolge der Ziffern kann nicht geändert werden. Es können jedoch jeweils Plus- (+) oder Minus-Operatoren (-) hinzugefügt werden, sodass die Gesamtsumme gleich 100 ist.
Ausgabe
Die Anzahl der hinzugefügten Operatoren, gefolgt von der vollständigen Folge von Ziffern und Operatoren. Die beiden können durch ein Leerzeichen, einen Tabulator oder eine neue Zeilenfolge getrennt werden.
Beispiele
gültig
Eingabe: 123456789
Ausgabe:3 123–45–67+89
Ungültige
Eingabe: 123456789
Ausgabe:
6
1+2+34-5+67-8+9
(Es gibt Möglichkeiten, dies mit weniger Operationen zu lösen.)
code-golf
integer
integer-partitions
expression-building
CyberJacob
quelle
quelle
+
und verwenden-
? Können wir davon ausgehen, dass wir100
aus den Eingaben immer etwas machen können ?299399
, wäre-299+399
das gültig?Antworten:
JavaScript (ES6),
153 bis176 ByteBEARBEITEN: Im nicht strengen Modus interpretiert JS numerische Ausdrücke mit dem Präfix 0 als Oktal (z. B.
017
wird sie als 15 in Dezimalform analysiert). Dies ist eine feste Version, die führende Nullen unterstützt.quelle
2-017-2+117
. Ist017
aber eine Oktalnotation in JS, die 15 dezimal ergibt. Also mein aktueller Code findet nur2-0-17-2+117
. Ich werde später heute versuchen, dieses Problem anzugehen.3**(l=s.length,l-1)
=>3**~-(l=s.length)
MATL ,
3736 BytesDer Testfall dauert in TIO ca. 6 Sekunden.
Probieren Sie es online!
Wie es funktioniert
quelle
299399
hat keine Lösung und ist daher keine gültige Eingabe (die Betreiber festgelegt wurden gehen „zwischen“ den Ziffern, dass die Eingabe erfordern würde ,-299+399
wo die-
nicht zwischen den Ziffern sind).-299+399
In diesem Fall muss der Code geringfügig geändert werden . Ich habe das OP um Klarstellung gebeten123456789
sollte .4
3
299399
eine ungültige Eingabe, da, wie auch das OP klargestellt hat, jede Eingabe mindestens eine Lösung haben sollte[Python 2],
164158 BytesProbieren Sie es online!
Nehmen Sie N als eine Folge von Ziffern; gibt ein Tupel zurück (numOps, expressionString).
Grundsätzlich der gleiche Ansatz wie bei anderen; verwendet itertools.product, um die einzelnen "Fälle" zu konstruieren, z. B. für N == '1322', wäre ein "Fall"
('-','','+')
und würde '1-32 + 2' auswerten.Wirft einen ValueError, wenn die Eingabe ungültig ist (aber ich denke, OP hat keine ungültigen Eingaben garantiert).
quelle
PHP,
166171 BytesLaufen Sie als Rohr mit
-nR
oder testen Sie es online .sortiert die Ergebnisse mit formatierten Zahlen ->
druckt möglicherweise führende Leerzeichen (und schlägt möglicherweise bei Eingaben mit mehr als 99 Stellen fehl; erhöhen Sie die Zahl, um sie
%2d
zu korrigieren).nicht mehr als 10 Stellen, 161 Bytes
Nervenzusammenbruch
quelle
Jelly , 32 Bytes
Ein vollständiges Programm, das mit den Jelly-Operatoren (
_
anstelle von-
) angezeigt wird .Hinweis: Um
-
in der Ausgabe statt_
(nicht erforderlich) anzuzeigen, fügen Sie⁾_-y
zwischenF
undṄ
(⁾_-
ist ein Zeichenpaar-Literal['_','-']
und) einy
ist das dyadische "translate" -Atom).Wie?
Probieren Sie es online!
quelle
Mathematica, 136
146149156165166BytesGibt
{3, 123-45-67+89}
zum Beispiel zurück.Der Testfall dauert ca. 0,09 Sekunden.
quelle
Python 2 ,
256230208205172171170165 Bytes, iterative Methodelen(a)
durchw
z-=1;d=z
durchd=z=z-1
Probieren Sie es online!
Kleine Erklärung Unter Verwendung der Darstellung in Basis 3 verschachtelt der Code die Ziffern mit den Operatoren {'+', '-', Verkettung} nach allen möglichen Kombinationen.
Python 2 , 167 Bytes, rekursive Methode
Probieren Sie es online!
Einige Ausgänge
quelle
list(input())
durch nurinput()
, da eine Zeichenfolge bereits iterabel ist, um 6 Bytes zu sparen. ersetzenb.count('+')+b.count('-')
mitlen(b)-len(a)
, um 12 Bytes zu sparen; und ersetzenchr(r+43)
mitchr(r+43)*(d>0!=r-1)
und dann können Sie die Zeile löschenb=b[:-1].replace(',','')
, um netto 15 Bytes zu sparen ((d>0!=r-1)
entspricht(d>0 and 0!=r-1)
).Brachylog , 36 Bytes
Probieren Sie es online!
Mehr als die Hälfte davon ist das richtige Ausgabeformat. Die eigentliche Kernlogik ist nur:
15 Bytes
Probieren Sie es online!
Dies gibt eine Liste wie [123, –45, –67,89] zurück. Der Ausdruck ist die Summe der Elemente, und die Anzahl der Operatoren ist 1 weniger als die Länge der Liste.
~cLhℕ∧100~+L
Funktioniert fast für 12 Bytes ( Online testen! ) - aber es ist zu langsam, um vollständige 9-stellige Eingaben auf TIO zu verarbeiten, und was noch wichtiger ist, es schlägt fehl für Eingaben wie10808
: Brachylog ist zu intelligent, um Zahlen zu teilen, um führende Nullen zu haben, oder? t Die Partition [108, -08] sehen.quelle
Haskell ,
180178 BytesProbieren Sie es online! Verbrauch:
g "123456789"
Erträge(3,"123-45-67+89")
.#
Erstellt eine Liste aller möglichen Begriffe,?
wertet einen Begriff aus undg
filtert die Begriffe, die mit 100 bewertet werden, und gibt denjenigen mit der minimalen Anzahl von Operanden zurück.quelle
Gelee , 27 Bytes
Probieren Sie es online!
Ich kann nicht sagen, dass ich Jonathan Allans älterer Antwort nicht ein paar Hinweise entnommen habe. ;-)
Im Vergleich zu seiner Antwort ist diese nur zwei Bytes kürzer (30) und nicht fünf, wenn wir den Vergleich aufgrund von Sprachaktualisierungen fair halten:
Wenn wir die andere Art vergleichen (neuere Version statt ältere), ist der Unterschied der gleiche (seine wird 29 Bytes, siehe unten):
quelle