この関数は、数字とターゲット整数の文字列を取り、オペレータを挿入して目的のターゲットに到達するすべての可能な方法を出力します。すべての場合、出力にはすべての桁が順番に含まれていなければなりません。何も省略することができる。この関数を任意の長さの文字列にする
#!/usr/bin/env python3
def find_expressions(digits, target):
if not (isinstance(digits, str) or isinstance(digits, list)) or not isinstance(target, int):
raise TypeError
if len(digits) != 5:
raise TypeError('digits must be of length 5')
solutions = []
operators = ('', ' + ', ' - ', ' * ', '/')
for i in operators:
for j in operators:
for k in operators:
for l in operators:
s = digits[0] + i + digits[1] + j + digits[2] + k + digits[3] + l + digits[4]
try:
if eval(s) == target:
solutions.append(s + ' == {}'.format(target))
except (ZeroDivisionError, SyntaxError):
pass
print('\n'.join(solutions))
きれいではありませんが、動作します。問題は、長さが5の文字列しか必要としないということです。どのようにすれば、それを任意の長さの文字列にすることができますか? (たとえば、find_expressions('12345678', 2)
を呼び出すことは有効です。)私はfor
ループを再帰で置き換える必要があると考えていますが、これを達成する方法については迷っています。
出力例
呼び出すfind_expressions('75228', 5)
プリント:
7 + 5 + 2/2 - 8 == 5
7 * 5 - 22 - 8 == 5
7 * 5 - 2 - 28 == 5
警告は
私は、私はすべての可能性を超えるループすることによって取って全体の強引なアプローチに満足していませんよ。もっと良いアルゴリズムがあれば、それについて聞きたいと思います。 しかし、この質問は、可能な限り小さな変更をしながら任意の長さの入力を行うことに関するものです。
あなたは 'itertools'モジュールを調べましたか? – TigerhawkT3
はい、私は持っていますが、動作するようなものは見ませんでした。私は何かを見落としている可能性が高いですが、私の人生のために、それが何であるかを理解することはできません。 –
ここでは、2桁の数字は、例の出力に表示されていますか? – martineau