Как читать многозначные числа в Brainfuck - PullRequest
15 голосов
/ 17 января 2012

Я хочу прочитать число с любым количеством цифр с помощью bf. Я знаю, как читать правильное количество цифр, если я установил его вручную, например:

,>,>, 2 Read in 3 digits
<< 0
--------
--------
--------
--------
--------
-------- 45 decrements
> 1
--------
--------
--------
--------
--------
--------
> 2
--------
--------
--------
--------
--------
--------

[>+<-]< 1 Copy digit 3 to cell 3

[>>++++++++++<<-]< Copy 10 * digit 2 to cell 3

Copy 100 * digit 1 to cell 3
[>>>>++++++++++ 4
    [<++++++++++>-] 4
<<<<-]>>> 3

>++++++++++..< Add 2 line breaks

., Print and Pause

Но я бы предпочел установить число в cell 0, а затем автоматически умножить правильное число раз для каждой цифры. Что мне лучше всего делать?

Ответы [ 2 ]

1 голос
/ 27 ноября 2012

Эта ссылка должна быть очень полезной: http://esolangs.org/wiki/brainfuck_algorithms

Содержит алгоритмы умножения, а также условие IF, а также логические сравнения (чтобы проверить, например, нажал ли пользователь ввод [символ 10], чтобы завершить ввод.)

Тогда то, что вы делаете - это я (я напишу какой-нибудь псевдокод, а затем вы сможете реализовать его, используя описанные там алгоритмы). Я также расскажу вам о псевдокоде о том, как реализовать цикл while в конце, поскольку он не включен в эту страницу (но, тем не менее, довольно прост ... относительно). Вы определенно будете поражены, когда вам удастся точно понять, что делает каждый персонаж: D. Во всяком случае, здесь идет:

вам нужно две ячейки A и B

move to B
input a character
while B is not equal to 10 (the newline character) then
    subtract 48 from B ('0' is character 48, so if we subtract 48 from any digit entered we should get its value. Of course this assumes that the user only presses digit keys or enter. I'll leave it as an exercise to you to do error checking)
    multiply A by 10
    add B to A (you can just move B to A like this [<+>-] since you will not need B's value anymore)
    move to B
    input a character

А вот немного информации о том, как создать цикл while. Предположим, у вас есть этот код: while (condition) {body}. Я предполагаю, что вам удалось реализовать код для условия, используя ссылку, которую я дал вам ранее. Вам нужна ячейка для хранения результата условия, которое я назову C

execute condition and store result in C
start loop using [[-] (start the loop and immediately clear C)
    execute loop body
    execute condition and store result in C
end loop using ]
0 голосов
/ 18 октября 2013

Эта программа должна прочитать n-значный номер и распечатать его как таковой. Всегда лучший способ сохранить n-значный номер - это сохранить ascii на ленте в виде последовательности.

> +
[ - >,>+< 
  ----- -----    ; minus 10
  [              ; if enters means it is not a \n
    +++++ +++++  ; restore prev value
    < 
  ] >>           ; moving forward
]
                 ; numbers are 0 0 49 0 50 0 51
                 ; for input 123
<<<<[<<]         ; moving to the beginning
>>               ; reaching first char
[.>>]            ; just printing till end
...