Код для умножения двух однозначных чисел в Brainfuck

Может кто-нибудь опубликовать фрагмент кода для умножения двух однозначных чисел на языке программирования brainf*ck?


person UgaBuga    schedule 02.03.2011    source источник
comment
@Gordon: По иронии судьбы, если ответ можно найти в Википедии, вопрос вряд ли можно назвать слишком локализованным.   -  person Cody Gray    schedule 02.03.2011
comment
@Cody, хотя SO определенно является подходящим местом, чтобы спросить, как сделать x на языке программирования y, я не думаю, что эзотерический язык, такой как BF, подходит для использования во всемирной аудитории Интернета.   -  person Gordon    schedule 02.03.2011


Ответы (6)


,>,< input numbers at cell #1 #2
[
 > go to cell #2
 [
   ->+>+<< move data to cell #3 #4
 ]
 >> go to cell #4
 [
  -<<+>> move data to cell #2
 ]
 <<< go to cell #1
 - decrement cell #1
]
>>. output cell #3

Программа считывается в ячейку № 1, № 2, и результат будет отображаться в ячейке № 3.

Я использую интерпретатор BF, где я могу вводить числа как числа (не символы ASCII).

person takayoshi    schedule 09.04.2011

Что ж, возможно, у меня не самый эффективный способ обойти это, но он работает. Я делал вещи особым образом, чтобы это работало со всеми этими

2*3=6

6*7=42

4*5=20

Итак, вот оно:

read 
>, >, <<

convert from ascii
+++++ +
[
 >----- ---
 >----- ---
 <<-
]

multiply
>[
 >[>+>+<<-]
 >[<+>-]
 <<-
]

separate numbers
>[-]>+> >+++++ +++++<
[
 - >- [>>>]+++++ +++++<<+
 [<<<]>>>>
]
<-
<+++++ +++++>>>[-<<<->>>]<<<


convert to ascii
<+++++ +
[
 >+++++ +++>
 [+++++ +++>]
 <[<]>-
]

print
>>[.<<]<[<<]>>.

Я использовал этот интерпретатор: http://esoteric.sange.fi/brainfuck/impl/interp/i.html

person Filip Cvejic    schedule 03.11.2014
comment
Теперь это — ответ, который работает с вводом ASCII. - person Ruslan; 28.09.2015
comment
Как мне ввести условие, например, если мой вывод после умножения меньше числа X или нет? - person Rakshit Shah; 25.05.2019

Ну, я был вдохновлен первым и сделал его намного проще:

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

48+ в конце для bfdev, чтобы показать его в ascii.

person Matan Perelman    schedule 28.11.2012

Я знаю, что это было опубликовано более восьми лет назад, но я все же хотел бы поделиться своим ответом на случай, если кто-то еще наткнется на эту тему.

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

Это использует восемь ячеек пространства, которые все должны быть инициализированы нулем (в случае, если вы используете это в более крупной программе), а указатель начинается слева от большинства восьми ячеек. Он будет принимать два однозначных числа ASCII и выводить одно двузначное число ASCII. Под номером ASCII я подразумеваю, что он будет принимать и выводить значения ASCII символов, составляющих число. Когда эта программа завершится, указатель снова окажется в крайнем левом конце восьми ячеек, и все ячейки будут возвращены к нулю. Значения, которые это создаст на ленте при нормальной работе, не опустятся ниже 0 и не превысят 81, поэтому вам не нужно беспокоиться о негативах или переносе.

person user8846760    schedule 14.06.2019
comment
входы, содержащие 0, вызывают вывод 88 - person Corsaka; 26.11.2019

Немного сложно понять, но это работает

>[>>>+<<<-]>>>[>+>+<<-]>>[<<+>>-]<<<<<<[>+>+>+<<<-]>>>[<<<+>>>-]>>[-<<<[-<<+>>]<[>+>+<<-]>>[<<+>>-]<<>>>>]<[-]<<[-]<[-]<
person monsterbananas    schedule 28.05.2015

person    schedule
comment
Это умножит значения ASCII, а не фактические значения. С этим кодом '1' * '1' = 49 * 49 = 2401, что, предполагая 8-битные ячейки, дало бы тогда 2401 % 256 = 97. 97 явно не равно 1 * 1. Вы должны вычесть 48 (т.е. ascii-код «0») из символа, чтобы получить фактическое значение. Вот так: ,›++++++[‹--------›-],›++++++[‹--------›-]‹‹[›[ ›+›+‹‹-]››[‹‹+››-]‹‹‹-]›››. - person Cedric Mamo; 10.12.2012