Brainf * ck乘法

时间:2016-11-12 18:58:18

标签: ascii brainfuck

我刚刚了解了Brainfuck的基本语法,并试图通过编写“Hello World”脚本来快速挑战自己。此刻,我几乎收到了所有的信件,直到打招呼“o”。据我所知,o的ASCII代码是111。这是我的代码来获取该数字并打印o:

+++++[>>++<<-][-]>>+[<<+++++[>>>++<<<-]>>-]>+.

打破它,我通过操作2 * 5 + 1将[2]设置为11。然后,我每增加[2]减少10到[3],所以11次。这应该是110,所以我在打印前添加一个。但是,我一直在使用ASCII码91或Hell[。我哪里出错了?

提前谢谢!

编辑:我刚开始将它改为6 +,现在它有效吗?即使那将是13 * 10 + 1 = 131,而不是11? Hmmmmmmm

2 个答案:

答案 0 :(得分:1)

我知道Brainf * ck并不关心缩进和事情。但是你应该考虑缩进代码,因为这样可以更容易阅读。

让我们看看您的代码:

+++++                  intialize counter (cell #0) to 5
[                      use loop to set cell #2 to 10
    >>++                   add 2 to cell #2
    <<-                
]
[-]                    does actually nothing
>>+                    add 1 to cell #2
[                      use outside with cell #2 as counter
    <<+++++            sets cell #0 to 5
    [                  use inner loop to add 10 to cell #3
        >>>++
        <<<-
    ]
    >>-
]
>+.                    add 1 to cell #3 and print result

您的代码实际上按预期工作,不工作的原因可能是,在此部分之前执行的代码将单元格设置为其他初始值。

很多代码只需要打印一个&#39; o,你可以在第二个单元格的第一个循环之后打印它,不需要第二个循环。 这是打印&#34; Hello World&#34;的一个例子。与Brainf * ck:

+++++ +++++             initialize counter (cell #0) to 10
[                       use loop to set 70/100/30/10
    > +++++ ++              add  7 to cell #1
    > +++++ +++++           add 10 to cell #2
    > +++                   add  3 to cell #3
    > +                     add  1 to cell #4
<<<< -                  decrement counter (cell #0)
]
> ++ .                  print 'H'
> + .                   print 'e'
+++++ ++ .              print 'l'
.                       print 'l'
+++ .                   print 'o'
> ++ .                  print ' '
<< +++++ +++++ +++++ .  print 'W'
> .                     print 'o'
+++ .                   print 'r'
----- - .               print 'l'
----- --- .             print 'd'
> + .                   print '!'
> .                     print '\n'

以下网站可以通过测试您的Brainf * ck代码来帮助您: Brainfck Visualizer

答案 1 :(得分:1)

我只是试着在我的(自编程的)Brainfuck解释器中运行它,我得到了'o',就像你期望的那样。所以也许你的翻译有问题。

您的问题的另一个可能(更有可能!)的原因是,您的单元格之前已被使用过,并且仍然具有不等于零的值。我猜它们之前已被使用过,因为你只在这里显示了一小部分代码(你已经打印过'hell'(非常有趣的方式是xD),你跳过cell[1])。

我个人将ASCII表分成16个字符的块。因此,如果我想得到一个特定的字符,我多16 3(对于数字),4(对于大写字母)或6(对于小写字母)。但是对于某些字母,如果{&#34}更快&#34;我1657。 (较短的代码)。 'o'例如,我会这样:

++++                write 4 in cell(0)
[                   while cell(0) != 0
    >++++           write 4 in cell(1)
    [               while cell(1) != 0
        >+++++++    add 7 to cell(2)
        <-          decrement cell(1)
    ]               go back to 'while cell(1) != 0'
    <-              decrement cell(0)
]                   go back to 'while cell(0) != 0'
>>                  go to cell(2) (has value 4*4*7 = 0x70 or 'p')
-                   decrement cell(2) (it's an 'o' now)
.                   print cell(2)