(できます)これを実現するために括弧を追加します


8

私はこの最近の不可解な質問を見ました:

括弧を追加してこれを実現します

そして、1つの答えがPythonスクリプトを使用してすべての可能性を試すことがわかりました

式(文字列として)と整数を指定すると、括弧を追加して式を整数にできるかどうかを判断できるプログラムを作成することが課題になります。

たとえば、式が1 + 2 * 3で整数がである場合、9に等しいの9ような括弧を追加できる(1 + 2) * 3ため、出力は真実である必要があります。ただし、式が1 + 2 - 3 * 4 / 5で整数がの9999999999999場合、括弧を追加してそれを等しくすることはできない9999999999999ため、出力は誤ったものになります。

整数の入力は正または負の場合がありますが、式には正の整数のみが含まれることに注意してください。実際、式は常に一致します(\d+ [+*/-] )+ \d(正規表現)。言い換えれば、ちょうどなし括弧、ノー指数、+-*/。標準の演算子の順序(*and /、then +および-)。

その他のテストケース:

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

質問は?

たとえば(10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1、最後のテストケースのように、可能であれば、括弧で式を出力できます。私はこれを真実の値よりも好みますが、それはあなた次第です。2(5)乗算に使用することはできません*


/フロート除算ですよね?
ロッド

@ロッドはい、そうです。
programmer5000

1
整数以外の中間結果を使用する必要があるテストケースが必要です。
feersum

あなたは同様に、ゼロによる除算が発生する可能性のあるテストケースを追加する必要があります3 / 2 - 1 - 1 and 2 -> 3 / (2 - 1) - 1
mbomb007

回答:


3

Pythonの2、286の 285 282バイト

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

オンラインでお試しください

説明:

このバージョンでは、(Fractionオブジェクトを含む)すべての動作式が出力されます。

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

オンラインでお試しください

参照:

  1. パーティショニング機能

  2. 交互ジップ

フェリペナルディバティスタのおかげで3バイト節約


1- python3(/float除算)をfractions使用して、すべての用途を削除できますか?2-0による除算はどうですか?
ロッド

@ロッドいいえ、できません。フロート分割が必要な理由です。
mbomb007

その理由は何ですか?
ロッド

ああ、丸めの問題
Rod

ゼロ除算の問題を修正しました。ゼロによる除算の前に解が得られたすべての例で引き続き機能しますが、それを壊すテストケースを見つけました。これは私のテストスイートの最後のテストケースです。
mbomb007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.