Калькулятор на Brainfack'е

image
У всех иногда случаются моменты, когда просто нечем заняться либо просто хочется размять мозги, и попытать свою смекалку, и тут на помощь к нам приходит BrainFuck.
Этот хоть и кажется очень странным и сложным, но на самом деле этот язык очень прост, сложность в нем заключается в том, что приходиться писать простейшие операции, такие как умножение, сравнение, и так далее…
Если вы вообще не знакомы с языком то читаем википедию.
Так же нам потребуется то что может выполнять исходный код. Берем от сюда http://4mhz.de/bfdev.html
В BrainFuck всего 8 операторов, тем не менее, на этом языке можно реализовать практически все, если хорошенько поломать голову над тем как это можно осуществить.

Вот написал на этом языке небольшой пример:
,>++++++[<-------->-]
,>++++++[<-------->-]
,>++++++[<-------->-]
<<[>>+>>+<<<<-]
>[>+>>-<<<-]
<<[>>+<<-]>>
[>]>
>>>++++++[<<<++++++++>>>-]<<<.


Данная программа работает как калькулятор (правда выполняет всего два действия), программа сделана таким образом, что если первый символ будет «0» то программа выведет результат сложения, если ввести какое либо другое число, то выведет разность чисел. Например, введем 163, «1» – значит, выполняем разность, то есть 6-3.

Теперь разберем программу, для примера введем «163»:

,>++++++[<-------->-]
,>++++++[<-------->-]
,>++++++[<-------->-]

Состояние памяти, после выполнения этого куска (скрин из BrainFuck Developer):
image

Данный код запрашивает у пользователя 3 символа, после чего отнимает у них 48, 48 потому что код символа «0» равен 48, код символа «1» равен 49, и т.д.

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

Состояние памяти, после выполнения этого куска:
image

Перемешаемся на ячейку со второй цифрой и создаем ее «копии» в четвертой и в шестой ячейке.

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

Состояние памяти, после выполнения этого куска:
image

Перемещаемся в третью ячейку, в цикле перемещаемся в четвертую ячейку и прибавляем к тому что у нас в третьей ячейке, потом перемещаемся в шестую ячейку и прибавляем то что у нас в третьей ячейке.

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

Состояние памяти, после выполнения этого куска:
image

Просто переносим то что в первой ячейке в третью ячейку.

Состояние памяти, после выполнения этого куска:
[>]>

image

Вот как раз тут и происходит что то подобие if then, в цикле мы ищем пустую ячейку после этого переходим на следующую ячейку, мы вводили «1», то есть он должен перейти в пятую ячейку, если бы мы ввели ноль то мы оказались в третьей ячейке.

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

Состояние памяти, после выполнения этого куска:
image

Тут просто приводим к нормальному виду и выводим на экран.

P.S. если ввести числа сумма которых больше 9 то мы нормального результата не увидим, поэтому смотрим на память


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.