Brainfuck, 39 33 32 31 ไบต์
-[-[>]<--<--],[[>.<+]>+.--.+<,]
อัลกอริทึมที่สถานที่ที่45ในเทปจะนำมาจากEsolang ของค่าคงที่
คำตอบนี้อนุมานว่าล่ามของโปรแกรมเอาต์พุตมีการล้อมรอบเซลล์ที่ถูก จำกัด และ,
เลขศูนย์เซลล์ปัจจุบัน (หมายความว่าโปรแกรมเอาต์พุตจะทำงานโดยไม่มีอินพุต) ลองออนไลน์!
สำหรับ (อีกต่อไป) วิธีการแก้ปัญหาที่ทำงานโดยไม่มีเงื่อนไขให้ดูคำตอบอื่น ๆ ของฉัน
ทดสอบการทำงาน
สำหรับอินพุตCode Golf
เอาต์พุตต่อไปนี้จะถูกสร้างขึ้น
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
ลองออนไลน์!
มันทำงานอย่างไร
เราเริ่มต้นด้วยการใส่จำนวนเต็ม45 (รหัสอักขระของ-
) ลงในเซลล์ของเทป รหัสต่อไปนี้บรรลุสิ่งนี้
- 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.
]
ก่อนที่เราจะเข้าสู่ลูปเทปจะมีลักษณะเช่นนี้
v
000 000 255
เซลล์ทั้งสามนี้ - -2 , -1และ0 - เป็นเซลล์เดียวที่เราจะใช้ในโปรแกรมนี้
ในครั้งแรกของการวนซ้ำแต่ละครั้งเซลล์ที่อยู่ด้านขวาสุดคือจากนั้นเซลล์และเซลล์กลางจะถูกลดค่าลงสองครั้งออกจากสถานะต่อไปนี้
v
000 254 252
ในการทำซ้ำ 126 ครั้งถัดไปการ-
ลดลงเริ่มต้นของเซลล์กลาง[>]<
กระโดดไปที่เซลล์ที่อยู่ด้านขวาสุดและ--<--
ลดค่าที่ตรงกลางและเซลล์ที่เหมาะสม เป็นผลให้3ถูกลบออกจากเซลล์กลาง (โมดูโล256 ) และ2ถูกลบออกจากเซลล์ขวาสุด
ตั้งแต่254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170และ252 ÷ 3 = 84เซลล์ที่อยู่ด้านขวาสุดจะถูกทำให้เป็นศูนย์ก่อนกลางออกจากสถานะต่อไปนี้
v
000 132 000
ในทำนองเดียวกันกับการวนซ้ำครั้งแรกของการวนซ้ำการทำซ้ำครั้งถัดไปจะลบ3ออกจากเซลล์กลางและ2จากเซลล์ซ้ายสุดโดยวางหัวไว้ที่เซลล์ซ้ายสุด
v
254 129 000
การวนซ้ำครั้งที่ตามมาเช่นเดียวกับในการวนซ้ำก่อนหน้า 126 ลบ3จากเซลล์ซ้ายสุดและ2จากเซลล์ขวาสุด
เนื่องจาก254 ÷ 3 (mod 256) = 170และ129 ÷ 2 (mod 256)ไม่ได้ถูกกำหนดซึ่งจะทำ 170 ครั้งโดยออกจากสถานะต่อไปนี้
v
000 045 000
เซลล์ใต้หัวเป็นศูนย์ ลูปสิ้นสุด
ตอนนี้เราพร้อมที่จะสร้างผลผลิตแล้ว
, 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.