Brainfuck и счастливые билеты


Часто ли Вы ездите в автобусе? Проверяете, счастливый ли билет — по сумме первых и последних трёх цифр? А ведь можно сделать для этого программу, заставить совершать математические операции нашего электронного друга. Слишком просто? Давайте сделаем это на языке Brainfuck.

Как Вы уже наверное слышали (а если не слышали — почитайте Википедию), Brainfuck — это эзотерический язык программирования, имеющий лишь 8 операторов. Простые операции на этом языке неочевидны, но если Вы сумеете их реализовать — это разовьёт (надеюсь) Вашу логику и обогатит знания о работе компьютера.

Вернёмся к нашей задаче. Первая проблема появляется при вводе данных — надо ввести цифры номера билета, но введётся строка, а мы получим лишь коды символов. Благо коды всех цифр идут сподряд, надо просто вычесть из кодов символов 48, то есть написать сначала запятую (ввод), а потом 48 знаков минус.

В Brainfuck данные хранить сложно, поэтому лучше посчитать сумму троек цифр (всего цифр шесть) сразу после их ввода. Сделаем это циклом. Цикл продолжается, пока текущая ячейка не равна нулю, поэтому данные будут уничтожены (на самом деле это можно обойти), но они всё равно нам больше не понадобятся. Вот код ввода и расчёта суммы цифр первой тройки:

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


В нём мы не забыли после ввода каждой цифры уходить на ячейку вправо перед вводом новой.

Теперь сдвинемся ещё на две ячейки вправо, чтобы не затереть первую сумму, и посчитаем вторую:

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


Теперь самое сложное — сравнить две суммы:

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


Откуда так много плюсов в коде? На самом деле это сравнение кроме всего прочего выводит ещё и слова «Yes» или «No». Коды их символов идут сподряд, значит можно просто прибавлять плюсами. Для порядка, в конце можно вывести перевод строки — символы с кодами 13 и 10.

[-]+++++++++++++.---.


Что же означает конструкция [-], так часто появляющаяся в коде? Как несложно догадаться, она обнуляет текущую ячейку.

Вот и всё — написание этой программы не заняло много времени. При написании таких программ полезно разделить код на блоки, чтобы хотя бы что-то можно было понять.

Теперь Вы можете удивить своих друзей или преподавателей. А вот и полный код программы:

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


P. S.: попробуйте выполнить код с картинки. Что же скажет Ваш интерпретатор?


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

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