2012-01-17 26 views
15

Chcę przeczytać w liczbie z dowolną liczbą cyfr z bf. Umiem czytać w poprawnej liczby cyfr jeśli ustawić go ręcznie, tak:Jak odczytywać liczby wielo cyfrowe w 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 

Ale wolałbym być w stanie ustawić liczbę w cell 0 a następnie automatycznie pomnożyć odpowiednią liczbę razy na każda cyfra. Co powinienem robić najlepiej?

Odpowiedz

1

Ten link powinien być bardzo pomocne: http://esolangs.org/wiki/brainfuck_algorithms

Zawiera algorytmy mnożenia, a także warunek IF, jak i logicznych porównań (w celu sprawdzenia, czy, na przykład, wciśnięty użytkownik wchodzi [znak 10], aby zakończyć input.)

To, co robisz, to jest to (napiszę trochę pseudokodu, a potem od ciebie zależy, jak go wdrożyć, używając opisanych tam algorytmów). Powiem ci również podać pseudokod na temat jak zaimplementować pętlę while na końcu, ponieważ nie jest ona zawarta na tej stronie (ale całkiem prosta jednak ... relatywnie). Z pewnością będziesz zdumiony, gdy uda ci się dokładnie zrozumieć, co robi każda postać: D. W każdym razie, tu idzie:

trzeba dwie komórki A i 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 

I tu jest trochę informacji na temat tworzenia pętli while. Załóżmy, że masz ten kod: while (condition) {body}. Zakładam, że udało ci się zaimplementować kod warunku za pomocą linku podanego wcześniej. Trzeba komórkę, w której do przechowywania wynik warunku, który Zadzwonię 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

Ten program jest odczytanie numeru n-cyfrowy i wydrukować go jako taki. Zawsze najlepszym sposobem przechowywania n-cyfr jest zapisywanie ASCII na taśmie jako sekwencji.

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

Kiedy testowałem to on-line w https://copy.sh/brainfuck/ i na https://sange.fi/esoteric/brainfuck/impl/interp/i.html, obie strony nie udało się powstrzymać. – JSideris