2012-01-17 2 views
15

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

,>,>, 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, а затем автоматически умножить нужное количество раз каждая цифра. Что мне лучше делать?

ответ

1

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

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

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

вам нужны две клетки А и В

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 (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

Эта программа для чтения п-значное число и напечатать его в качестве такового. Всегда лучшим способом сохранить 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 
+0

Когда я проверил это в Интернете на https://copy.sh/brainfuck/ и в https://sange.fi/esoteric/brainfuck/impl/interp/i.html, оба сайта не удалось остановить. – JSideris