今天,我尝试在Esolangs.org Wiki esoteric programming languages上建立帐户。我之前曾为一些Wiki作过贡献,并且我想贡献一两个小的页面编辑。

...也就是说,直到我看到用来创建新帐户的验证码谜题为止。

befunge - 为什么Befunge代码9332682811>\#+ :#*9-#\_$. @输出52256370?-LMLPHP

对于CAPTCHA使用晦涩的语言很可能是在开玩笑。但是,我花了将近半小时来尝试理解该语言,因此我可以创建一个新帐户。

最终,我放弃并使用了online Befunge interpreter,它给了我答案52256370

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

我看到一些评论表明这是从10到9的转换。但是,当我尝试通过用online base converter转换9332682811进行验证时,得到了26072072027的结果。

最佳答案

该程序将332682811解析为一个低位序的base-9整数,并以base-10打印。

Befunge使用可在二维空间自由移动的指令指针来解释2D网格(或圆环,具体取决于版本)上的指令。该程序是单行程序,因此指令指针只能向前和向后移动。
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反复替换bb*9+a,直到达到9,即停止信号。这是基数为9的转换器。

如果您尝试使用another base converter进行验证,请确保正确设置了字节序。 332682811是Little-endian,因此您可能需要将其反转。

关于befunge - 为什么Befunge代码9332682811>\#+ :#*9-#\_$. @输出52256370?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45223117/

10-12 23:58