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