Python错误 - Google Foobar

15

如果你曾经尝试过 Google 的 Foobar 挑战,你是否遇到过这样的错误?

Verifying solution...
{
"bytes" : "CAAaIgogQ291bGQgbm90IGZpbmQgJ2Fuc3dlcicgZnVuY3Rpb24"
}
我已在Visual Studio中测试了我的解决方案,它正常工作并提供准确的输出。 我只剩下36小时提交我的解决方案,这是最后的挑战,所以我真的希望能得到完成的信用。 这是我试图验证的代码:

我已在 Visual Studio 中测试了我的解决方案,它运行良好且输出准确。 我只有 36 小时来提交我的解决方案,并且这是最终挑战,因此我真的很想获得完成它的学分。 这是我正在尝试验证的代码:

from fractions import *
from math import factorial as fac

def cycle_index(n):
    return [(coeff(term), term) for term in foo(n, n)]

def foo(n, lim):
    soln_set = []
    if n > 0:
        for x in range(lim, 0, -1):
            if x == 1:
                soln_set.append([(1, n)])
            else:
                for y in range(int(n / x), 0, -1):
                    recurse = foo(n - x * y, x - 1)
                    if len(recurse) == 0:
                        soln_set.append([(x, y)])
                    for soln in recurse:
                        soln_set.append([(x, y)] + soln)
    return soln_set

def coeff(term):
    val = 1
    for x, y in term:
        val *= fac(y) * x ** y
    return Fraction(1, val)

def cross(cycle_a, cycle_b):
    term = []
    for len_a, freq_a in cycle_a:
        for len_b, freq_b in cycle_b:
            lcm = len_a * len_b / gcd(len_a, len_b)
            term.append((lcm, int(len_a * freq_a * len_b * freq_b / lcm)))
    return term

def answer(w, h, s):
    total = 0
    cycidx_cols = cycle_index(w)
    cycidx_rows = cycle_index(h)
    for col_coeff, col_cycle in cycidx_cols:
        for row_coeff, row_cycle in cycidx_rows:
            coeff = col_coeff * row_coeff
            cycle = cross(col_cycle, row_cycle)
            value = 1
            for _, power in cycle:
                value *= s ** power
            total += coeff * value
    return total

上周我找到了别人的解决方案,并通过 Foobar 进行验证,但我想自己编写代码以获得更深入的理解。我已将结果进行了逐一比较,它们完全相同,因此我知道我的代码能够给出准确的结果。

出于好奇心,我刚刚又尝试验证了另一个人的解决方案,但现在我得到了一个稍微不同的输出错误,尽管上周它在我尝试时运行良好。

Verifying solution...
{
"bytes" : "CAEQARABEAEQARABEAEQARABEAEQAQ"
}

我不确定还能去哪儿。我曾经为自己解决这个挑战感到非常兴奋,但现在我开始惊慌失措,担心它不重要。有什么建议吗?

更新-2018年6月29日,晚上6:00 CST
昨晚对我来说已经过期了,我没能及时提交我的代码。我确保在时间用完之前使用了recruitme命令,以防我被踢出。然而,我仍然能够查看我的当前状态,并让我请求另一个Level 5挑战。因此,我将定期检查是否重新出现测试用例,并在出现时更新此内容。强烈建议低水平的任何人等待我确认此问题已解决后再尝试请求另一个挑战。

更新-2018年6月30日,早上5:00 CST
根据@RobertAnsel发现的模式,我已经完成了挑战。我通过将answer函数硬编码为输出指令中给出的测试用例的解决方案来确认此模式。由此产生的错误与预测的输出完全匹配。我还在Google的支持论坛上发现了一个有趣的线程(链接在此),其中发生了类似的事情,一些Foobar挑战者。看起来他们的错误在大约三天后被Google修复了,但不幸的是,许多超时的人没有再次获得机会。尽管如此,这个问题可能会在接下来的一两天内解决。我将继续尝试验证和提交我的解决方案,直到成功为止。

更新-2018年7月4日,午夜12:00 CST 这个问题似乎已经得到了更多或更少的解决。有关详细信息,请参阅所选答案。感谢@RobertAnsel提供的所有帮助!其他一些信息:我能够验证当前的挑战,但在提交后,告诉我我的问题时间已过期。重新登录后,我可以请求新的挑战。我注意到我也能再次使用recruitme命令。我不确定这是否意味着他们没有收到第一个请求,或者您可以多次使用该命令。无论如何,我很欣慰我能够继续进行Foobar。祝你们好运!


