CJam, 25 - 25 = 0 ไบต์
q~1,*_@{[\{1$^}/_](;)\}/;
นี่เป็นเพียงพอร์ต CJam ตรงของคำตอบ GolfScript ด้านล่างเนื่องจากหลังจากอ่านคำตอบของ Martin Büttnerฉันรู้ว่าฉันสามารถบันทึกหนึ่งไบต์เนื่องจากการจัดการประเภทจำนวนเต็มและอักขระของ CJam (โดยทั่วไปแล้ว CJam ไม่จำเป็นต้อง1&ใช้เพื่อบังคับให้ตัวละคร ASCII เป็นบิตในรหัส GolfScript แต่ไม่จำเป็นต้องมีการเตรียมqการก่อนอ่านอินพุต) ฉันมักจะพิจารณาว่าพอร์ตเล็ก ๆ น้อย ๆ นั้นเป็นเคล็ดลับราคาถูก มันคุ้มค่า IMO
ไม่ว่าในกรณีใดโปรแกรมนี้ทำงานเหมือนกับโปรแกรม GolfScript ดั้งเดิมด้านล่างดังนั้นโปรดอ้างอิงคำอธิบายและคำแนะนำการใช้งาน ตามปกติคุณสามารถทดสอบเวอร์ชัน CJam โดยใช้ล่ามออนไลน์นี้
GolfScript, 26 - 25 = 1 ไบต์
~1,*.@{[1&\{1$^}/.](;)\}/;
โซลูชันนี้วนซ้ำสตริงการป้อนข้อมูลเพียงครั้งเดียวดังนั้นฉันเชื่อว่ามันมีคุณสมบัติสำหรับโบนัส −25 ไบต์ มันทำงานโดยการบำรุงรักษาภายในk -element array ที่เก็บบิตปัจจุบันของk pre-iterates แต่ละบิต
การป้อนข้อมูลควรจะได้รับผ่านทาง stdin ในรูปแบบ"1111111" 3เช่นเป็นสายยกของ0และ1ตัวอักษรตามด้วยหมายเลขk เอาต์พุตจะเป็น stdout ในฐานะ bitstring โดยไม่มีเครื่องหมายคำพูด
ทดสอบรหัสนี้ทางออนไลน์ (หากโปรแกรมหมดเวลาให้ลองเรียกใช้ซ้ำอีกครั้งเซิร์ฟเวอร์ Web GolfScript มีชื่อเสียงในเรื่องการหมดเวลาแบบสุ่ม)
ต่อไปนี้เป็นเวอร์ชันขยายของโปรแกรมนี้พร้อมความคิดเห็น:
~ # eval the input, leaving a string and the number k on the stack
1,* # turn the number k into an array of k zeros ("the state array")
. # make a copy of the array; it will be left on the stack, making up the
# first k bits of the output (which are always zeros)
@ # move the input string to the top of the stack, to be iterated over
{
[ # place a start-of-array marker on the stack, for later use
1& # zero out all but the lowest bit of this input byte
\ # move the state array to the top of the stack, to be iterated over
{ 1$^ } / # iterate over each element of the state array, XORing each
# element with the previous value on the stack, and leave
# the results on the stack
. # duplicate the last value on the stack (which is the output bit we want)
] # collect all values put on the stack since the last [ into an array
(; # remove the first element of the array (the input bit)
) # pop the last element (the duplicated output bit) off the array
\ # move the popped bit below the new state array on the stack
}
/ # iterate the preceding code block over the bytes in the input string
; # discard the state array, leaving just the output bits on the stack
โดยทั่วไปเช่นเดียวกับวิธีแก้ปัญหาซ้ำ ๆ ส่วนใหญ่รหัสนี้สามารถเข้าใจได้ว่าเป็นการใช้การเกิดซ้ำ
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
โดยที่b 0, jคือบิตอินพุตj -th (สำหรับj ≥ 1), b k , jคือบิตเอาต์พุตj -th และb i , 0 = 0 ตามข้อสมมติ ความแตกต่างคือในขณะที่การแก้ปัญหาซ้ำผลคำนวณ "แถวต่อแถว" ซ้ำ (เช่นแรกข1, jสำหรับทุกjแล้วb 2, jฯลฯ ) วิธีนี้แทนที่จะคำนวณ "คอลัมน์โดย คอลัมน์"(หรือกว่าถูกต้อง 'ในแนวทแยงโดยเส้นทแยงมุม') ครั้งแรกคอมพิวเตอร์ขฉัน , ฉัน 1 ≤ ฉัน≤ kจากนั้นb i , i +1 , จากนั้นb i , i +2 , เป็นต้น
ข้อดีของทฤษฎีนี้คือ (ในทางทฤษฎี) โดยหลักการแล้ววิธีนี้สามารถประมวลผลสตริงอินพุตที่มีความยาวโดยพลการโดยใช้ที่เก็บข้อมูลO ( k ) เท่านั้น แน่นอนล่าม GolfScript จะอ่านอินพุตทั้งหมดลงในหน่วยความจำโดยอัตโนมัติก่อนที่จะเรียกใช้โปรแกรมต่อไปซึ่งส่วนใหญ่จะเป็นการลบความได้เปรียบนี้