您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python破解24点游戏

时间:2023-01-03 12:02:31  来源:今日头条  作者:汪同学Python

 

问题描述:

给定四个整数,任意使用加、减、乘、除和小括号,构造出一个表达式,使得其最终结果为24,并输出这四个数字所组成的所有表达式。

例如:

34-15/3-5=24

代码

'''
    combinations:获取列表任意长度的子集

'''

from itertools import combinations

import re

from numpy import random


class Solver:
    # 需要达成的目标值
    target = 24

    # 四则运算符
    ops = ['+', '-', '*', '/', '--', '//']

    # precise_mode为精准模式,若开启,则减号及除号后开启括号
    def __init__(self, precise_mode=False):

        self.precise_mode = precise_mode

    def solution(self, nums):

        result = []
        groups = self.dimensionality_reduction(self.format(nums))

        for group in groups:

            for op in self.ops:

                exp = self.assemble(group[0], group[1], op)['exp']

                if self.check(exp, self.target) and exp not in result:
                    result.Append(exp)

        return [exp + '=' + str(self.target) for exp in result]

    # 对需要处理的数字或表达式组合进行降维,降到二维
    def dimensionality_reduction(self, nums):

        result = []

        # 如果维数大于2,则选出两个表达式组合成一个,从而降低一个维度,通过递归降低到二维
        if len(nums) > 2:

            for group in self.group(nums, 2):

                for op in self.ops:
                    new_group = [self.assemble(group[0][0], group[0][1], op)] + group[1]
                    result += self.dimensionality_reduction(new_group)
        else:

            result = [nums]

        return result

    # 将两个表达式组合成一个新表达式
    def assemble(self, exp1, exp2, op):

        # 如果运算符为'--'或者'//',则交换数字顺序重新计算
        if op == '--' or op == '//':
            return self.assemble(exp2, exp1, op[0])

        if op in r'*/':
            exp1 = self.add_parenthesis(exp1)
            exp2 = self.add_parenthesis(exp2)

        if self.precise_mode:

            if op == '-':

                exp2 = self.add_parenthesis(exp2)

            elif op == '/':

                exp2 = self.add_parenthesis(exp2, True)

        exp = self.convert(exp1['exp'] + op + exp2['exp'], op)

        return {'op': op, 'exp': exp}

    # 根据需要为表达式添加相应的括号
    @staticmethod
    def add_parenthesis(exp, is_necessary=False):

        # 如果上一步计算步骤的运算符号为加号或减号,则需要添加括号
        if (is_necessary and not exp['exp'].isdigit()) or exp['op'] in r'+-':

            result = {

                'exp': '(' + exp['exp'] + ')',
                'op': exp['op']

            }

        else:
            result = exp

        return result

    # 检查表达式是否与结果相等,考虑到中间步骤的除法,因此不采用相等判断,而是采用计算值和目标值的绝对值是否符合某个精度
    @staticmethod
    def check(exp, target, precision=0.0001):

        try:
            return abs(eval(exp) - target) < precision
        except ZeroDivisionError:
            return False

    # 将表达式各项重新排序成为等价标准表达式
    @staticmethod
    def convert(exp, op):

        if op in r'+-':
            pattern = r'([+-](((.+)|d+)[*/]((.+)|d+)|d+))'
            exp = '+' + exp
        else:
            pattern = r'([*/]((.+?)|d+))'
            exp = '*' + exp

        result = ''.join(sorted([i[0] for i in re.findall(pattern, exp)]))

        if len(result) != len(exp):
            result = exp

        return result[1:]

    # 将输入的数字格式化为字典,数字的运算符为空格
    @staticmethod
    def format(nums):

        return [{'op': ' ', 'exp': str(num)} for num in nums]

    # 对表达式列表进行分组,返回列表
    @staticmethod
    def group(exp_list, counter):

        # 生成以下标号为元素的列表
        index_list = [i for i in range(len(exp_list))]

        # 以下标号列表取出不重复的组合
        combination = list(combinations(index_list, counter))

        # 使用下标得到原表达式组成最终的结果数组
        for group1 in combination:
            group2 = list(set(index_list) - set(group1))

            yield [
                [exp_list[g1] for g1 in group1],
                [exp_list[g2] for g2 in group2]
            ]


