#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
 
""" 
@author:  
@version: 1.0.0 
@file: test_24.py 
@time: 2021/1/22 上午9:04 
@desc: 输入的4个数据,用加减乘除运算符来计算出能够凑出24 
""" 
 
from pprint import pprint 
from itertools import permutations, combinations 
import operator 
from copy import deepcopy 
 
 
def func(*args): 
    list_operate = ['+', '-', '*', '/'] 
    for op1 in list_operate: 
        for op2 in list_operate: 
            for op3 in list_operate: 
                # print(op3) 
                list_calc = [args[0], op1, args[1], op2, args[2], op3, args[3]] 
                res = recall_clac_list(deepcopy(list_calc)) 
                # print(res) 
                if res == 24: 
                    # print(list_calc) 
                    # print(''.join([str(i) for i in list_calc])) 
                    return ''.join([str(i) for i in list_calc]) 
 
 
def recall_clac_list(list_calc): 
    if '*' in list_calc or '/' in list_calc: 
        for index, value in enumerate(list_calc): 
            if value in ['*', '/']: 
                calc_value = calc(value, list_calc[index - 1], list_calc[index + 1]) 
                list_calc2 = list_calc 
                [list_calc2.pop(index - 1) for i in range(3)] 
                list_calc2.insert(index - 1, calc_value)  # 指针会超出 
                if len(list_calc2) == 1: 
                    return list_calc2[0] 
                return recall_clac_list(list_calc2) 
    else: 
        for index, value in enumerate(list_calc): 
            if value in ['+', '-']: 
                calc_value = calc(value, list_calc[index - 1], list_calc[index + 1]) 
                list_calc2 = list_calc 
                [list_calc2.pop(index - 1) for i in range(3)] 
                list_calc2.insert(index - 1, calc_value)  # 指针会超出 
                if len(list_calc2) == 1: 
                    return list_calc2[0] 
                return recall_clac_list(list_calc2) 
 
 
def calc(operation, v1, v2): 
    return get_operate_method(operation)(v1, v2) 
 
 
def get_operate_method(operation): 
    dict_operator = { 
        '+': operator.add, 
        '-': operator.sub, 
        '*': operator.mul, 
        '/': operator.truediv 
    } 
    return dict_operator.get(operation) 
 
 
def main(): 
    """ 
    测试对列表操作后循环是否会受到影响 
    :return: 
    """ 
    # list1 = [i for i in range(10)] 
    # for index, value in enumerate(list1): 
    #     print(index, value) 
    #     print(list1) 
    #     list1.pop(0) 
    # 
    list_value = [1, 2, 6, 9] 
    res = permutations(list_value, 4) 
    for i in res: 
        res = func(*i) 
        print(res) 
 
 
if __name__ == '__main__': 
    main() 

发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

python 列表字符串依次按照制定长度获取,切片知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。