Pull to refresh

Comments 20

Эх, было бы у меня столько свободного времени…
Сам в поисках работы. Пока время есть, буду вытворять разные крутые штуки, которые возможно кому то помогут
Когда-то писал сравнение 2-х чисел на brainfuck-e. Есть конструкция if-then-else. Не уверен, насколько там все корректно, но работало.

,>,< # вводим 2 числа
[->-<] # if a=b (вычитаем из обоих 1 пока первое не обнулится)
>[.>>-<] # else (выводим разницу если числа различаются)
>+[-.....] # then (выводим разницу (0) 5 раз если числа одинаковы)
По моему достаточно красиво. А как Вы писали алгоритм? Мне пришлось с этим столкнуться в первые 10-15 минут работы с этим языком. Я пробовал стандартную блочную схему алгоритма, но от неё мало толку, если только в уме переводить всё на Си, и писать алгоритм на нём. Так же пробовал просто писать несколько байт, и на каждой новой строчке, их преобразования. В этом случае я запутался в итерациях. Есть ли универсальный метод алгоритмизации?
Си-подобный псевдокод довольно неплохо подходит для планирования алгоритмов вообще и кода на Brainfuck — в частности.
Я часто при продумывании алгоритмов фиксирую ход мысли именно в псевдокоде вне зависимости от целевого языка.
Метод хороший. Но интереснее, когда этот прием приходится использовать не в конце, а в середине программы — тогда после условного сдвига надо как-то вернуться на то же место ленты.
Это слишком простой выход, смотреть на чужие решения
Я бы написал как-нибудь так:
,[->+>+<<]  # вводим число и дублируем его. На ленте _0 n n
++++++[->>--------->+++++>+++++++++<<<<]  # вычитаем из второй копии 54, а дальше создаем 30 и 54
>>+>++>- # подправляем сдвиги, чтобы получилось 0 n n-53 32 53
.<. # печатаем '5 '
<[>+.-<[-]] # если n-'5'!=0, печатаем '!', переделав его из пробела, и обнуляем счетчик
>>++++++++.<.<<. # печатаем "= n".

Интереснее было бы в случае равенства печатать 5 == n. Тогда так:
,[->+>+<<] 
++++++[->>--------->+++++>+++++++++<<<<]  
>>+>++>->+ 
.++++++++<. # сразу после вывода 5 переделываем его в =
<[>+.->>-<<<[-]] # если n-'5'!=0, печатаем '!', переделав его из пробела, и обнуляем счетчики
>>>[<.>-] # если надо, печатаем =
<.<.<<. # печатаем "= n".

Коды не проверялись.
Теперь для вас задача — сделать обращение к массиву по переменному индексу.
Это тоже решено. Можете посмотреть как делали морской бой на brianfuck. Там же есть описание как сделать более универсальное if-then-else.
Да оно-то решено, но автору наверняка понравится повторить это самостоятельно.
Есть задача проще — ввести два символа m,n и если m<n, напечатать «m<n» а иначе — «m>=n».
Я щас хочу выполнить сравнение двух введённых чисел и результат выводить >, < или ==. Но всё равно за задачку спасибо.
Мне, как незнакомому с этим языком, свернуло мозг напрочь.
Это потрясающе :)
,>, //считываем
[< (0) [->>+>+<<<] >>>[-<<<+>>>] < (2) >>+<< [[-]>>-<<] <-<->] //делаем магию
после магии:
если числа равны то в 0ой ячейке 0 в 4ой 0
если первое число больше то в 4ой 1
если первое меньше то в 4ой 0
+ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ // для вывода
<[ >+< [-]] // числа не равны
>>>>[ <<<-->>> [-]] // первое число меньше
<<<. //вывод

может кому будет интересно
вводятся два символа, и программа выводит >, < или =
Интересный способ
А еще можно так:

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

Без комментариев :)
Стоило бы в заголовке написать, что это Brainfuck — а то с приходом хабов это плохо видно
Sign up to leave a comment.

Articles