为什么我的代码不能涵盖所有情况?-Codewars中的Python 3赌场芯片挑战



我是编程初学者,几周前刚开始学习。当我没有太多时间的时候,我会进行代码战,思考如何解决问题,这一次是赌场的挑战。我想出了一个可以覆盖所有内容的东西,但在208个案例中,有4个案例仍然失败,我陷入了困境。

挑战在于:

这个挑战被称为赌场芯片。有三堆芯片,白色,绿色,黑色芯片。

你每天只吃两片薯片,它们不可能是同一种颜色。在这种情况下,我必须退还我可以接受筹码的最长天数。每天必须取2个,它们必须是不同的颜色。

示例:[1,2,1]<=(1白色,2绿色,1黑色(=>返回:2 days。CCD_ 3=>2、[8,1,4]=>5等

没有残忍的行为。

这是我的代码

def solve(arr):
arr.sort()
s = arr[0] + arr[1]
if arr == [1,1,1]:
return arr[0]
elif arr[0] + arr[1] <= arr[2]:
return s
elif arr[1] == arr[2] and arr[1] != arr[0]:
m = arr[0] - 1 + arr[1]
return m
elif arr[0] == arr[1] and arr[0] == arr[2]:
d = arr[0] / 2 + arr[1]
return int(d)
elif arr[0] + arr[1] > arr[2]:
e = (arr[0] + arr[1] + arr[2]) / 2
return int(e)

我小时候跳过过数学课,导致我跟不上,所以我的数学知识是0

你知道我的代码没有涵盖什么选项吗?或者有人知道完成任务的公式吗?或者你会如何亲自编码?

您的第三种情况是错误的,一个反例是arr = [3, 4, 4]

然而,更有趣的是,你的案例2和5一起涵盖了所有的可能性,并且已经正确地解决了它们:

def solve(arr):
arr.sort()
s = arr[0] + arr[1]
if s <= arr[2]: #your case 2
return s
else: #your case 5
e = (arr[0] + arr[1] + arr[2]) / 2
return int(e)

这里有一个非常简单的递归解决方案,可能更容易理解:

from typing import List
def casino(chips: List[int], days: int = 0) -> int:
chips.sort(reverse=True)
chigh, cmed, clow = chips
if chigh == 0 or cmed == 0:
# can't remove any more chips
return days
# remove one chip from the highest stack and one from the medium stack
# advance to next day
return casino([chigh-1, cmed-1, clow], days+1)

这里有一种方法也允许用户可视化选项:

white = ['white']*8
green = ['green']*1
black = ['black']*4
chips = white+green+black
l = []
while not all([a==b for a in chips for b in chips]):
m1 = max(chips,key=lambda x:chips.count(x))
m2 = max(chips,key=lambda x:[a for a in chips if a!=m1].count(x))
chips.remove(m1)
chips.remove(m2)
l.append([m1,m2])
print(l)
print(len(l))

输出:

[['white', 'black'],
['white', 'black'],
['white', 'black'],
['white', 'green'],
['white', 'black']]
5

最新更新