代码大战战舰损坏或沉没 - 蟒蛇

时间:2018-06-13 19:16:41

标签: python recursion

我不确定是什么导致我对以下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

1 个答案:

答案 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代码,看看你是否可以采用不同的方法来解决它。

希望你能从我所做的事情中学到一些东西,祝你好运完成这项挑战!