Brainfuck, 39 33 32 31 byte
-[-[>]<--<--],[[>.<+]>+.--.+<,]
Thuật toán đặt 45 trên băng được lấy từ các hằng số Brainfuck của Esolang .
Câu trả lời này giả định rằng trình thông dịch của chương trình đầu ra có các ô được bao bọc, giới hạn; và điều đó làm thay ,
đổi ô hiện tại (ngụ ý rằng chương trình đầu ra được chạy mà không có đầu vào). Hãy thử trực tuyến!
Đối với một giải pháp (dài hơn) hoạt động vô điều kiện, xem câu trả lời khác của tôi .
Chạy thử nghiệm
Đối với đầu vào Code Golf
, đầu ra sau đây được tạo ra.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Hãy thử trực tuyến!
Làm thế nào nó hoạt động
Chúng tôi bắt đầu bằng cách đặt số nguyên 45 (mã ký tự của -
) vào một ô của băng. Các mã sau đây đạt được điều này.
- Decrement cell 0, setting it to 255.
[ While the cell under the head in non-zero:
[>] Advance to the next zero cell.
<-- Decrement the cell to its left.
<-- Decrement the next cell to the left.
]
Trước khi chúng ta vào vòng lặp, băng trông như thế này.
v
000 000 255
Ba ô này - -2 , -1 và 0 - là những ô duy nhất chúng tôi sẽ sử dụng trong chương trình này.
Trong mỗi lần lặp đầu tiên của vòng lặp, ô ngoài cùng bên phải, sau đó ô đó và ô giữa được giảm hai lần, để lại trạng thái sau.
v
000 254 252
Trong 126 lần lặp tiếp theo, lần đầu tiên phân -
rã ô giữa, [>]<
nhảy đến ô ngoài cùng bên phải và phân --<--
rã ô giữa và ô bên phải. Kết quả là 3 bị trừ khỏi ô giữa (modulo 256 ) và 2 bị trừ khỏi ô ngoài cùng bên phải.
Vì 254 3 (mod 256) = (254 + 256) 3 = 510 3 = 170 và 252 3 = 84 , ô ngoài cùng bên phải bị bỏ trống trước ô giữa, để lại trạng thái sau.
v
000 132 000
Tương tự như lần lặp đầu tiên của vòng lặp, lần lặp tiếp theo bây giờ trừ 3 từ ô giữa và 2 từ ô ngoài cùng bên trái, đặt đầu vào ô ngoài cùng bên trái.
v
254 129 000
Các lần lặp tiếp theo, như trong lần lặp 126 trước chúng, trừ 3 từ ô ngoài cùng bên trái và 2 từ ô ngoài cùng bên phải.
Vì 254 ÷ 3 (mod 256) = 170 và 129 2 (mod 256) không được xác định, điều này được thực hiện 170 lần, để lại trạng thái sau.
v
000 045 000
Tế bào dưới đầu bằng không; vòng lặp kết thúc.
Bây giờ chúng tôi đã sẵn sàng để tạo đầu ra.
, Read a character from STDIN and put it the leftmost cell.
[ While the leftmost cell is non-zero:
[ While the leftmost cell is non-zero:
>. Print the content of the middle cell ('-').
<- Increment the leftmost cell.
] If the leftmost cell held n, the above will print 256 - n minus signs
which, when executed, will put n in cell 0 of the output program.
> Increment the middle cell, setting it to 46 ('.').
. Print its content ('.').
-- Decrement the middle cell twice, setting it to 44 (',').
. Print its content (',').
When executed, since the output program receives no input, the above
will zero cell 0 of the output program.
+ Increment the second cell, setting it back to 45 ('-').
<, Go back to the leftmost cell and read another character from STDIN.
] Once EOF is reached, this will put 0 in the leftmost cell, ending the loop.