2012-01-17 19 views
15

Quiero leer en un número con cualquier número de dígitos con bf. Yo sé leer en el número correcto de dígitos si fijo de forma manual, como esto:Cómo leer números de varios dígitos en 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 

Pero yo prefiero ser capaz de establecer una serie de cell 0 y luego multiplicar de forma automática el número correcto de veces para cada dígito. ¿Qué sería mejor que hiciera?

Respuesta

1

Este enlace debe ser muy útiles: http://esolangs.org/wiki/brainfuck_algorithms

Contiene algoritmos para la multiplicación y también una condición IF, así como comparaciones booleanas (para comprobar si, por ejemplo, el usuario pulsa ENTER [carácter 10] para finalizar la entrada.)

Luego, lo que debes hacer es esto (escribiré un pseudocódigo y luego tú debes implementarlo usando los algoritmos descritos allí). Te diré que también das pseudocódigo sobre cómo implementar un ciclo while al final, ya que no está incluido en esa página (pero bastante simple ... relativamente). Definitivamente se sorprenderá cuando logre entender exactamente lo que hace cada personaje: D. De todos modos, aquí va:

se necesitan dos células A y 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 

Y aquí es un poco de información acerca de cómo crear un bucle while. Supongamos que tiene este código: while (condition) {body}. Asumiré que logró implementar el código para la condición usando el enlace que le di antes. Es necesario una célula en la que almacenar el resultado de la condición, que llamaré a 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

Este programa es para leer el número de n dígitos e imprimirlo como tal. Siempre la mejor manera de mantener el número de n dígitos es almacenar ascii en la cinta como secuencia.

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

Cuando probé esta línea en https://copy.sh/brainfuck/ y al https://sange.fi/esoteric/brainfuck/impl/interp/i.html, ambos sitios no logró detener. – JSideris

Cuestiones relacionadas