zltzlt 发表于 2020-3-16 17:59:53

Python:每日一题 353

今天的题目:

给定一个整数数组,代表 4 张写有 1 到 9 数字的牌。判断是否能通过添加 *,/,+,-,(,) 得到 24 的运算结果。

注意:
1. 除法运算符代表小数除法,例如 5 / 2 = 2.5 。
2. 每个运算符对两个数进行运算。不能用 - 作为一元运算符。
3. 不能将数字连接在一起。例如,输入为 时,不能写成 12 + 12 。

示例 1:

输入:
输出:True
解释:(8-4) * (7-1) = 24
示例 2:

输入:
输出:False

{:10_298:}欢迎大家一起答题!{:10_298:}

fan1993423 发表于 2020-3-16 18:10:35

注意2是什么意思,另外4个数里面有没有重复数

fan1993423 发表于 2020-3-16 18:16:32

是不是说不能把减号当负号的意思{:10_245:}

永恒的蓝色梦想 发表于 2020-3-16 18:56:47

本帖最后由 zltzlt 于 2020-3-17 13:20 编辑

from operator import add,sub,mul
from fractions import Fraction as div
from itertools import permutations as perm
operators=(add,sub,mul,div)
target=24

class Solution:
        def judgePoint24(self, nums: List) -> bool:
                for a,b,c,d in perm(nums):
                        for x in operators:
                                for y in operators:
                                        for z in operators:
                                                try:
                                                        p=z(a,y(b,x(c,d)))==target
                                                except:
                                                        p=0
                                                try:
                                                        q=z(x(a,b),y(c,d))==target
                                                except:
                                                        q=0
                                                if p or q:
                                                        return True
                return False我曰,我要吐了……

fan1993423 发表于 2020-3-16 19:32:15

这题没法做,只能每个可能性都尝试

l0stparadise 发表于 2020-3-16 19:32:43

感觉自己的方法好蠢。。。。
import itertools


def f353(list1):
    str1 = ""
    for i in list1:
      str1 += str(i)
    num_list = list(itertools.permutations(str1,4))
    symbol_list = list(itertools.permutations(["+", "-", "*", "/", "+", "-", "*", "/", "+", "-", "*", "/"], 3))
    for j in num_list:
      for h in symbol_list:
            if eval((j + h + j) + h + j + h + j) == 24:
                return True
            if eval(j + h + (j + h + j) + h + j) == 24:
                return True
            if eval(j + h + j + h + (j + h + j)) == 24:
                return True
            if eval((j + h + j) + h + (j + h + j)) == 24:
                return True
            if eval((j + h + j + h + j) + h + j) == 24:
                return True
            if eval(j + h + (j + h + j + h + j)) == 24:
                return True
            if eval(j + h + j + h + j + h + j) == 24:
                return True
    else:
      return False

fan1993423 发表于 2020-3-16 19:33:56

l0stparadise 发表于 2020-3-16 19:32
感觉自己的方法好蠢。。。。

可以的

zltzlt 发表于 2020-3-16 19:40:02

fan1993423 发表于 2020-3-16 18:10
注意2是什么意思,另外4个数里面有没有重复数

可能有

zltzlt 发表于 2020-3-16 19:40:06

fan1993423 发表于 2020-3-16 18:16
是不是说不能把减号当负号的意思

是的

永恒的蓝色梦想 发表于 2020-3-16 19:59:25

本帖最后由 永恒的蓝色梦想 于 2020-3-16 21:37 编辑

fan1993423 发表于 2020-3-16 19:32
这题没法做,只能每个可能性都尝试

只有小于等于9720种可能性

塔利班 发表于 2020-3-16 20:02:19

本帖最后由 塔利班 于 2020-3-17 11:24 编辑

def f353(x):
    from itertools import combinations as cb
    def com(a,b):
      if len(a)==1:
            return a==b
      m=eval('*'.join(map(str,a)))
      if m==b:
            return True
      elif m<b:
            return False
      else:
            for e in a:
                t=a[:]
                t.remove(e)
                if com(t,b+e) or com(t,b-e) or com(t,b*e) or com(t,b/e):
                  return True
            for e,f in cb(a,2):
                if f<e:
                  e,f=f,e
                for g in :
                  if com(t,b+g) or com(t,b-g) or com(t,b*g) or com(t,b/g) if g else 0:
                        return True
            return False
    return com(x,24)

阴阳神万物主 发表于 2020-3-16 20:17:23

楼主有个注意事项没写出:
每个张牌只能用一次。
不然的话……
2+2+2+2+2+2+2+2+2+2+2+1+1=24
我感觉短时间内我想不出来解法。

阴阳神万物主 发表于 2020-3-16 20:29:33

永恒的蓝色梦想 发表于 2020-3-16 19:59
只有小于等于405种可能性

405 是怎么出来的数据?是能够得到True的输入吗?
在没找到规律的情况下暴力求解的话可能性多了去了。
4个数字4个位置,加上三个位置的四则运算符号,那就是1536种可能,再加上必须有括号的情况那就是1560种情况了。

wcshds 发表于 2020-3-16 21:04:23

塔利班 发表于 2020-3-16 20:02


你这个好像不太对,我输入出来False,( 6 / (3 / 7) + 10 ) 应该是可以的

TJBEST 发表于 2020-3-16 21:10:33

先占个位

永恒的蓝色梦想 发表于 2020-3-16 21:16:38

阴阳神万物主 发表于 2020-3-16 20:29
405 是怎么出来的数据?是能够得到True的输入吗?
在没找到规律的情况下暴力求解的话可能性多了去了。
...

抱歉啊……少算了排列

zltzlt 发表于 2020-3-16 21:22:58

阴阳神万物主 发表于 2020-3-16 20:17
楼主有个注意事项没写出:
每个张牌只能用一次。
不然的话……


一般玩 24 点游戏每张牌也只能用一次啊

永恒的蓝色梦想 发表于 2020-3-16 21:31:28

zltzlt 发表于 2020-3-16 21:22
一般玩 24 点游戏每张牌也只能用一次啊

版主求求你了……别再出这种变态题了……我要吐了{:10_247:}

塔利班 发表于 2020-3-16 22:01:44

本帖最后由 塔利班 于 2020-3-16 22:13 编辑

wcshds 发表于 2020-3-16 21:04
你这个好像不太对,我输入出来False,( 6 / (3 / 7) + 10 ) 应该是可以的

哦,是有问题,pm我以为迭代的结果不一样,已改

TJBEST 发表于 2020-3-16 22:44:58

明天再写吧,今天有点晚了
页: [1] 2
查看完整版本: Python:每日一题 353