python - 最接近用户输入的数字
问题描述
所以我想知道是否有可能从用户那里获取 3 个数字,范围从 1-6 并从用户那里再获取 1 个输入,范围从 1 到 144,并制作一个程序,获取你得到的前 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))
要支持更多运算符,只需将它们插入列表中,{}
参数所在的位置是 's,并用括号括起来。我添加了对额外运算符的支持,但是由于在找到完美解决方案时我不会缩短迭代,因此 3 个以上的运算符可能需要很长时间。
推荐阅读
- oracle11g - Oracle 11g 的视图选项卡中未显示数据挖掘选项
- javascript - 以异步方式发送网格邮件
- hyperledger-fabric - 调用链代码时出错“参数数量不正确。预期为 6”
- javascript - ElementClickInterceptedException:消息:元素点击被拦截 - 机器人框架
- corda - corda 是否支持从一个节点迁移到具有不同网络的另一个节点
- vba - 使用宏更改文本为 PH 时单词表列的背景颜色
- css - 增加链接/按钮周围的背景大小
- ios - 反应性
在 UITableViewCell - image - 在循环内显示图像时减少循环开销
- pandas-groupby - 如何在熊猫中按两列分组