首页 > 解决方案 > 最接近用户输入的数字

问题描述

所以我想知道是否有可能从用户那里获取 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 是不可能的解决方案。

标签: pythonalgorithm

解决方案


虽然 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 个以上的运算符可能需要很长时间。


推荐阅读