2016-11-12 3 views
2

Я только что узнал о самом базовом синтаксисе Brainfuck и пытался быстро бросить вызов себе, написав сценарий Hello World. На данный момент у меня есть буквально каждое письмо до получения приветствия «o». Как я знаю, код ASCII для o - 111. Вот мой код, чтобы получить это число и напечатать O:

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

разбив его, я устанавливаю [2] до 11 работает 2 * 5 + 1. Затем я добавляю от 10 до [3] каждый декремент [2], поэтому 11 раз. Это должно привести к 110, поэтому я должен добавить один в конец перед печатью. Тем не менее, я продолжаю работать с кодом ASCII 91 или Hell[. Где я неправ?

Заранее спасибо!

EDIT: Я только что изменил его на 6 + в начале и теперь он работает? Хотя это будет работать 13 * 10 + 1 = 131, а не 11? HmmmmmmmBrainf * 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», вы могли бы печатать его после первого цикла из ячейки №2, не нуждаясь во втором цикле. Вот пример для печати «Hello World» с Brainf * ск:

+++++ +++++    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 код * ск: Brainfck Visualizer

+0

хорошо упоминает, хотя и не прямо ответить на вопрос. Вы анализируете его код, но не говорите, что с ним не так (код действительно не ошибается, но вы также этого не говорите). Вы говорите, что очень много кода для печати '' o'', ​​но это мозговой урок: вам нужно много кода, чтобы делать простые вещи. Вы даете ему пример «Hello World!» -программы, хотя он, очевидно, пытался найти собственное решение. Тем не менее, некоторые упоминания по-прежнему хороши, как «фактически ничего» (возможно, вы могли бы объяснить * почему * '[-]' ничего не делает в этом случае, но ОК). – Aemyl

1

Я просто попытался запустить это в моем (самопрограммированный) Brainfuck-interpreter, и я получил 'o', как и ожидалось. Возможно, у вас проблемы с вашим переводчиком.

Еще одна возможная (и более вероятно!) Причина вашей проблемы в том, что ваши ячейки были использованы до этого и все еще имеют в ней значения, равные нулю. Я предполагаю, что они использовались раньше, потому что здесь вы видите только небольшую часть своего кода (вы уже напечатали 'hell' (очень смешно, кстати, xD), и вы пропускаете cell[1]).

Я лично разделил таблицу ASCII в блоках по 16 символов. Поэтому, если я хочу получить конкретный символ, я muliply 16 с 3 (для цифр), 4 (для прописных букв) или 6 (для строчных букв). Однако для некоторых букв я muliply 16 с 5 или 7, если это «быстрее» (более короткий код). '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)