2011-09-07 35 views
6

Là một debugger chương trình/kiểm tra cho BrainF thực hiện * ck của tôi, tôi đã tạo ra các vòng lặp đếm sau:Infinite Đếm Vòng trong Brainfuck

+[[>+]+] 

Với byte đơn, các tế bào gói và với 30k tế bào với bọc vòng này tạo ra một vòng lặp vô hạn. Nó đặt mỗi ô thành 1, sau đó mỗi ô là 2, v.v.

Vấn đề của tôi là, khi nó đến 255, vòng lặp bên trong sẽ tăng lên 0 và sau đó tăng vòng lặp bên ngoài lên 1 ngay lập tức. Điều này hoạt động như một 'bước đôi' khi nó tràn, thay vì một bước duy nhất. Đây là cách duy nhất tôi có thể nhận được vòng lặp để tiếp tục vô hạn với sự chặt chẽ của một chương trình.

Số đếm cho mỗi tế bào đi 0 -> 1 -> 2 ... 254 -> 255 -> 1 ...

Trong khi tôi muốn nó đi 0 -> 1 -> 2 ... 254 -> 255 -> 0 -> 1 ...

Nó chỉ là khó có thể tiếp tục một vòng lặp khi các tế bào hiện nay là zero. Tôi đã chơi với các biến thể trên cùng một chủ đề, nhưng không ai trong số họ nhận được nó vừa phải.

Chương trình đặc biệt này chỉ là một chương trình đếm tầm thường để thử nghiệm, nhưng điều thực sự giúp tôi với các chương trình trong tương lai là biết cách đảo ngược điều kiện vòng lặp như tôi cần thực hiện công việc đếm vòng lặp này.

Trả lời

4

Hãy thử:

+[[>+]>[+>]+]

Sau khi vòng lặp bên trong đầu tiên chúng ta biết các dữ liệu là 0 sau đó là một loạt các 255 của. Di chuyển đến ô kế tiếp và tăng tất cả chúng cho đến khi chúng ta quay lại bắt đầu. Sau đó tăng ô đầu tiên và bắt đầu lại.

+1

Thật không may nó thêm khoảng 62% vào thời lượng chương trình của bạn, và nó kém thanh lịch hơn nhiều, nhưng nó hoạt động. Tôi không tin rằng không có cách nào ngắn hơn, nhưng điều này có lẽ là rõ ràng nhất. – captncraig

1

Một khả năng tôi coi đêm qua, mặc dù nó là một chút khác biệt so với yêu cầu của bạn:

-[[-]>-] 

Đây là kích thước giống như ban đầu của bạn, nhưng nó đếm ngược. Nó xoay vòng mỗi ô từ 255 xuống 0, nhưng chỉ thay đổi một ô tại một thời điểm. Tôi nghĩ tôi sẽ thêm nó vì nó là một vòng lặp ngắn thú vị mà bạn có thể sử dụng để thử nghiệm.

Tất nhiên, bạn có thể thực hiện bất kỳ vòng lặp nào trong số các vòng lặp này lên hoặc xuống độc quyền chỉ bằng cách sử dụng + hoặc chỉ -.

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