所以我想知道是否可以从用户那里获取 1-6 范围内的 3 个数字,再从用户那里获取 1-144 范围内的 1 个输入,然后制作一个程序来获取您获得的前 3 个数字并找到一种方法,使用加法、减法、乘法、除法、根和幂来找到一种方法,使用 3 个数字来获得第 4 个用户输入。如果您无法获得第 4 个用户输入,请从前 3 个输入中找到最接近它的输入。然后程序应该告诉您它使用的操作以及它使用的数字。这基本上是在重新创建 ThinkFun Math Dice 游戏。
例如:如果用户输入的前 3 个数字是 5、2 和 9,而第 4 个数字是 86,程序应该执行 9^2 即 81 和 81+5 即 86。在另一种情况下,如果3 个数字是 6、4 和 2,最终答案是(第 4 个输入)24,程序应该执行 6*4 -2 或 6*4 +2 或 4^2+6,因为这些都等于 26 或22 并且没有可能的解决方案来获得 24。
最佳答案
虽然 btilly 的答案绝对正确,但它比解决这个问题所需的要多一些,至少在 python 中是这样。使用 itertools 库和 eval()
函数,您可以使用更短、更简单的方法。请注意,eval()
和 exec()
被认为是不安全的,因为它们会执行传递的任何内容,但是作为个人使用的脚本应该没问题。无论如何,任何恶意代码都可能会抛出将输入转换为整数的异常。
从 itertools 导入排列
coeffs = list(map(int, input("Coefficents, separated by spaces:\n").split()))
target = int(input("Target value:\n"))
operators = ["({}+{})","({}-{})","({}*{})","({}/{})","({}**{})","({}**(1.0/{}))"]
def make_expr(expr, coeffs, target):
if not coeffs:
try:
return eval(expr), expr
except OverflowError:
return None
except ArithmeticError:
return None
solutions = [make_expr(op.format(expr, coeffs[0]), coeffs[1:], target) for op in operators]
solutions += [make_expr(op.format(coeffs[0], expr), coeffs[1:], target) for op in operators]
solutions = [x for x in solutions if x is not None]
val, expr = min(solutions, key=lambda x: abs(x[0]-target))
return val, expr
def find_best(coeffs, target):
assert(len(coeffs) > 1)
solutions = [make_expr(perm[0], perm[1:], target) for perm in permutations(coeffs)]
solutions = [x for x in solutions if x is not None]
val, expr = min(solutions, key=lambda x: abs(x[0]-target))
return "Closest value: {0}\nExpression: {1}".format(val, expr)
print(find_best(coeffs, target))
要支持更多运算符,只需将它们插入到列表中,在参数所在的位置使用 {}
,并用括号括起来。我已经添加了对额外运算符的支持,但是由于在找到完美解决方案时我没有缩短迭代,因此 3+ 个运算符可能需要很长时间。
关于python - 最接近用户输入的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51065918/