2012-01-17 14 views
15

Voglio leggere un numero con qualsiasi numero di cifre con bf. Io so leggere il numero corretto di cifre se ho impostato manualmente, in questo modo:Come leggere numeri a più cifre in 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 

Ma io preferirei essere in grado di impostare un numero in cell 0 e poi moltiplicare automaticamente il giusto numero di volte per ogni cifra. Cosa dovrei fare meglio?

risposta

1

Questo collegamento deve essere molto utile: http://esolangs.org/wiki/brainfuck_algorithms

Esso contiene algoritmi per la moltiplicazione e anche una condizione IF così come il confronto booleani (per verificare se, per esempio, l'utente preme entrare [carattere 10] per terminare la input.)

Quindi quello che fai è questo (scriverò qualche pseudocodice e poi spetta a te implementarlo usando gli algoritmi descritti lì). Vi dirò anche di dare pseudocodice su come implementare un ciclo while alla fine poiché non è incluso in quella pagina (ma piuttosto semplice, tuttavia ... relativamente). Sarai sicuramente stupito quando riuscirai a capire esattamente cosa sta facendo ogni personaggio: D. In ogni caso, ecco qui:

avete bisogno di due celle A e 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 

Ed ecco un po 'di informazioni su come creare un ciclo while. Supponiamo di avere questo codice: while (condition) {body}. Assumerò che tu sia riuscito a implementare il codice per la condizione usando il link che ti ho dato in precedenza. Hai bisogno di una cella in cui per memorizzare il risultato della condizione, che chiamerò 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

Questo programma è quello di leggere il numero n cifre e stamparlo come tale. Sempre il modo migliore per mantenere il numero di n cifre è quello di memorizzare ascii nel nastro come sequenza.

> + 
[ - >,>+< 
    ----- ----- ; 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

Quando ho provato questa linea a https://copy.sh/brainfuck/ ea https://sange.fi/esoteric/brainfuck/impl/interp/i.html, entrambi i siti non è riuscito a fermare. – JSideris

Problemi correlati