zjf_24点.py —— 一个玩24点的程序

如题

环境:python 3.7
直接上代码

# 输入 2 个表达式
# 输出这 2 个表达式,各自作为整体,经过四则运算的所有可能结果,输出格式是字典 {表达式:值}
# # # 说明:
# 输入、输出的表达式最外围均有小括号(对于输入,如果输入的是数字则不需要加小括号)
# 加法、乘法均以大的数字在前、小的数字在后的格式显示;
# 减法只保留大减小的那一种情况;
# 除法的两种可能均保留(当然前提是除数非 0 )
# 最多一共会有 5 种结果
def combine_exps_2(exp_a, exp_b):
    # 使 a 为较大的那个数
    if eval(exp_a) < eval(exp_b):
        exp_c = exp_a
        exp_a = exp_b
        exp_b = exp_c
    # 生成所有可能的表达式
    ops = ["+", "-", "*"]
    exps = ['(' + exp_a + op + exp_b + ')' for op in ops]
    values = [eval(exp) for exp in exps]
    results = dict(zip(exps, values))
    if eval(exp_b) != 0:
        new_exp = '(' + exp_a + '/' + exp_b + ')'
        results[new_exp] = eval(new_exp)
    if eval(exp_a) != 0:
        new_exp = '(' + exp_b + '/' + exp_a + ')'
        results[new_exp] = eval(new_exp)
    return results


# 输入 3 个表达式
# 输出这 3 个表达式,各自作为整体,经过四则运算的所有可能结果,输出格式是字典 {表达式:值}
# # # 说明:
# 基于且类似于 combine_exps_2
def combine_exps_3(exp_a, exp_b, exp_c):
    results = {}
    exps = [exp_a, exp_b, exp_c]
    for idx in range(3):
        e0 = exps[idx]
        e1, e2 = exps[:idx] + exps[idx + 1:]
        combinations_e1_e2 = combine_exps_2(e1, e2)
        for a_combination_e1_e2 in combinations_e1_e2:
            results.update(combine_exps_2(e0, a_combination_e1_e2))
    return results


# 输入 4 个表达式
# 输出这 4 个表达式,各自作为整体,经过四则运算的所有可能结果,输出格式是字典 {表达式:值}
# # # 说明:
# 基于且类似于 combine_exps_2, combine_exps_3
def combine_exps_4(exp_a, exp_b, exp_c, exp_d):
    results = {}
    exps = [exp_a, exp_b, exp_c, exp_d]
    
    # 把 4 分解成 2 + 1 + 1,再使用 combine_exps_3 即可
    # 选取 “2”(剩下的就是 “1 + 1”)
    possibilities = []
    for i in range(3):
        for j in range(i + 1, 4):
            possibilities += [[i, j]]
    # 生成所有结果
    for lucky_dog_pair_idxes in possibilities:
        leftover_pair_idxes = [i for i in range(4) if i not in lucky_dog_pair_idxes]
        lucky_dog_pair = [exps[i] for i in lucky_dog_pair_idxes]
        leftover_1, leftover_2 = [exps[i] for i in leftover_pair_idxes]
        lucky_dog_pair_combinations = combine_exps_2(lucky_dog_pair[0], lucky_dog_pair[1])
        for lucky_dog_pair_combination in lucky_dog_pair_combinations:
            results.update(combine_exps_3(lucky_dog_pair_combination, leftover_1, leftover_2))

    return results


# 输入一个含有 4 个整数的数组
# 输出用这 4 个整数,通过四则运算组合出 24 的所有方式(输出的是具体的运算表达式)
def clock24(arr):
    results = []
    exp_a, exp_b, exp_c, exp_d = [str(num) for num in arr]
    arr_combinations = combine_exps_4(exp_a, exp_b, exp_c, exp_d)
    for comb in arr_combinations:
        if arr_combinations[comb] == 24:
            results.append(comb)
    return results

# 示例
clock24_res = clock24([1, 3, 5, 7])
for re in clock24_res:
    print(re)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值