(Kann ich) Fügen Sie Klammern hinzu, um dies zu bestätigen

8

Ich habe diese letzte rätselhafte Frage gesehen:

Fügen Sie Klammern hinzu, um dies zu bestätigen

Und sah, dass eine Antwort ein Python-Skript verwendete, um alle Möglichkeiten auszuprobieren .

Ihre Herausforderung besteht darin, bei einem Ausdruck (als Zeichenfolge) und einer Ganzzahl ein Programm zu erstellen, das erkennen kann, ob Sie Parens hinzufügen können, damit der Ausdruck der Ganzzahl entspricht.

Wenn beispielsweise der Ausdruck 1 + 2 * 3und die Ganzzahl ist 9, können Sie Parens wie (1 + 2) * 39 hinzufügen , sodass die Ausgabe wahr sein sollte. Aber wenn der Ausdruck 1 + 2 - 3 * 4 / 5und die Ganzzahl ist 9999999999999, können Sie keine Anzahl von Parens hinzufügen, um dies gleich zu machen 9999999999999, daher sollte die Ausgabe falsch sein.

Beachten Sie, dass die Ganzzahleingabe positiv oder negativ sein kann, der Ausdruck jedoch nur positive Ganzzahlen enthält. Tatsächlich (\d+ [+*/-] )+ \dstimmt der Ausdruck immer überein (Regex). Mit anderen Worten, ohne parens, keine Exponenten, nur +, -, *und /. Standardoperatorreihenfolge ( *und /dann +und -).

Weitere Testfälle:

1 + 2 - 3 * 4 / 9 and -1 -> truthy, ((1 + 2) - (3 * 4)) / 9
10 - 9 * 8 - 7 * 6 - 5 * 4 - 3 * 2 - 2 * 1 and 1, falsey, see linked question
10 + 9 - 8 * 7 + 6 - 5 * 4 + 3 - 2 * 1 and 82 -> truthy, (10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1
34 + 3 and 15 -> falsey
1 + 2 + 5 + 7 and 36 -> falsey
1 / 10 * 3 + 3 / 10 * 10 and 6 -> truthy, (1/10*3+3/10)*10

Irgendwelche Fragen?

Sie können den Ausdruck in Klammern ausgeben, wenn dies möglich ist, beispielsweise (10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1für den letzten Testfall. Ich würde dies nur einem wahrheitsgemäßen Wert vorziehen, aber es liegt an Ihnen. Die Verwendung 2(5)zur Multiplikation ist nur nicht zulässig *.

programmer5000
quelle
/ist Float Division, richtig?
Rod
@ Rod ja, das ist es.
Programmierer5000
1
Sie sollten einen Testfall haben, für den ein nicht ganzzahliges Zwischenergebnis verwendet werden muss.
Feersum
Sie sollten einen Testfall hinzufügen, in dem eine Division durch Null auftreten kann, wie3 / 2 - 1 - 1 and 2 -> 3 / (2 - 1) - 1
mbomb007

Antworten:

3

Python 2, 286 285 282 Bytes

from fractions import*
P=lambda L:[p+[L[i:]]for i in range(len(L))for p in P(L[:i])]or[L]
x,y=input()
x=x.split()
for p in P(['Fraction(%s)'%e for e in x[::2]]):
 try:print 1/(eval(''.join(sum(zip(eval(`p`.replace("['","'(").replace("']",")'")),x[1::2]+[0]),())[:-1]))==y)
 except:0

Probieren Sie es online aus

Erläuterung:

Diese Version druckt alle Arbeitsausdrücke (mit den FractionObjekten).

from fractions import*
# Sublist Partitions (ref 1)
P=lambda L:[p+[L[i:]]for i in range(len(L))for p in P(L[:i])]or[L]
x,y=input()
x=x.split()
# Convert all numbers to Fractions for division to work
n=['Fraction(%s)'%e for e in x[::2]]
# Operators
o=x[1::2]
# Try each partition
for p in P(n):
    # Move parens to be inside strings
    n=eval(`p`.replace("['","'(").replace("']",")'"))
    # Alternate numbers and operators (ref 2)
    x=''.join(sum(zip(n,o+[0]),())[:-1])
    # Prevent division by zero errors
    try:
        # Evaluate and check equality
        if eval(x)==y:print x
    except:0

Probieren Sie es online aus

Verweise:

  1. Partitionierungsfunktion

  2. Wechselnder Reißverschluss

Dank Felipe Nardi Batista wurden 3 Bytes gespeichert

mbomb007
quelle
1- Können Sie Python3 ( /ist Float Division) verwenden und alle Verwendungen löschen fractions? 2 - Was ist mit Divisionen durch 0?
Rod
@ Rod Nein, das kannst du nicht. Float Division ist der Grund, warum es erforderlich ist.
mbomb007
Was ist dann der Grund?
Rod
Oh, Rundungsprobleme
Rod
Ich habe das Problem der Division durch Null behoben. Es funktionierte immer noch für jedes Beispiel, bei dem die Lösung vor der Division durch Null kam, aber ich fand einen Testfall, der sie brach. Es ist der letzte Testfall in meiner Testsuite.
mbomb007