Я только что узнал об очень простом синтаксисе Brainfuck и попытался быстро бросить себе вызов, запрограммировав сценарий «Hello World». На данный момент у меня есть почти все буквы до "о" в приветствии. Насколько я знаю, код ASCII для o
— 111
. Вот мой код для получения этого числа и печати o: +++++[>>++<<-][-]>>+[<<+++++[>>>++<<<-]>>-]>+.
Разбивая его, я устанавливаю [2] равным 11, оперируя 2*5+1. Затем я добавляю 10 к [3] при каждом уменьшении [2], то есть 11 раз. Должно получиться 110, поэтому я добавляю единицу в конце перед печатью. Тем не менее, я продолжаю появляться с кодом ASCII 91 или Hell[
. Где я ошибся?
Заранее спасибо!
РЕДАКТИРОВАТЬ: я просто изменил его на 6+ в начале, и теперь он работает? Даже при том, что будет работать 13*10+1 = 131, а не 11? Хмммммм
Мозговое умножение
Ответы:
Я только что попытался запустить это в своем (самозапрограммированном) Brainfuck-интерпретаторе и получил 'o'
, как вы и ожидали. Так что, возможно, у вас проблемы с вашим переводчиком.
Другая возможная (и более вероятная!) причина вашей проблемы заключается в том, что ваши ячейки использовались ранее и все еще имеют значения, не равные нулю. Я предполагаю, что они использовались раньше, потому что вы показываете здесь только небольшую часть своего кода (вы уже напечатали 'hell'
(кстати, очень смешно, xD) и пропускаете cell[1]
).
Лично я разбил ASCII-таблицу на блоки по 16 символов. Поэтому, если я хочу получить определенный символ, я умножаю 16
на 3
(для цифр), 4
(для прописных букв) или 6
(для строчных букв). Однако для некоторых букв я умножаю 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)
Я знаю, что 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
Ваш код на самом деле работает так, как ожидалось, причина того, что он не работает, может заключаться в том, что код, который выполняется перед этой частью, устанавливает для ячеек другие начальные значения.
Это много кода, чтобы просто напечатать «о», вы могли бы напечатать его после первого цикла из ячейки № 2, второй цикл не нужен. Вот пример печати «Hello World» с помощью 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.
'o'
требуется много кода, но это херня: вам нужно много кода, чтобы делать простые вещи. Вы приводите ему пример Hello World!
-программы, хотя он явно пытался найти собственное решение. Тем не менее, некоторые упоминания по-прежнему хороши, например does actually nothing
(может быть, вы могли бы объяснить, почему [-]
ничего не делает в этом случае, но ладно). 16.11.2016