Brainfuck сравнить 2 числа как больше или меньше, чем
Как я могу сравнить два числа с неравенством? (больше или меньше чем)
Я хочу сравнить однозначные цифры Например
1 2
5 3
9 2
и т.п.
5 ответов
Это лучший способ сравнения двух чисел. Почему, если вы достаточно умны, вы можете использовать один и тот же код в больших программах.
Предположим, у нас есть два числа a, b. у нас есть два блока: если ( a>=b) и еще, надеюсь, этого достаточно.
0 1 0 a b 0
Сделайте массив таким. И указать на (4) т.е. указать на
+>+< This is for managing if a=0 and b=0
[->-[>]<<] This is a magic loop. if a is the one which
reaches 0 first (a<b),then pointer will be at(4).
Else it will be at (3)
<[-
// BLOCK (a>=b)
//You are at (2) and do whatever you want and come back to (2).
//Its a must
]
<[-<
// BLOCK(a<b)
//You are at (1) and do whatever you want and come back to (1).
//Its a must
]
Это не повлияет на следующий программный код, так как оба блока кода окажутся в (1). Вы можете выполнить дальнейшее кодирование, предполагая, что указатель достигнет (1)
Пожалуйста, удалите документацию, если вы копируете код. Потому что код содержит несколько допустимых символов, например <., так далее.
Как только вы узнаете, какое расстояние между двумя числами, вы должны или уменьшите оба из них в одной и той же итерации цикла, а затем проверьте, что оба равны нулю: вы поймете, какое из них меньше.
Например:
+++++ > +++ < [->-< check is first is zero, then second]
(это просто для того, чтобы дать вам подсказку, вам придется позаботиться о равных числах и подобных проблемах.
Я тоже думал об этом, и хотя я уверен, что это не лучшее решение, по крайней мере, оно может ответить на вопрос, какое число больше =)
Программа запрашивает два символа, выводит "<", если первый меньше, ">", если он больше, и "=", если они равны. После вывода одного символа программа останавливается, запрашивая дополнительный ввод.
+>,>,<<[>-[>>>]<[>>-[>++++++++++[->++++++<]>.,]++++++++++[->++++++<]>+.,]<-[>>>]<<[>>>++++++++++[->++++++<]>++.,]<<<]
Надеюсь, несколько яснее:
+ init (0) to 1
>, read (1)
>, read (2)
<<[ loop forever
>-[>>>] decrement (1) going to (4) if (1) != 0
<[ goto (0) == 1 if (1) reached 0 (otherwise goto (3))
>>-[>++++++++++[->++++++<]>.,] decrement (2) printing lessthan if larger than 0
++++++++++[->++++++<]>+., if (2) == 0 print '='
]
<-[>>>] decrement (2) going to (5) if (2) != 0
<<[ goto (0) == 1 if (2) reached 0 (otherwise goto (3))
>>>++++++++++[->++++++<]>++., print largerthan since (2) reached 0 first
]
<<< goto(0)
]
Я сделал решение, которое возвращает логическое значение и указатель всегда в одной и той же точке.
Вот как это выглядит в начале:
0 0 0 a b 0 0
p
И это два возможных выхода:
0 0 0 0 0 1 0 #true
p
0 0 0 0 0 0 0 #false
p
Код:
>>>>
[ # while cell != 0
- # decrement a
[ # if a != 0
>- # decrement b
[ # if b != 0
< # go left
<-< # undo the finally-block;
] # finally-block
<[-]> # clear a
>+> # res = 1; move to end-position
<<< # undo the finally-block
] # finally-block
>[-]>> # clear b; res = 0; move to end-position
] #
уменьшенная версия:
>>>>[-[>-[< <-<]<[-]>>+><<<]>[-]>>]
Учитывая два числа A и B, следующий код напечатает A, если A больше, чем B, B, если B больше, чем A, и C, если оба равны.
>>>>>>>>>++++++[>+++++++++++<-]>[>+>+>+<<<-]>+>->
<<<<<<<<<<<,>,<
[->-<[>]<<]>>>[>>]>>>>>>>>.
В БФ такой вещи не существует. >
а также <
в BF переместите указатель вправо и влево соответственно.