2012-01-17 31 views
15

Tôi muốn đọc bằng một số có số chữ số bằng bf. Tôi biết làm thế nào để đọc trong con số chính xác của các chữ số nếu tôi đặt nó bằng tay, như thế này:Cách đọc số nhiều chữ số trong 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 

Nhưng tôi thà có thể thiết lập một số trong cell 0 và sau đó tự động nhân số bên phải của lần mỗi chữ số. Tôi sẽ làm gì tốt nhất?

Trả lời

1

Liên kết này nên được khá hữu ích: http://esolangs.org/wiki/brainfuck_algorithms

Nó chứa các thuật toán cho phép nhân và cũng là một điều kiện IF cũng như so sánh boolean (để kiểm tra nếu, ví dụ, người dùng nhấn vào [nhân vật 10] để kết thúc đầu vào.)

Sau đó, những gì bạn làm là (tôi sẽ viết một số mã giả và sau đó bạn có thể thực hiện nó bằng cách sử dụng các thuật toán được mô tả ở đó). Tôi sẽ nói với bạn cũng cung cấp cho mã giả trên làm thế nào để thực hiện một vòng lặp while ở cuối kể từ đó không được bao gồm trong trang đó (nhưng khá đơn giản dù sao ... tương đối). Bạn chắc chắn sẽ ngạc nhiên khi bạn quản lý để hiểu chính xác những gì mỗi nhân vật đang làm: D. Dù sao, ở đây đi:

bạn cần hai tế bào A và 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 

Và đây là một chút thông tin về làm thế nào để tạo ra một vòng lặp while. Giả sử bạn có mã này: while (condition) {body}. Tôi sẽ giả sử bạn quản lý để thực hiện mã cho điều kiện bằng cách sử dụng liên kết tôi đã cung cấp cho bạn trước đó. Bạn cần một tế bào trong đó để lưu trữ các kết quả của điều kiện, mà tôi sẽ gọi 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

Chương trình này là để đọc số n chữ số và in nó như vậy. Luôn luôn cách tốt nhất để giữ số chữ số n là lưu trữ ascii trong băng theo trình tự.

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

Khi tôi thử nghiệm trực tuyến này tại https://copy.sh/brainfuck/ và tại https://sange.fi/esoteric/brainfuck/impl/interp/i.html, cả hai trang web đều không thể dừng lại. – JSideris

Các vấn đề liên quan