鱼C论坛

 找回密码
 立即注册
查看: 5286|回复: 37

Python:每日一题 353

[复制链接]
发表于 2020-3-16 17:59:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


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

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

示例 1:

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

输入:[1, 2, 1, 2]
输出:False


欢迎大家一起答题!

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-16 18:10:35 | 显示全部楼层
注意2是什么意思,另外4个数里面有没有重复数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 18:16:32 | 显示全部楼层
是不是说不能把减号当负号的意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 18:56:47 | 显示全部楼层
本帖最后由 zltzlt 于 2020-3-17 13:20 编辑
  1. from operator import add,sub,mul
  2. from fractions import Fraction as div
  3. from itertools import permutations as perm
  4. operators=(add,sub,mul,div)
  5. target=24

  6. class Solution:
  7.         def judgePoint24(self, nums: List[int]) -> bool:
  8.                 for a,b,c,d in perm(nums):
  9.                         for x in operators:
  10.                                 for y in operators:
  11.                                         for z in operators:
  12.                                                 try:
  13.                                                         p=z(a,y(b,x(c,d)))==target
  14.                                                 except:
  15.                                                         p=0
  16.                                                 try:
  17.                                                         q=z(x(a,b),y(c,d))==target
  18.                                                 except:
  19.                                                         q=0
  20.                                                 if p or q:
  21.                                                         return True
  22.                 return False
复制代码
我曰,我要吐了……

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 19:32:15 | 显示全部楼层
这题没法做,只能每个可能性都尝试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 19:32:43 | 显示全部楼层
感觉自己的方法好蠢。。。。
  1. import itertools


  2. def f353(list1):
  3.     str1 = ""
  4.     for i in list1:
  5.         str1 += str(i)
  6.     num_list = list(itertools.permutations(str1,4))
  7.     symbol_list = list(itertools.permutations(["+", "-", "*", "/", "+", "-", "*", "/", "+", "-", "*", "/"], 3))
  8.     for j in num_list:
  9.         for h in symbol_list:
  10.             if eval((j[0] + h[0] + j[1]) + h[1] + j[2] + h[2] + j[3]) == 24:
  11.                 return True
  12.             if eval(j[0] + h[0] + (j[1] + h[1] + j[2]) + h[2] + j[3]) == 24:
  13.                 return True
  14.             if eval(j[0] + h[0] + j[1] + h[1] + (j[2] + h[2] + j[3])) == 24:
  15.                 return True
  16.             if eval((j[0] + h[0] + j[1]) + h[1] + (j[2] + h[2] + j[3])) == 24:
  17.                 return True
  18.             if eval((j[0] + h[0] + j[1] + h[1] + j[2]) + h[2] + j[3]) == 24:
  19.                 return True
  20.             if eval(j[0] + h[0] + (j[1] + h[1] + j[2] + h[2] + j[3])) == 24:
  21.                 return True
  22.             if eval(j[0] + h[0] + j[1] + h[1] + j[2] + h[2] + j[3]) == 24:
  23.                 return True
  24.     else:
  25.         return False
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 19:33:56 | 显示全部楼层
l0stparadise 发表于 2020-3-16 19:32
感觉自己的方法好蠢。。。。

可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-16 19:40:02 | 显示全部楼层
fan1993423 发表于 2020-3-16 18:10
注意2是什么意思,另外4个数里面有没有重复数

可能有
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-16 19:40:06 | 显示全部楼层
fan1993423 发表于 2020-3-16 18:16
是不是说不能把减号当负号的意思

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 19:59:25 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-16 21:37 编辑
fan1993423 发表于 2020-3-16 19:32
这题没法做,只能每个可能性都尝试


只有小于等于9720种可能性
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 20:02:19 | 显示全部楼层
本帖最后由 塔利班 于 2020-3-17 11:24 编辑
  1. def f353(x):
  2.     from itertools import combinations as cb
  3.     def com(a,b):
  4.         if len(a)==1:
  5.             return a[0]==b
  6.         m=eval('*'.join(map(str,a)))
  7.         if m==b:
  8.             return True
  9.         elif m<b:
  10.             return False
  11.         else:
  12.             for e in a:
  13.                 t=a[:]
  14.                 t.remove(e)
  15.                 if com(t,b+e) or com(t,b-e) or com(t,b*e) or com(t,b/e):
  16.                     return True
  17.             for e,f in cb(a,2):
  18.                 if f<e:
  19.                     e,f=f,e
  20.                 for g in [f+e,f-e,f*e,f/e]:
  21.                     if com(t,b+g) or com(t,b-g) or com(t,b*g) or com(t,b/g) if g else 0:
  22.                         return True
  23.             return False
  24.     return com(x,24)
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 20:17:23 | 显示全部楼层
楼主有个注意事项没写出:
每个张牌只能用一次。
不然的话……
2+2+2+2+2+2+2+2+2+2+2+1+1=24
我感觉短时间内我想不出来解法。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 20:29:33 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-16 19:59
只有小于等于405种可能性

405 是怎么出来的数据?是能够得到True的输入吗?
在没找到规律的情况下暴力求解的话可能性多了去了。
4个数字4个位置,加上三个位置的四则运算符号,那就是1536种可能,再加上必须有括号的情况那就是1560种情况了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 21:04:23 | 显示全部楼层

你这个好像不太对,我输入[3, 6, 7, 10]出来False,( 6 / (3 / 7) + 10 ) 应该是可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 21:10:33 | 显示全部楼层
先占个位
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

抱歉啊……少算了排列
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

一般玩 24 点游戏每张牌也只能用一次啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 21:31:28 | 显示全部楼层
zltzlt 发表于 2020-3-16 21:22
一般玩 24 点游戏每张牌也只能用一次啊

版主求求你了……别再出这种变态题了……我要吐了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 22:01:44 | 显示全部楼层
本帖最后由 塔利班 于 2020-3-16 22:13 编辑
wcshds 发表于 2020-3-16 21:04
你这个好像不太对,我输入[3, 6, 7, 10]出来False,( 6 / (3 / 7) + 10 ) 应该是可以的


哦,是有问题,pm我以为迭代的结果不一样,已改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 22:44:58 | 显示全部楼层
明天再写吧,今天有点晚了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 07:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表