Доброго времени суток Читатели!
Сегодня для меня великий день.
В вопросах я писал о краткой справке для новичков и профессионалов, думалось мне что я сейчас быстро окунусь в язык, сделаю всем добро и пойду дальше изучать свой Perl.
Но как всегда всё пошло не так...
Взявшись за изучение, у меня был небольшой блокнотик, стул на кухне и распечатанная табличка ASCII кодов. Каждый новый шаг был для меня, как новый рекорд, новая высота.
Иногда запускал на компьютере BrainfuckIDE и экспериментировал. Эксперименты были достаточно плодотворные, и уже через 5-6 часов я изучил его досконально. Помнил все алгоритмы сложения, вычитания, перемещения, копирования, деления и умножения. Элементарные сложение, вычитание и перемещение я подсмотрел на каком то из сайтов, остальное додумал сам.
Потом посерфил поискал в интернете и увидел что на нём оказывается можно делать условия(то было для меня удивлением). Главный вопрос: Как?
Не став изучать и принтскрить алгоритм себе в
Думал я до эффекта полной абстракции от мира сего. Ушло две тетрадки, в которых я пробовал кучу разных вариантов, перемещал, копировал, пытался как то сравнивать, расплывчатые идеи при их реализации на листке, к концу приводили к очередному хаосу в моей голове.
Поставив перед собой цель написать программу, которая будет сравнивать введённое число с заведомо известным, и выводить результат(равно или не равно), я два дня практически без отдыха(только сон, еда, туалет и dota) сидел и воображал как это реализовать, на столь запутанном прекрасном языке.
Лёг спать достаточно поздно(10 утра), не мог заснуть когда в моей голове вертелось такое.
Проснувшись ближе к вечеру, взял недописанную вторую тетрадь и начал писать, честно говоря, я сам не понимаю как к такому алгоритму я пришёл, но на листочке через 2 часа он казался рабочим. Сел за нэтбук, на стационарном в это время ставилась новая ось.
Начал переписывать с листочка, оказалось я не учёл очень много вопросов и подводных камней, но алгоритм всё ещё казался верным.
За компьютером его отладка заняла не больше часа, как вдруг, перед моими глазами программа очнулась, работая именно так, как я того хотел.
Ощущение непередаваемое, такое чувство что ты планету открыл. Первые мои слова были: "Б*ля Ну вот, наконец то!". Немного отладив, убрал кучу + и -, заменив их на циклы всё работало как в сказке.
Не сильно закидывайте помидорами и тухлыми яйцами, но я попробую рискнуть и привести код, который написал. Смотрите:
,[>+>+<<-]>>[<<+>>-] # Копируем введённое значение в 1 ячейку
+++++ +++++[<----->-]<--- # Уменьшаем её на ascii код числа с которым сравниваем
>>+>>+<<<< # Счётчики для циклов
[ # Цикл Если n != 5
[-]+++++ +++++[>+++++<-]>+++. # Выводим 5
[-]<++++++++[>++++<-]>. # Выводим пробел
[-]<++++++++[>++++<-]>+. # Выводим восклицательный знак
[-]<++++++++++[>++++++<-]>+. # Выводим знак равенства
[-]<++++++++[>++++<-]>.<<. # Выводим пробел и число n
>>>>>-<<-] # Обнуляем счётчики, что бы второй цикл не выполнился
>>[ # Цикл иначе, практически всё тоже самое
[-]+++++ +++++[>+++++<-]>+++.
[-]<++++++++[>++++<-]>.
[-]<++++++++++[>++++++<-]>+.
[-]<++++++++[>++++<-]>.<<<<.
>>>>>-]
Как видите, основная идея в том, что бы цикл выполнялся тогда и только тогда, когда остаток от разности чисел n и ascii кода числа с которым сравнивают != 0.
Думаю это будет достаточно наглядный пример для начинающих, а от Вас Уважаемые гуру и ниндзя этого языка, прошу совета и возможно критики.
Ещё интересуют вопросы:
- Как остальные решили бы данный вопрос?
- Правильно ли я выбрал алгоритм, или можно обойтись более простым?
- Что здесь можно ещё оптимизировать, и можно ли вообще?
Автор: systemiv