Brainf * ck, 98 77
เห็นได้ชัดว่านี่ไม่ใช่เพื่อจุดประสงค์ในการชนะ แต่สิ่งที่การแข่งขันจะเป็นถ้ามันไม่ได้มีวิธีแก้ปัญหาสมอง
++++[>++++<-]>>,<[->>++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++[->++++++++<]>.[-]>[-<<<+>>>]<<<<]
เนื่องจาก brainfk สามารถจัดการจำนวนเต็ม 8 บิตได้เท่านั้นและไม่มีเชิงลบเลยฉันคิดว่ามันไม่ได้ปฏิบัติตามกฎอย่างเต็มที่ แต่เดี๋ยวก่อนฉันไม่เคยชนะเลย
วิธีนี้ใช้ได้กับอินพุต 16 บิตหากล่ามของคุณรองรับ
ฉันยังได้รับมันเพื่อส่งออกในค่า ASCII
นี่คือรหัสอธิบายประกอบ:
++[>++++<-] preload 8 onto cell 1
>>,< input into cell 2
[- iterate over cell 1
>>++< put 2 in cell 3
[->-[>+>>]>[+[-<+>]>+>>]<<<<<] division algorithm: converts {n d} into {0 d_minus_n%d n%d n/d}
>[-]++++++[->++++++++<]> clears cell 4 and puts 48(ascii of 0) into cell 5
.[-] output n%2 and clear it (the bit)
>[-<<<+>>>] bring n/2 into cell 2 (to be used for division in next iteration)
<<<<] end iterate
อัลกอริทึมที่สั้นกว่า (77):
+>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+>+>+>+>+>+<<<<<<<<]>[.>]
อันนี้สามารถจัดการจำนวนเต็ม 8 บิตเท่านั้น
อัลกอริธึมทำงานโดยใช้ตัวนับไบนารีซึ่งสั้นมากจริง ๆ (เพิ่มทีละหนึ่ง>[->]++[-<+]-<-
ซึ่งวางบิตออก) ปัญหาคือมันยากที่จะพิมพ์บิตทั้งหมด
อัลกอริทึมสุดท้ายนั้นสามารถปรับให้พอดีกับจำนวนบิตใด ๆ ที่มีค่าใช้จ่ายของไบต์ เพื่อให้สามารถจัดการกับจำนวนเต็ม N บิตจะต้องใช้ 53 + 3 * N ไบต์ในการเข้ารหัส
ตัวอย่าง:
(1 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+<]>[.>]
(2 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+<<]>[.>]
(3 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+<<<]>[.>]
etc