Một vài lời khuyên ở đây:
Hằng số:
Các trang hằng Esolangs' có một danh sách rất hữu ích trong những cách nhanh nhất để tạo ra giá trị cụ thể. Tôi thấy mình tư vấn trang này ít nhất hai lần mỗi chương trình.
Sự khởi đầu của mọi thứ:
+++[[<+>>++<-]>]
Điều này thiết lập băng ở định dạng 3 * n ^ 2, trông giống như
3 6 12 24 48 96 192 128 0 0 '
Tại sao cái này lại quan trọng đến vậy?
Hãy đi xuống danh sách:
- 3 và 6 là nhàm chán
- 12: Gần đến 10 (dòng mới) hoặc 13 (trở về vận chuyển). Cũng có thể được sử dụng cho quầy cho 0-9
- 24: Gần 26, số chữ cái trong bảng chữ cái
- 48: ASCII cho
0
- 96: Gần 97, ASCII cho
a
- 196 và 128: 196-128 = 64, gần 65, ASCII cho
A
.
Từ thuật toán này, chúng tôi bắt đầu thực tế mọi chuỗi trong phạm vi ASCII, cùng với bộ đếm cho từng và một dòng mới dễ dàng tiếp cận.
Một ví dụ thực tế:
In tất cả chữ hoa và chữ thường và chữ số.
Với thuật toán:
+++[[<+>>++<-]>]<<[-<->]<<<<++[->>+.>+.<<<]<--[>>.+<<-]
Không có:
+++++++++++++[->+++++++>++>+++++>++++>+<<<<<]>+++++>[-<+.>>.+<]>>---->---[-<.+>]
Chúng tôi dành hầu hết các byte chỉ khởi tạo băng trong ví dụ thứ hai. Một số điều này bù đắp bằng các chuyển động bổ sung trong ví dụ đầu tiên, nhưng phương pháp này rõ ràng có lợi thế.
Một vài thuật toán thú vị khác trong cùng một hướng:
3 * 2 ^ n + 1:
+++[[<+>>++<-]+>]
Tape: 4 7 13 25 49 65 197 129 1 0'
Điều này bù đắp các giá trị bằng 1, thực hiện một số điều. Nó làm cho 12 trở lại vận chuyển, 64 bắt đầu thực tế của bảng chữ cái in hoa và 24 gần hơn với 26.
2 ^ n:
+[[<+>>++<-]>]
Tape: 1 2 4 8 16 32 64 128
Vì 64 là tốt cho chữ in hoa, 32 là ASCII cho không gian và 128 có thể được sử dụng làm bộ đếm cho 26 (130/5 = 26). Điều này có thể lưu byte trong các tình huống nhất định trong đó các chữ số và chữ thường không cần thiết.
Chọn cách thực hiện phù hợp với câu hỏi:
- Các tế bào tiêu cực hầu như luôn luôn hữu ích và không có lý do gì để tránh chúng (trừ khi nó không thay đổi số lượng của bạn)
- Hầu như điều tương tự chính xác với các ô bao bọc, thậm chí còn nhiều hơn bởi vì nhiều hằng số sử dụng gói.
- Kích thước ô tùy ý rất hữu ích cho các chuỗi toán học vô hạn, chẳng hạn như tính toán chuỗi Fibonacci vô hạn (
+[[-<+>>+>+<<]>]
) hoặc xử lý các số lớn hơn / âm. Nhược điểm là một số phương pháp phổ biến, chẳng hạn như [-]
và [->+<]
không thể dựa vào, chỉ trong trường hợp số đó là âm.
- EOF là 0, -1 hoặc không thay đổi. 0 thường là tốt hơn, vì bạn có thể lặp qua toàn bộ đầu vào mà không cần kiểm tra thêm. -1 rất hữu ích khi lặp trên các cấu trúc mảng. Tôi chưa tìm thấy cách sử dụng để không thay đổi :(.
Theo dõi những gì frick đang diễn ra:
Tại mọi thời điểm, bạn nên có nhận xét về vị trí của con trỏ liên quan đến dữ liệu xung quanh nó và đảm bảo rằng bạn biết phạm vi giá trị có thể có của mỗi ô. Điều này đặc biệt quan trọng khi bạn chia con trỏ trước một vòng lặp, bởi vì bạn sẽ muốn kết hợp hai khả năng lại với nhau sau đó.
Tại bất kỳ thời điểm nào, mã của tôi chứa đầy các bình luận trên mỗi dòng khác trông như thế này:
*0 *dat a_1 ? 0' !0 0*
or
*0 *dat 0' ap1 0 !0 0*
Một số lời khuyên thêm là gán biểu tượng ý nghĩa đặc biệt. Trong ví dụ trên, '
là nơi con trỏ, *
có nghĩa là sự lặp lại theo hướng đó, ?
có nghĩa là một ô có giá trị không xác định, !0
có nghĩa là một ô khác không, _
là một thay thế cho -
và p
là một thay thế cho +
.or
ngụ ý rằng băng có thể trông giống như một trong các đại diện, và cần phải được xử lý như vậy.
Sơ đồ biểu tượng của bạn không nhất thiết phải giống như của tôi (có một vài sai sót), nó chỉ cần nhất quán. Điều này cũng cực kỳ hữu ích khi gỡ lỗi, bởi vì bạn có thể chạy nó đến thời điểm đó và so sánh băng thực tế với những gì bạn nên có, có thể chỉ ra các lỗ hổng tiềm năng trong mã của bạn.