Числа Фибоначчи На Brainfuck

Прочитав статью в начале года «Brainfuck и счастливые билеты» , я решил, что пора учиться Трах мозгов и напишите на нем что-нибудь интересное.

Мне не пришлось долго думать.

Я решил написать свою «ненормальную» реализацию Числа Фибоначчи , в котором пользователь вводит однозначное число, определяющее количество отображаемых элементов ряда Фибоначчи.

Сайт о Трах мозгов И Таблица символов ASCII



Ну, поехали!

Во-первых, вам нужно создать алгоритм.

И вот он:

Числа Фибоначчи на Brainfuck

Из алгоритма видно, что ячейка 1 (верхняя строка — номера ячеек) в конце каждого шага цикла содержит последнее вычисленное значение, а ячейка 2 — предпоследнее.

Итак, давайте по порядку.

Давайте сначала определимся с ячейками, что и где будет располагаться.

Напишу подробно, чтобы в комментариях не было жалоб на множество непонятных моментов в тексте статьи.

И сразу оговорюсь, что в ряду Фибоначчи первые две позиции будут опущены и он начнется сразу с третьей (0, 1, 1 , 2, 3, 5, .

).

Ячейка 1: значение 1 Ячейка 2: значение 0 Ячейка 3: значение 32 (пробел).

Ячейка 4: номер для ввода.

Ячейки с 5 по 8: вспомогательные.

Ячейка 6 будет содержать общее значение.

В дальнейшем все ячейки будут называться Ях, где x — порядковый номер ячейки.

Я сразу дам вам весь код, а потом детально его разберу.

Для удобства понимания (и написания) кода каждый значимый кусок писался на отдельной строке.



+ (1) > >++++++++++ ++++++++++ ++++++++++ ++ >, >++++++++[<------>-] (2) <[ (3) >[-]>[-]>[-]>[-] (4) <<<<<<<[>>>>+>+>>+<<<<<<<-] (5) >>>>>[<<<<<+>>>>>-] (6) <<<<[>>>>+>+<<<<<-] (7) >>>>>[<<<<<+>>>>>-] (8) <[<+>-] (9) <<<<[-] (10) >>>>>>[<<<<<<+>>>>>>-] (11) <<<<<<<[-] (12) >>>>[<<<<+>>>>>+<-] (13) ++++++++[>++++++<-]>.

(14) <<<.

(15) >-] (16) +++++++++++++.

---.

(17)



Приступим к анализу кода.

(1) - здесь все элементарно.

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

(2) – получаем из нее необходимое для расчетов число путем вычитания 48. (3) — начало цикла вывода чисел.

(4) - Сбрасываю R5-R8. В принципе достаточно сбросить только R6. (5) – копирование данных из L1 в L5, L6 и L8. В этом случае L1 становится пустым.

(6) — Перемещаю данные с L6 на L1. Таким образом, в L1, L5 и L6 реализовано копирование данных из L1 в L5, т.е.

мы берем две пустые ячейки (конечную и вспомогательную) и переносим в них данные из исходной в эти ячейки, а затем из вспомогательной в исходную.

В R5 пишу для расчета следующего значения ряда Фибоначчи.

В Y8 сохраняется текущее предпоследнее значение ряда.

(7, 8) - аналогично (5, 6) копирую данные из L2 в L6, используя L7 как вспомогательный.

(9) — Перемещаю данные с L6 на L5, суммируя.

Значение следующего числа Фибоначчи рассчитано.

(10, 11) — Сбрасываю R2 и перемещаю данные с R8 на R2. (12, 13) — Сбрасываю R1 и перемещаю данные с R5 на R1 и R6. Таким образом, в L1 у нас записано последнее расчетное значение, а в L2 — предпоследнее.

(14) — увеличиваю значение R6 на 48 и вывожу значение на экран.

(15)- Печатаю пробел.

(16) – уменьшение счетчика, конец цикла.

(17) - переход на новую строку, сдвиг каретки (контакты 13, 10).



Скрытые, но открытые возможности программы.

Когда я в первый раз закончил писать программу, я обнаружил, что она выдает мне вовсе не ряд Фибоначчи, а немного другой, недалеко от мира программирования.

Пришлось снова взять в руки карандаш и пройти каждый шаг:

Числа Фибоначчи на Brainfuck

Эх, если бы я знал, что если бы я просчитал еще один шаг вперед, я бы нашел ошибку быстрее.

Таким образом, мне пришлось вычислить место ошибки, для чего пригодился следующий код между (15) и (16), который отображал содержимое L1 и L2 с помощью L7:

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

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

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

---.

[-]<<<<

Потом пришлось еще немного повозиться и в итоге оказалось, что R2(10) я просто не сбросил.

Получается, что удалив строку (10), вы получите ряд степеней двойки.

:)

Я заканчиваю статью.

Вот, в общем-то, и все.

Полный текст заявления в кратком виде:

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

<<<.

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

---.



Результат выполнения:

9 1 2 3 5 8 = E R g

Главное помнить, что в Brainfuck всё происходит относительно текущей ячейки и значения в каждой.

(: Домашнее задание для новичков: реализовать вывод N числа элементов ряда Фибоначчи, где N — двузначное число.

Теги: #brainfuck #фибоначчи #трахни мой мозг #Аномальное программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.