brainfuck , 474 176 154 151 149 137 byte
Lấy một chuỗi đầu vào gồm tám 0
và 1
bao gồm chuỗi đầu tiên 0
cho dấu thập phân.
(giống như trong cột thứ hai của bảng trong bài)
Đầu ra chữ số từ 0 đến 9.
,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]
Hãy thử trực tuyến!
Thuật toán
Bằng cách quan sát trạng thái của một phân khúc cụ thể, chúng ta có thể chia một tập hợp các chữ số có thể thành các tập con nhỏ hơn. Dưới đây là cây tìm kiếm nhị phân tĩnh được sử dụng trong mã của tôi. Cây con bên trái tương ứng với trạng thái phân đoạn ON, bên phải tương ứng với trạng thái TẮT phân khúc.
0,1,2,3,4,5,6,7,8,9
|
/-------[A]-------------------------\
0,2,3,5,6,7,8,9 1,4
| |
/-------------[B]----------------\ /----[G]----\
0,2,3,7,8,9 5,6 4 1
| |
/--------[E]--------\ /----[E]----\
0,2,8 3,7,9 6 5
| |
/----[F]----\ /----[F]----\
0,8 2 9 3,7
| |
/----[G]----\ /----[G]----\
8 0 3 7
Một số quan sát hữu ích cho việc chơi golf
- Bits C và D là dự phòng và có thể bỏ qua.
- Số 0 (bit cho dấu thập phân) có thể là (ab) được sử dụng làm giá trị 48, quan trọng cả cho phân tích cú pháp đầu vào và chuẩn bị đầu ra.
- Khi đạt được lá và chữ số được in, chúng ta chỉ cần bỏ qua tất cả các điều kiện tiếp theo. Nó có thể được thực hiện bằng cách di chuyển con trỏ dữ liệu đủ xa đến khu vực số không để nó không thể quay lại.
- Để tương thích, tốt hơn là sử dụng các số 0 ở bên phải, bởi vì một số triển khai BF không hỗ trợ các con trỏ dữ liệu âm.
- Do đó, tốt hơn là lưu trữ giá trị đầu ra trong ô ngoài cùng bên phải, vì vậy chúng ta có thể dễ dàng tiếp cận khu vực số 0 ở bên phải.
- Do đó, tốt hơn là kiểm tra các bit từ trái sang phải: A, B, E, F, G để chúng ta có thể tiếp cận ô đầu ra dễ dàng hơn.
- Các chữ số khác nhau có thể chia sẻ mã đầu ra. Ví dụ, 5 và 6 nằm trong cùng một cây con. Chúng tôi có thể làm
+++++
cho cả hai giá trị và sau đó +
cho sáu chỉ.
- Chúng tôi có thể giảm số lượng
+
lệnh nếu chúng tôi thêm 2 vào giá trị đầu ra trước. Trong trường hợp đó, chúng ta cần giảm 0
và 1
chỉ và nhận lợi thế cho các chữ số khác.