Pertanyaan Halo Dunia! di Brainfuck


Potongan kode berikut ini berasal dari Wikipedia, dan merupakan pengantar untuk apa yang tampaknya menjadi standar Hello World! program di Brainfuck ...

1. +++++ +++++             initialize counter (cell #0) to 10
2. [                       use loop to set the next four cells to 70/100/30/10
3.    > +++++ ++              add  7 to cell #1
4.    > +++++ +++++           add 10 to cell #2 
5.    > +++                   add  3 to cell #3
6.    > +                     add  1 to cell #4
7.    <<<< -                  decrement counter (cell #0)
8. ]

Saya memahami inti dari apa yang terjadi di sini, tetapi yang tidak saya pahami adalah mekanisme dari apa yang terjadi pada baris 3 hingga 6. Jika +++++ +++++ tambahkan 10 ke nilai dalam a[0], mengapa menambah pointer oleh satu dan mengeksekusi ++*ptr tujuh kali menghasilkan a[1] menyamai 70? Tidak seharusnya a[1] = 7? Sepertinya a[1] melalui a[4] secara ajaib ditingkatkan dengan faktor sepuluh, dan saya tidak mengerti mengapa.


5
2018-01-08 19:10


asal


Jawaban:


Itu [] karakter menunjukkan satu lingkaran. 10 +s sebelum menunjukkan berapa kali loop akan berjalan. Ini menjadi jelas ketika Anda memahami apa yang beragam perintah rata-rata, dan <<<< - urutan perintah.

Setiap kali loop berjalan, ia menjalankan langkah-langkah berikut:

> move the pointer 1 space to the right
+++++ ++ add 7 to the current pointer
etc 3 more times > > >
<<<< - move back to the counter and decrement

Ini memiliki efek menambahkan "7, 10, 3, 1" 10 kali. Untuk menyatakannya dengan cara lain, jika Anda menulis nilai di 5 lokasi penunjuk pertama saat Anda menjalankan pengulangan seperti berada dalam larik:

[10, 0, 0, 0, 0]     at first
[9, 7, 10, 3, 1]     after first run
[8, 14, 20, 6, 2]    after second
...
[0, 70, 100, 30, 10] up to this, the loop ends since the counter is 0,
                     and control continues

2
2018-01-08 19:22



Ada visualisator brainfuck yang bagus di situs ini: http://fatiherikli.github.io/brainfuck-visualizer/  itu membuat bahasa brainfuck lebih mudah dimengerti


2
2018-05-05 20:45



Itu ++++++++++ membuat sel0 sama dengan 10. Kemudian, [ memulai satu lingkaran. Dalam pengulangan, setiap iterasi menambahkan nomor yang ditetapkan ke sel lainnya. Misalnya, ia menambahkan 7 ke sel satu setiap kali. Baris terakhir dari loop, <<<< - menempatkan pointer kembali ke sel0 dan menurunkannya. Dengan cara ini, setiap iterasi membuat penghitungan sel0 turun. Ketika mencapai 0, loop berhenti dan program terus berjalan. Oleh karena itu, ia menambahkan 7 ke sel1 sepuluh kali, dan loop ini membuat sel1 = 10 * 7.


0
2017-12-26 16:55