我不确定是什么导致我对以下kata的解决方案失败。
https://www.codewars.com/kata/battle-ships-sunk-damaged-or-not-touched/train/python
我相信如果我可以查看随机测试用例或测试用例3,我可以轻松调试它。但是,这些测试用例的输入不可用。
以下是我的解决方案的代码,它不会因为对角线船只而失败,但偶尔也会错过命中。
def damaged_or_sunk(board, attacks):
# reverse board rows
board = board[::-1]
# function state variables
attack_count = 0
ship_lengths, hits = {}, []
# return values stored in dict
return_hash = {"sunk" : 0,
"damaged" : 0,
"not_touched" : 0,
"points" : 0}
# check board
for attack in attacks:
attack_count += 1
attack_index = (attack[0] - 1, attack[1] - 1)
for row in board:
for column in row:
if column != 0:
if attack_count == 1:
if column in ship_lengths:
ship_lengths[column] += 1
else:
ship_lengths[column] = 1
ship_index = (row.index(column), board.index(row))
if ship_index == attack_index:
hits.append(column)
if len(hits) >= len(attacks):
break
# catagorize hits
for ship in ship_lengths.keys():
if hits.count(ship) == ship_lengths[ship]:
return_hash["sunk"] += 1
elif ship not in hits:
return_hash["not_touched"] += 1
else:
return_hash["damaged"] += 1
# calculate points
for return_val in return_hash.keys():
if return_val == "sunk":
return_hash["points"] += return_hash["sunk"]
elif return_val == "damaged":
return_hash["points"] += (return_hash["damaged"] / 2)
elif return_val == "not_touched":
return_hash["points"] -= return_hash["not_touched"]
return return_hash
答案 0 :(得分:0)
首先,我喜欢这个问题! Code Wars Kata很有趣,特别是当你自己解决它们时;)
那就是说,你被困住了,我会帮助你;但是我没有在这里复制粘贴我的解决方案,而是告诉你我做了什么,让你按照自己的节奏学习。
让我们看一下其中一个测试用例 - 主游戏3 - 更详细一点。您提到测试用例的输入不可用,但添加了
print(board)
print(attacks)
到我们函数的顶部告诉我们需要知道的一切。这是游戏板:
0 0 1
0 0 1
0 2 0
0 2 0
以下是我们的攻击点:
[3, 4], [2, 1], [2, 2]
现在描述一下我为解决这个问题所做的工作(请不要觉得你必须这样做,不仅欢迎你接受我告诉你的事情,并继续处理问题而不阅读进一步)。
我做的第一件事是循环遍历行和列,并制作一个字典,其中包含每个定位的船只,它们的位置以及该单元格的命中/未命中状态(0表示“未点击”,1表示“点击”)。我看到这是你想用ship_lengths做的事情(或者至少我认为这是你想要做的事情),但是你通过分割数据使它变得更加复杂。通过建立一本字典,我可以把所有东西放在一个地方(船号,它的位置和它的点击率);这是我的字典使用这个例子的样子:
{'1': [[3, 3, 0], [3, 4, 0]], '2': [[2, 1, 0], [2, 2, 0]]}
在此之后,我遍历我的攻击列表并将其与我的字典中的每个元素进行比较,如果X值和Y值排成一行,我将第三个值从0更改为1(Hit!)。
当我完成循环遍历攻击列表时,我会通过我的字典返回并查找“点击”和“下沉”,如果船舶索引下的每个元素在第三个元素中都有1个它是一个接收器,否则只是命中(或者如果所有索引都为0则错过)。
-
Code Wars Kata真的很有趣 - 而且非常令人沮丧。有时,当你有一个错误,你甚至没有得到错误日志来帮助你!我的建议是,如果你在自己的代码中找不到问题 - 你已经把它弄得太复杂了。如果你卡住了,请写出问题的sudo代码,看看你是否可以采用不同的方法来解决它。
希望你能从我所做的事情中学到一些东西,祝你好运完成这项挑战!