auto_input = False

if auto_input:

    customer_input = random.randint(1, 20, size=4)

else:

    customer_input = list()
    customer_input.append(input("请输入第一个数字:"))
    customer_input.append(input("请输入第二个数字:"))
    customer_input.append(input("请输入第三个数字:"))
    customer_input.append(input("请输入第四个数字:"))

task = Solver()

answer = task.solution(customer_input)

if len(answer) == 0:
    print('No solutions')

else:
    for a in answer:
        print(a)

运行结果

请输入第一个数字:1
请输入第二个数字:2
请输入第三个数字:6
请输入第四个数字:4
(2-1)*4*6=24
4*6/(2-1)=24
(2+6)*(4-1)=24


Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
导读:使用 C 扩展为 Python 提供特定功能。本文字数:7993,阅读时长大约: 9分钟 使用 C 扩展为 Python 提供特定功能。 在前一篇文章中,我介绍了 opensource.com。在大多数系统上,C...【详细内容】
2023-01-03  Tags: Python  点击:(6)  评论:(0)  加入收藏
TikTokDownload 是由国人开源的抖音去水印视频下载工具。开源地址是:https://github.com/Johnserf-Seed/TikTokDownload对于某些做视频分析和研究的同学来说,这个工具非常有用...【详细内容】
2023-01-03  Tags: Python  点击:(10)  评论:(0)  加入收藏
问题描述:给定四个整数,任意使用加、减、乘、除和小括号,构造出一个表达式,使得其最终结果为24,并输出这四个数字所组成的所有表达式。例如:34-15/3-5=24代码&#39;&#39;&#39;...【详细内容】
2023-01-03  Tags: Python  点击:(0)  评论:(0)  加入收藏
本文分享自华为云社区《[Python图像处理] 三十.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算法)丨【拜托了,物联网!】-云社区-华为云》,作者:eastmount 。一.图像去雾随着...【详细内容】
2022-12-30  Tags: Python  点击:(10)  评论:(0)  加入收藏
下面从这几个方面来详细详解python面向对象: 初识对象 成员方法 类和对象 构造方法 其它内置方法 封装 继承 类型注解 多态 综合案例一、初识对象生活中数据的组织 学校开学...【详细内容】
2022-12-29  Tags: Python  点击:(16)  评论:(0)  加入收藏
在当今这个社会,数据就是财富,数据就是金钱,一切都离不开数据,我们看到的一切图片,本质上都是数据,如何理解和处理这些图像数据是很大的难题,不过庆幸的是,在 Python 中,已经有了非常...【详细内容】
2022-12-28  Tags: Python  点击:(8)  评论:(0)  加入收藏
一、ChatGPT简介1.ChatGPT工作原理ChatGPT是一种使用GPT-3预训练的语言模型;用于自然语言处理任务,特别是聊天机器人的建模。GPT-3是OpenAI开发的一种大型神经语言模型,它能够...【详细内容】
2022-12-23  Tags: Python  点击:(33)  评论:(0)  加入收藏
一、Python绝对路径和相对路径明确一个文件所在的路径,有 2 种表示方式,分别是:◆绝对路径:总是从根文件夹开始,Window 系统中以盘符(C:、D:)作为根文件夹,而 OS X 或者 Linux 系统中...【详细内容】
2022-12-22  Tags: Python  点击:(15)  评论:(0)  加入收藏
每个中国人,都是天生的元类使用者学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生万物 我是谁?我从哪来里?我要到哪里去?在python世界,拥有一个永恒的道,那就是“type”,请记...【详细内容】
2022-12-13  Tags: Python  点击:(18)  评论:(0)  加入收藏
在本教程中,我们将学习如何在不使用 Open3D 库的情况下从深度图像计算点云。我们还将展示如何优化代码以获得更好的性能。1. 深度图像深度图像(也称为深度图)是一种图像,其...【详细内容】
2022-12-10  Tags: Python  点击:(31)  评论:(0)  加入收藏
▌简易百科推荐
导读:使用 C 扩展为 Python 提供特定功能。本文字数:7993,阅读时长大约: 9分钟 使用 C 扩展为 Python 提供特定功能。 在前一篇文章中,我介绍了 opensource.com。在大多数系统上,C...【详细内容】
2023-01-03  Linux 中国    Tags:Python   点击:(6)  评论:(0)  加入收藏
TikTokDownload 是由国人开源的抖音去水印视频下载工具。开源地址是:https://github.com/Johnserf-Seed/TikTokDownload对于某些做视频分析和研究的同学来说,这个工具非常有用...【详细内容】
2023-01-03  Python实用宝典    Tags:Python   点击:(10)  评论:(0)  加入收藏
问题描述:给定四个整数,任意使用加、减、乘、除和小括号,构造出一个表达式,使得其最终结果为24,并输出这四个数字所组成的所有表达式。例如:34-15/3-5=24代码&#39;&#39;&#39;...【详细内容】
2023-01-03  汪同学Python  今日头条  Tags:Python   点击:(0)  评论:(0)  加入收藏
本文分享自华为云社区《[Python图像处理] 三十.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算法)丨【拜托了,物联网!】-云社区-华为云》,作者:eastmount 。一.图像去雾随着...【详细内容】
2022-12-30    华为云社区  Tags:Python   点击:(10)  评论:(0)  加入收藏
下面从这几个方面来详细详解python面向对象: 初识对象 成员方法 类和对象 构造方法 其它内置方法 封装 继承 类型注解 多态 综合案例一、初识对象生活中数据的组织 学校开学...【详细内容】
2022-12-29  传智教育官方账号  今日头条  Tags:Python   点击:(16)  评论:(0)  加入收藏
在当今这个社会,数据就是财富,数据就是金钱,一切都离不开数据,我们看到的一切图片,本质上都是数据,如何理解和处理这些图像数据是很大的难题,不过庆幸的是,在 Python 中,已经有了非常...【详细内容】
2022-12-28    网易号  Tags:python   点击:(8)  评论:(0)  加入收藏
一、ChatGPT简介1.ChatGPT工作原理ChatGPT是一种使用GPT-3预训练的语言模型;用于自然语言处理任务,特别是聊天机器人的建模。GPT-3是OpenAI开发的一种大型神经语言模型,它能够...【详细内容】
2022-12-23  digitalclub  微信公众号  Tags:ChatGPT   点击:(33)  评论:(0)  加入收藏
一、Python绝对路径和相对路径明确一个文件所在的路径,有 2 种表示方式,分别是:◆绝对路径:总是从根文件夹开始,Window 系统中以盘符(C:、D:)作为根文件夹,而 OS X 或者 Linux 系统中...【详细内容】
2022-12-22    今日头条  Tags:Python   点击:(15)  评论:(0)  加入收藏
每个中国人,都是天生的元类使用者学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生万物 我是谁?我从哪来里?我要到哪里去?在python世界,拥有一个永恒的道,那就是“type”,请记...【详细内容】
2022-12-13  python言论  今日头条  Tags:Python ynu,;   点击:(18)  评论:(0)  加入收藏
在本教程中,我们将学习如何在不使用 Open3D 库的情况下从深度图像计算点云。我们还将展示如何优化代码以获得更好的性能。1. 深度图像深度图像(也称为深度图)是一种图像,其...【详细内容】
2022-12-10  不靠谱的猫  今日头条  Tags:Python   点击:(31)  评论:(0)  加入收藏
站内最新
站内热门
站内头条