山峰_冰猎人_ice-hunter

发布于 2020年2月11日
(点击图片进入关卡)

不是所有牦牛都是一样的。不要惹恼那些大的老牦牛。

简介

击败名字中有 "bos" 的4只牦牛。

使用提供的 isSubstring(word,substring) 函数来检查一个牦牛的 id 是否有字符串 “bos” 。

默认代码

# 追捕4只牦牛。 只选择小的。
# 小牦牛名称包含一个"bos"子字符串。

# 这个函数检查一个单词是否包含一个子字符串。
def isSubstring(word, substring):
    # 我们通过迭代开始索引。
    rightEdge = len(word) - len(substring)
    # 循环访问单词的索引。
    for i in range(rightEdge + 1):
        # 对于它们中的每一个循环通过子字符串
        for j in range(len(substring)):
            # 为单词的索引使用偏移量。
            shiftedIndex = i + j
            # 如果字母不一样:
            if word[shiftedIndex] != substring[j]:
                # 检查Word中的下一个开始索引。
                break
            # 如果它是子字符串中的最后一个字母:
            if j == len(substring) - 1:
                # 然后子字符串在单词中。
                return True
    # 我们还没有找到这个词的子字符串。
    return False

# 循环通过所有敌人。
enemies = hero.findEnemies()
for e in range(len(enemies)):
    enemy = enemies[e]
    # 使用函数isSubstring来检查
    # 37/5000 如果敌方名称(id)包含“"bos":

        # 然后打败它。

概览

预定义的函数 isSubstring 是一个实现 naive (brute-force)的算法。 我们首先通过 word 中的 index ,但是我们不需要迭代所有的索引。 我们可以在 word.length - substring.length 的 index 处停下来,因为除此之外的任何因素都会阻止我们检查子字符串的每个字符。

def isSubstring(word, substring):
    rightEdge = len(word) - len(substring)
    for i in range(rightEdge + 1):
        ...
举个例子:
word = "Nachos"
sub = "hos"
We "shift" substring
Nachos
hos
    hos
        hos
            hos
正如我们可以看到,如果我们将'substring`移到任何位置,那么它会超出'word'。
接下来,对于每个单词的索引,我们通过 substring 中的索引进行循环,并将'substring 中的每个字母 与 word 中的字母进行比较。 我们用偏移位置“wordIndex + subIndex”来做到这一点。 如果任何一个字母 与一对不一致,那么我们从一个循环中分离出来,并转到 word`中的下一个索引。
for j in range(len(substring)):
    shiftedIndex = i + j
    if word[shiftedIndex] != substring[j]:
        break
如果我们迭代 substring 中的所有字母并且没有调用 break',那么它意味着我们已经找到'substring 。 为了确保我们处于最后一个索引处,我们可以比较'substring'的索引以确保它是 substring 中的最后一 个索引。
if j == len(substring) - 1:
    return True
如果所有循环都结束,并且我们没有找到'substring',则返回'false'。
你的任务是用参数调用函数并使用这个结果。 仔细阅读功能代码,因为它会对即将到来的关卡有所帮助。

冰猎人解法

# 追捕4只牦牛。 只选择小的。
# 小牦牛名称包含一个"bos"子字符串。

# 这个函数检查一个单词是否包含一个子字符串。
def isSubstring(word, substring):
    # 我们通过迭代开始索引。
    rightEdge = len(word) - len(substring)
    # 循环访问单词的索引。
    for i in range(rightEdge + 1):
        # 对于它们中的每一个循环通过子字符串
        for j in range(len(substring)):
            # 为单词的索引使用偏移量。
            shiftedIndex = i + j
            # 如果字母不一样:
            if word[shiftedIndex] != substring[j]:
                # 检查Word中的下一个开始索引。
                break
            # 如果它是子字符串中的最后一个字母:
            if j == len(substring) - 1:
                # 然后子字符串在单词中。
                return True
    # 我们还没有找到这个词的子字符串。
    return False

# 循环通过所有敌人。
enemies = hero.findEnemies()
for e in range(len(enemies)):
    enemy = enemies[e]
    # 使用函数isSubstring来检查
    # 37/5000 如果敌方名称(id)包含“"bos":
    enemyName = enemy.id
    while isSubstring(enemyName, spyLetter) and enemy.health >= 0:
        # 然后打败它。
        hero.attack(enemyName)