2016-11-12 74 views
2

我剛剛瞭解了Brainfuck的基本語法,並試圖通過編寫「Hello World」腳本來快速挑戰自己。此刻,我收到了每封信,直到你打開「o」。據我所知,o的ASCII碼是111。這裏是我的代碼來獲取該號碼,打印○:

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

打破下來,我通過操作2 * 5 + 1設置[2] 11。然後,我將[2]的每次遞減增加10到[3],這樣11次。這應該會導致110,所以我打印前添加一個。但是,我一直使用ASCII代碼91或Hell[。我哪裏做錯了?

在此先感謝!

編輯:我剛把它改成6 +的開頭,現在它的作品?即使這將運行13 * 10 + 1 = 131,而不是11?嗯mmmmmmmBrainf * ck乘法

回答

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 

您的代碼實際上是按預期工作,不工作的可能,這是這片之前執行的代碼,設置細胞對其它初始值的原因。

這是很多代碼來打印一個'o',你可能已經打印它在第二個單元格的第一個循環後,不需要第二個循環。 下面是與Brainf * CK打印爲例的「Hello World」:

+++++ +++++    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

+0

好的提到,雖然它不直接回答這個問題。你分析他的代碼,但你沒有說它有什麼問題(代碼實際上沒有錯,但你也沒有這麼說)。你說打印一個'o''的代碼很多,但是這很讓人頭疼:你需要很多代碼來完成簡單的事情。你給他一個'Hello World!'程序的例子,儘管他顯然試圖找到一個自己的解決方案。然而,有些提到仍然像'實際上沒有什麼'一樣好(也許你可以解釋爲什麼*'[ - ]'在這種情況下什麼都不做,但確定)。 – Aemyl

1

我只是試圖在運行此我(自編)Brainfuck口譯員,我得到了'o',就像你期望的那樣。所以也許你的口譯員有問題。

您的問題的另一個可能的(也是更可能的原因)是,您的單元格之前已經使用過,並且其值仍然不等於零。我想他們之前已經使用過了,因爲你只在這裏顯示你的代碼的一小部分(你已經打印了'hell'(在xD的方式中很有趣),你跳過了cell[1])。

我親自將ASCII-table分成16個字符的塊。所以如果我想得到一個特定的字符,我可以163(用於數字),4(用於大寫字母)或6(用於小寫字母)。不過,對於某些字母,如果它「更快」(較短的代碼),我可以用57來代替16。例如'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)