1
看起来很有可能是他们那边的问题。是啊,希望我们今天或明天能再试一次,一切都会没事的。 - Kody Puebla
好的,我只剩下三个小时来完成这个任务了,希望这不会让我被淘汰。 - Calvin Ellington
1
很令人沮丧。奇怪的是,我在第三关的一个问题上超时了,但被给予了继续的机会,如果这个问题没有解决,也许你也会有类似的经历。 - Kody Puebla
3
根据我所了解的情况,这似乎是base64编码,并带有一个前导的两个字节块,其余的每个两个字节块代表一个特定的测试用例。当该块的最后一位为1时 => 通过,为0时 => 失败。如果我没错的话,你的(以及所有拥有相同字符串的人)表示所有测试都通过了。主要是通过对这里不同人的错误进行试验(base64 -> 二进制,2字节块)得出的结论:https://cryptii.com/base64-to-binary 祝你们好运! - Robert Ansel
2
@RobertAnsel 感谢您的解释和链接,Robert!你太棒了 :) - Henry Hsu
显示剩余18条评论
2个回答

11

可能这不是你要找的答案,但第一个“bytes”字符串是以下错误信息的base64编码:

“无法找到‘answer’函数”。

我自己做过Foobar挑战,只有当你尝试验证一个缺少定义的“answer”函数的文件时才会出现这种情况,显然你没有这样做。你确定他们提供的规范是有3个参数而不是一个有3个项的数组吗?

第二个消息(CAEQARABEAEQARABEAEQARABEAEQAQ),虽然是有效的base64,但不映射为ASCII或UTF-8。通过分析其他人发布的一些字符串,我得出结论,这是测试输出的base64编码版本。它不是很易读,但我认为它是11个2字节块,其中第一个没有帮助,但是接下来的10个是对应测试用例的测试结果。在这条消息的情况下,将其转换为二进制形式:

0000100000000001 <- unknown pre-pended info
0001000000000001 <- passing test 1
0001000000000001 <- passing test 2
0001000000000001 <- passing test 3
0001000000000001 <- passing test 4
0001000000000001 <- passing test 5
0001000000000001 <- passing test 6
0001000000000001 <- passing test 7
0001000000000001 <- passing test 8
0001000000000001 <- passing test 9
0001000000000001 <- passing test 10

每行末尾的 '1' 表示所有 10 个测试用例都通过了。

以下字符串表示一个失败的测试用例:

0001000000000000 <- failing test case

这应该能帮助您(和其他人)继续测试以实现完全通过的测试(您可以使用此类工具完成自己的分析: https://cryptii.com/base64-to-binary),但不幸的是,除非Google在其端解决了问题,否则这将无法帮助您向前推进并提交最终版本。

更新:7月2日晚上8点PDT 联系了几位Google招聘人员后,他们确认发现了该问题,并相信今天已经解决。 如果您在对代码进行更改后重新保存它(空格应该没问题),您应该能够正确地测试和提交。或者,您现在可能能够请求一个新的挑战。


1
指令中写道:“编写一个函数answer(w, h, s),它接受3个整数并返回...”,所以我确定有三个参数。我能理解第一次收到该消息的原因,因为我暂时重命名了该函数。我可能忘记切换回来了。但现在绝对不是这种情况,我现在只看到第二个错误消息。很遗憾,它没有转化为任何有用的东西。 - Kody Puebla
谢谢你的base64提示!我能够使用它来提取所有隐藏的测试用例到第一个3级挑战。然而,当我尝试verifysubmit我的解决方案(我现在相当确定其正确性),我得到了同样神秘的错误,似乎没有任何效果。 - Sam Estep
@SamEstep,我希望确认一下他们正在使用的编码方案的理论。你提到的错误是指你在测试用例#8失败后出现的“after all”吗?(根据您的CAEQARABEAEQARABEAEQARAAEAEQAQ输出) - Robert Ansel
@RobertAnsel,前提是第一个测试用例的编号为#1。 - Sam Estep
@KodyPuebla,如果你的意思是我还不能提交,那么是的,我还不能提交。 - Sam Estep
我昨天成功提交了我的解决方案。 - JimInCO

4

你无法解决这个问题,因为这是谷歌网站上的问题,我已经发现谷歌 Foobar API 返回了这个消息。

但你可以使用 feedback 命令,向谷歌 Foobar 提供反馈并标记为错误。这样更有可能引起他们的注意并帮助他们解决这个问题!


你是如何发现这些错误消息与Foobar API的故障有关的呢?我的意思是,我希望是API的问题,而不是我在算法中忘记解决的问题。你能够将“CAEQARABEAEQARABEAEQARABEAEQAQ”字符串解码成错误消息吗? - Henry Hsu
我无法解码消息“CAEQARABEAEQARABEAEQARABEAEQAQ”。但我已经查看了API的响应并在源代码中进行了一些搜索。 API的响应始终会给出一个分数,在我的情况下始终为“0”,而且无论您发送工作或错误的解决方案,这都不会改变。我有一个朋友也在Google Foobar中,如果所有测试都通过,它应该会响应测试用例,但我们得到的是这个编码消息。 - shawnfunke
谢谢你的澄清,Shawn!现在我只希望他们能修复它,哈哈。 - Henry Hsu

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