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:} 注意2是什么意思,另外4个数里面有没有重复数 是不是说不能把减号当负号的意思{:10_245:} 本帖最后由 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我曰,我要吐了…… 这题没法做,只能每个可能性都尝试 感觉自己的方法好蠢。。。。
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
l0stparadise 发表于 2020-3-16 19:32
感觉自己的方法好蠢。。。。
可以的 fan1993423 发表于 2020-3-16 18:10
注意2是什么意思,另外4个数里面有没有重复数
可能有 fan1993423 发表于 2020-3-16 18:16
是不是说不能把减号当负号的意思
是的 本帖最后由 永恒的蓝色梦想 于 2020-3-16 21:37 编辑
fan1993423 发表于 2020-3-16 19:32
这题没法做,只能每个可能性都尝试
只有小于等于9720种可能性 本帖最后由 塔利班 于 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) 楼主有个注意事项没写出:
每个张牌只能用一次。
不然的话……
2+2+2+2+2+2+2+2+2+2+2+1+1=24
我感觉短时间内我想不出来解法。 永恒的蓝色梦想 发表于 2020-3-16 19:59
只有小于等于405种可能性
405 是怎么出来的数据?是能够得到True的输入吗?
在没找到规律的情况下暴力求解的话可能性多了去了。
4个数字4个位置,加上三个位置的四则运算符号,那就是1536种可能,再加上必须有括号的情况那就是1560种情况了。 塔利班 发表于 2020-3-16 20:02
你这个好像不太对,我输入出来False,( 6 / (3 / 7) + 10 ) 应该是可以的 先占个位 阴阳神万物主 发表于 2020-3-16 20:29
405 是怎么出来的数据?是能够得到True的输入吗?
在没找到规律的情况下暴力求解的话可能性多了去了。
...
抱歉啊……少算了排列 阴阳神万物主 发表于 2020-3-16 20:17
楼主有个注意事项没写出:
每个张牌只能用一次。
不然的话……
一般玩 24 点游戏每张牌也只能用一次啊 zltzlt 发表于 2020-3-16 21:22
一般玩 24 点游戏每张牌也只能用一次啊
版主求求你了……别再出这种变态题了……我要吐了{:10_247:} 本帖最后由 塔利班 于 2020-3-16 22:13 编辑
wcshds 发表于 2020-3-16 21:04
你这个好像不太对,我输入出来False,( 6 / (3 / 7) + 10 ) 应该是可以的
哦,是有问题,pm我以为迭代的结果不一样,已改 明天再写吧,今天有点晚了
页:
[1]
2