Прочитав статью в начале года «Brainfuck и счастливые билеты» , я решил, что пора учиться Трах мозгов и напишите на нем что-нибудь интересное.
Мне не пришлось долго думать.
Я решил написать свою «ненормальную» реализацию Числа Фибоначчи , в котором пользователь вводит однозначное число, определяющее количество отображаемых элементов ряда Фибоначчи.
Сайт о Трах мозгов И Таблица символов ASCII
Ну, поехали!
Во-первых, вам нужно создать алгоритм.
И вот он:
Из алгоритма видно, что ячейка 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).
Скрытые, но открытые возможности программы.
Когда я в первый раз закончил писать программу, я обнаружил, что она выдает мне вовсе не ряд Фибоначчи, а немного другой, недалеко от мира программирования.
Пришлось снова взять в руки карандаш и пройти каждый шаг:
Эх, если бы я знал, что если бы я просчитал еще один шаг вперед, я бы нашел ошибку быстрее.
Таким образом, мне пришлось вычислить место ошибки, для чего пригодился следующий код между (15) и (16), который отображал содержимое L1 и L2 с помощью L7: >>>>[-]
++++++++[<<<<<<++++++>>>>>>-]<<<<<<.
>>>>>>++++++++[<<<<<<------>>>>>>-] ++++++++[<<<<<++++++>>>>>-]<<<<<.
>>>>>++++++++[<<<<<------>>>>>-] [-]+++++++++++++.
---.
[-]<<<<
Потом пришлось еще немного повозиться и в итоге оказалось, что R2(10) я просто не сбросил.
Получается, что удалив строку (10), вы получите ряд степеней двойки.
:)
Я заканчиваю статью.
Вот, в общем-то, и все.
Полный текст заявления в кратком виде: +>>++++++++++++++++++++++++++++++++>,>++++++++[<------>-]<[>[-]>[-]>[-]>[-]<<<<<<<[>>>>+>+>>+<<<<<<<-]>>>>>[<<<<<+>>>>>-]<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]<[<+>-]<<<<[-]>>>>>>[<<<<<<+>>>>>>-]<<<<<<<[-]>>>>[<<<<+>>>>>+<-]++++++++[>++++++<-]>.
<<<.
>-][-]+++++++++++++.
---.
Результат выполнения: 9
1 2 3 5 8 = E R g
Главное помнить, что в Brainfuck всё происходит относительно текущей ячейки и значения в каждой.
(: Домашнее задание для новичков: реализовать вывод N числа элементов ряда Фибоначчи, где N — двузначное число.
Теги: #brainfuck #фибоначчи #трахни мой мозг #Аномальное программирование
-
Ico 2.0 И Токенизация Бизнеса
19 Oct, 24 -
В Мире Есть Справедливость
19 Oct, 24