5

今天我尝试在Esolangs.org上创建一个帐户,这是一个深奥的编程语言wiki。我之前为一些 wiki 做过贡献,并且我有一两个想要贡献的小页面编辑。

...也就是说,直到我看到用于创建新帐户的 CAPTCHA 验证难题。

Esolangs.org 的验证码拼图

对 CAPTCHA 使用晦涩的语言很可能是一个愚蠢的笑话。但是,我花了将近半个小时试图理解该语言,以便创建一个新帐户。

最终我放弃并使用了在线 Befunge 翻译器,它给了我答案52256370

我不明白的是为什么输出9332682811>\#+:#*9-#\_$.@52256370.

我看到一些评论表明这是从 base-10 到 base-9 的转换。但是,当我尝试通过9332682811使用在线基础转换器进行转换来验证时,我得到了26072072027.

4

1 回答 1

4

该程序将解析332682811为 little-endian base-9 整数并以 base-10 打印。

Befunge 解释二维网格(或圆环,取决于版本)上的指令,指令指针可以在二维中自由移动。这个程序是单行的,所以指令指针只向前和向后移动。

9332682811将这些数字单独推送到 Befunge 的值堆栈中,然后以下指令执行一个简单的循环。在循环的正常迭代中,情况如下所示:

Instructions              Meaning                                       Top stack values

9332682811>\#+:#*9-#\_$.@
          >               Set the instruction pointer to travel         a b
                          to the right.
           \              Swap the top 2 values on the stack.           b a
            #+            Nothing, since # means                        b a
                          skip the next instruction.
              :           Duplicate the top value on the stack.         b a a
                 9        Push 9.                                       b a a 9
                  -       Pop two values and push their difference.     b a (a-9)
                     _    Pop the top value and set the instruction     b a
                          pointer traveling right if the value is 0
                          or left otherwise.
                    \     Swap the top 2 values.                        a b
                 9        Push 9.                                       a b 9
                *         Pop two values and push their product.        a (b*9)
             +            Pop two values and push their sum.            (b*9 + a)
          >               Set the instruction pointer traveling
                          right again.

因此,除非迭代开始时堆栈上的第二个值是 9,否则迭代会弹出两个值ba推送b*9 + a.

如果第二个值为9,则循环终止并打印最高值:

Instructions              Meaning                                       Top stack values

9332682811>\#+:#*9-#\_$.@
                     _    Pop the top value and set the instruction     b a
                          pointer traveling right if the value is 0
                          or left otherwise.
                      $   Discard the top value.                        b
                       .  Pop and print the top value.
                        @

所以,总而言之,程序推送一堆数字并反复替换和a直到它达到 9,信号停止。这是一个基数为 9 的转换器。bb*9+a

如果您尝试使用另一个基本转换器来验证这一点,请确保您获得正确的字节顺序。332682811是小端的,所以你可能需要反转它。

于 2017-07-20T21:20:29.730 回答