Условия if…else

в 23:29, , рубрики: Brainfuck, ненормальное программирование

image

Доброго времени суток Читатели!

Сегодня для меня великий день.
В вопросах я писал о краткой справке для новичков и профессионалов, думалось мне что я сейчас быстро окунусь в язык, сделаю всем добро и пойду дальше изучать свой Perl.
Но как всегда всё пошло не так...

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

Иногда запускал на компьютере BrainfuckIDE и экспериментировал. Эксперименты были достаточно плодотворные, и уже через 5-6 часов я изучил его досконально. Помнил все алгоритмы сложения, вычитания, перемещения, копирования, деления и умножения. Элементарные сложение, вычитание и перемещение я подсмотрел на каком то из сайтов, остальное додумал сам.

Потом посерфил поискал в интернете и увидел что на нём оказывается можно делать условия(то было для меня удивлением). Главный вопрос: Как?

Не став изучать и принтскрить алгоритм себе в мозг, сел с тетрадочкой в угол и начал думать.
Думал я до эффекта полной абстракции от мира сего. Ушло две тетрадки, в которых я пробовал кучу разных вариантов, перемещал, копировал, пытался как то сравнивать, расплывчатые идеи при их реализации на листке, к концу приводили к очередному хаосу в моей голове.

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

Лёг спать достаточно поздно(10 утра), не мог заснуть когда в моей голове вертелось такое.

Проснувшись ближе к вечеру, взял недописанную вторую тетрадь и начал писать, честно говоря, я сам не понимаю как к такому алгоритму я пришёл, но на листочке через 2 часа он казался рабочим. Сел за нэтбук, на стационарном в это время ставилась новая ось.
Начал переписывать с листочка, оказалось я не учёл очень много вопросов и подводных камней, но алгоритм всё ещё казался верным.
За компьютером его отладка заняла не больше часа, как вдруг, перед моими глазами программа очнулась, работая именно так, как я того хотел.
Ощущение непередаваемое, такое чувство что ты планету открыл. Первые мои слова были: "Б*ля Ну вот, наконец то!". Немного отладив, убрал кучу + и -, заменив их на циклы всё работало как в сказке.

Не сильно закидывайте помидорами и тухлыми яйцами, но я попробую рискнуть и привести код, который написал. Смотрите:

,[>+>+<<-]>>[<<+>>-]                   # Копируем введённое значение в 1 ячейку
+++++ +++++[<----->-]<---              # Уменьшаем её на ascii код числа с которым сравниваем
>>+>>+<<<<                             # Счётчики для циклов
[                                      # Цикл Если n != 5
    [-]+++++ +++++[>+++++<-]>+++.      # Выводим 5
    [-]<++++++++[>++++<-]>.            # Выводим пробел
    [-]<++++++++[>++++<-]>+.           # Выводим восклицательный знак
    [-]<++++++++++[>++++++<-]>+.       # Выводим знак равенства
    [-]<++++++++[>++++<-]>.<<.         # Выводим пробел и число n
>>>>>-<<-]                             # Обнуляем счётчики, что бы второй цикл не выполнился
>>[                                    # Цикл иначе, практически всё тоже самое
    [-]+++++ +++++[>+++++<-]>+++.
    [-]<++++++++[>++++<-]>.
    [-]<++++++++++[>++++++<-]>+.
    [-]<++++++++[>++++<-]>.<<<<.
>>>>>-]

Как видите, основная идея в том, что бы цикл выполнялся тогда и только тогда, когда остаток от разности чисел n и ascii кода числа с которым сравнивают != 0.

Думаю это будет достаточно наглядный пример для начинающих, а от Вас Уважаемые гуру и ниндзя этого языка, прошу совета и возможно критики.

Ещё интересуют вопросы:

  • Как остальные решили бы данный вопрос?
  • Правильно ли я выбрал алгоритм, или можно обойтись более простым?
  • Что здесь можно ещё оптимизировать, и можно ли вообще?

Автор: systemiv

Поделиться

* - обязательные к заполнению поля