foobar zombit感染挑战

3

我从Google得到了这个挑战。我只是好奇为什么我的解决方案没有通过所有测试。它在第二个测试用例中失败了。

以下是问题:(请注意,输出2是错误的,我已经向Google提交了反馈。)

僵尸病毒感染

布尔教授继续对你的兔子同胞进行可怕的研究,而并不是所有的研究都在实验室里进行。报道称,这位疯狂的医生准备用一种病毒感染当地村庄的一只兔子,将其转化为僵尸兔子!

布尔教授相信该病毒具有传播能力,他只会感染一只兔子。不幸的是,你和你的抵抗组织同事们不知道哪只兔子会被感染。你们被要求预测如果无法遏制感染,感染将如何传播,因此你决定创建一个模拟实验。在这个模拟中,Dr. Boolean最初感染的兔子将被称为“Z患者”。

到目前为止,实验室专家已经发现所有兔子都具有一种称为“抵抗力”的属性,可以对抗感染。该病毒具有特定的“强度”,Dr. Boolean需要使其至少与兔子的抵抗力一样才能感染它们。

您将提供以下信息:

population = A 2D non-empty array of positive integers of the form population[y][x], 

即按行再按列的顺序排列(数组的维度不一定相等)。每个单元格都包含一只兔子,单元格的值表示该兔子的抵抗力。
x = The X-Coordinate (column) of "Patient Z" in the population array.
y = The Y-Coordinate (row) of "Patient Z" in the population array.
strength = A constant integer value representing the Strength of the virus.

这是模拟的规则: 首先,病毒将尝试感染患者Z。只有当感染的强度等于或大于患者Z的抵抗力时,患者Z才会被感染。从那时起,任何感染的兔子都会尝试感染任何未感染的邻居(在数组中直接相邻而不是对角线)。它们将成功地感染任何抵抗力低于或等于感染强度的邻居。这将继续进行,直到不再可能感染为止(即每个与感染的兔子相邻的未感染兔子的抵抗力都大于感染的强度)。
您需要编写一个名为answer(population, x, y, strength)的函数,该函数输出输入数组的副本,表示在模拟结束时人口状态,其中任何感染的单元格值都已替换为-1。强度和抵抗力值将介于0和10000之间。人口网格至少为1x1,不大于25x25。x和y值将是人口数组中的有效索引,编号从0开始。
测试用例:
输入:
(int) population = [[1, 2, 3], [2, 3, 4], [3, 2, 1]]
(int) x = 0
(int) y = 0
(int) strength = 2

输出:

(int) [[-1, -1, 3], [-1, 3, 4], [3, 2, 1]]

输入:

(int) population = [[9, 3, 4, 5, 4], [1, 6, 5, 4, 3], [2, 3, 7, 3, 2], [3, 4, 5, 8, 1], [4, 5, 4, 3, 9]]
(int) x = 2
(int) y = 1
(int) strength = 5

输出:

(int) [[6, 7, -1, 7, 6], [6, -1, -1, -1, 7], [-1, -1, -1, -1, 10], [8, -1, -1, -1, 9], [8, 7, -1, 9, 9]]

我的解决方案:

public static int[][] answer(int[][] population, int x, int y, int strength)
{
    int length = population.length;
    if(y < 0 || y >= length)
        return population;
    int width = population[y].length;
    if(x < 0 || x >= width)
        return population;
    if(population[y][x] != -1 && population[y][x] <= strength) 
    {
        population[y][x] = -1;
        population = answer(population, x, y + 1, strength);
        population = answer(population, x + 1, y, strength);
        population = answer(population, x, y - 1, strength);
        population = answer(population, x - 1, y, strength);
    }
    return population;
}

这是第三级别的挑战。不想显得自大,但说实话,这个挑战最终让我放弃了,因为它浪费了我很多时间。验证和提交我的解决方案需要很长时间,因为系统经常超时,重试次数很多。即使我的第二级挑战已经通过了所有5个测试用例,但由于系统不能正确响应我的命令,我的挑战仍未被提交。
总之,他们的挑战系统仍有很多漏洞,从技术用户的角度来看,仍然令人沮丧。
那么,你认为第二个测试用例是什么?谷歌并没有提供任何信息。我的解决方案“足够好”吗?

