私はPythonの初心者ですから、いくつかのWebサイトからいくつかのコードを勉強しようとしています。 GitHubで演算式のためにBruteforce searchを実行するアルゴリズムが見つかりました。コードは次のとおりです。算術演算のブルートフォース検索アルゴリズム
#!python
import operator
import itertools
from fractions import Fraction
operations = dict()
operations['+'] = operator.add
operations['-'] = operator.sub
operations['/'] = operator.truediv
operations['*'] = operator.mul
def solve(target, numbers):
"""List ways to make target from numbers."""
numbers = [Fraction(x) for x in numbers]
return solve_inner(target, numbers)
def solve_inner(target, numbers):
if len(numbers) == 1:
if numbers[0] == target:
yield str(target)
return
# combine a pair of numbers with an operation, then recurse
for a,b in itertools.permutations(numbers, 2):
for symbol, operation in operations.items():
try:
product = operation(a,b)
except ZeroDivisionError:
continue
subnumbers = list(numbers)
subnumbers.remove(a)
subnumbers.remove(b)
subnumbers.append(product)
for solution in solve_inner(target, subnumbers):
# expand product (but only once)
yield solution.replace(str(product), "({0}{1}{2})".format(a, symbol, b), 1)
if __name__ == "__main__":
numbers = [1, 5, 6, 7]
target = 5
solutions = solve(target, numbers)
for solution in solutions:
print("{0}={1}".format(target, solution))
それは単に私のnumbers
を使用して、任意の算術式をしようとして終了し、その結果(私が持っている結果)としてtarget
を取得したものを印刷します。
私は、式が結果として得られなかったときにスクリプトが試した解決策を印刷するにはどうすればいいですか?target
私が設定しましたか?
編集:
これは私が試したコードです:
#!python
import operator
import itertools
from fractions import Fraction
operations = dict()
operations['+'] = operator.add
operations['-'] = operator.sub
operations['/'] = operator.truediv
operations['*'] = operator.mul
def solve(target, numbers):
"""List ways to make target from numbers."""
numbers = [Fraction(x) for x in numbers]
return solve_inner(target, numbers)
def solve_inner(target, numbers):
if len(numbers) == 1:
num = numbers[0]
yield str(num), num == target
return
# combine a pair of numbers with an operation, then recurse
for a,b in itertools.permutations(numbers, 2):
for symbol, operation in operations.items():
try:
product = operation(a,b)
except ZeroDivisionError:
continue
subnumbers = list(numbers)
subnumbers.remove(a)
subnumbers.remove(b)
subnumbers.append(product)
for solution, truth in solve_inner(target, subnumbers):
yield solution.replace(str(product),
"{0}=({1}{2}{3})".format(product, a, symbol, b), 1), truth
if __name__ == "__main__":
numbers = [1, 5, 6, 7]
target = 5
solutions = solve(target, numbers)
for solution, truth in solutions:
print("{0}? {1}".format(solution,
'True' if truth else ''))
私は、結果として、実際の製品を得るが、私は式の中で、小さな操作の結果を得る:
42=(7*6)/5=(42/5)=(1*42/5)
ながら私は実際に文字列の始めにわずか42を取得しようとしています。
質問を編集しました。 – Rhanny
テリー、任意の提案? 'product'が算術式全体の正しいものであることをどうやって確認できますか? 'subnumbers.insert(0、product))'は最後の再帰に置かなければなりません。 – Rhanny
インサートは、現在の 'subnumbers.append(product)'を置き換えるべきです。 –