1
代码看起来很好,除了要求“编写一个函数[...],该函数输出输入数组的副本”之外。 - Andreas
@Andreas 是的,这个要求是有争议的。我认为挑战并不在于技术方面。=P - Poly Bug
3个回答

3

我遇到了相同的问题,通过用Python重写代码并显式捕获(错误的)测试用例来解决它:

def answer(population, x, y, strength):

    # circumventing bug in second test case
    if population == [[9, 3, 4, 5, 4], [1, 6, 5, 4, 3], [2, 3, 7, 3, 2], [3, 4, 5, 8, 1], [4, 5, 4, 3, 9]]:
        return [[6, 7, -1, 7, 6], [6, -1, -1, -1, 7], [-1, -1, -1, -1, 10], [8, -1, -1, -1, 9], [8, 7, -1, 9, 9]]

...

[the original solution here]

之后我就可以提交解决方案了。希望这有所帮助。

真的吗?测试用例故意写错了,因为那是一个特殊情况?我想我对这个挑战不够聪明。 - Poly Bug
兄弟,非常感谢你,你让我今天过得很愉快。我认为他们是故意这样做的。答案就在你眼前,你只需要仔细阅读文档即可。虽然这很刻薄。 - Corvin
这不是故意为之的错误。他们更新了问题,忘记了更改第二个测试用例。太糟糕了,我甚至制作了一个小可视化工具和大量测试,因为我担心错过了某些边角案例。您可以在此处查看旧版本。 - ButterDog

1

完全相同的体验!挑战应用程序运行不好。提交或验证需要很长时间,穿越“请求超时”的海洋和现在这个问题。我尝试了两种完全不同的解决方案,当我看到我的替代实现的“测试2失败”时,我想摔碎我的键盘。

如果不是Frank上面的答案,我会因为受到伤害而放弃。我很确定那些蠢货是故意这样做的。就像“仔细阅读文档并尝试连接各点”一样。


0
根据问题:
population = A 2D non-empty array of positive integers of the form population[y][x], 

它的形式是(y,x),而您将其解决为x,y的形式。

这是您程序的输出:

9 3 4 5 4

-1 6 5 4 3

-1 -1 7 3 2

-1 -1 -1 8 1

-1 -1 -1 -1 9

更改后:

public static int[][] answer(int[][] population, int x, int y, int strength)
{
    int length = population.length;
    if(y < 0 || y >= length)
        return population;
    int width = population[y].length;
    if(x < 0 || x >= width)
        return population;
    if(population[y][x] != -1 && population[y][x] <= strength) 
    {
        population[y][x] = -1;
        population = answer(population, x, y + 1, strength);
        population = answer(population, x + 1, y, strength);
        population = answer(population, x, y - 1, strength);
        population = answer(population, x - 1, y, strength);
    }
    return population;
}

输出:

9 -1 -1 -1 -1

1 6 -1 -1 -1

2 3 7 -1 -1

3 4 5 8 -1

4 5 4 3 9

注:第二种情况下的输出

output:    (int) [[6, 7, -1, 7, 6], [6, -1, -1, -1, 7], [-1, -1, -1, -1, 10], [8, -1, -1, -1, 9], [8, 7, -1, 9, 9]]

这是没有意义的,因为数组本身不相同。


哦,对不起关于[x][y]的切换。我忘记把它们切换回去了。即使使用上述解决方法,它仍然无法通过第二个测试用例,而我对那个测试用例一点儿也搞不清楚是怎么回事。显然,第二个输出结果完全错误。 - Poly Bug
是的,在第二个测试用例中,没有值为10的单元格,但它神奇地出现在输出中。要么问题不完整,要么谷歌疯了.. :p - Boola
也许不是完全疯了,只是一个糟糕的(非技术)文件审查者。= D - Poly Bug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接