brainfuck (178 ไบต์)
แม้ว่า brainfuck จะยุ่งยาก แต่ก็ช่วยให้ทำงานกับภาษาได้ ถามตัวเองว่า "ฉันต้องเก็บค่านี้ไว้ในเซลล์อย่างชัดเจนหรือไม่?" คุณมักจะได้รับความเร็วและความกระชับด้วยการทำสิ่งที่ลึกซึ้งยิ่งขึ้น และเมื่อค่าเป็นดัชนีอาเรย์ (หรือจำนวนธรรมชาติโดยพลการ) ก็อาจไม่เหมาะสมในเซลล์ แน่นอนคุณสามารถยอมรับได้ว่าเป็นข้อ จำกัด ของโปรแกรมของคุณ แต่การออกแบบโปรแกรมของคุณเพื่อจัดการกับค่าขนาดใหญ่มักจะทำให้ดีขึ้นในวิธีอื่น
ตามปกติเวอร์ชันการทำงานแรกของฉันนั้นยาวเป็นสองเท่าตราบเท่าที่จำเป็นต้องมีขนาด 392 ไบต์ การดัดแปลงจำนวนมากและการเขียนซ้ำครั้งใหญ่สองหรือสามครั้งทำให้รุ่น 178- ไบต์อันงดงามนี้ค่อนข้างสง่างาม (ถึงแม้ว่าการเรียงลำดับเชิงเส้นเชิงเส้นจะมีขนาดเพียง 40 ไบต์)
>+>>>>>,[>+>>,]>+[--[+<<<-]<[[<+>-]<[<[->[<<<+>>>>+<-]<<[>>+>[->]<<[<]
<-]>]>>>+<[[-]<[>+<-]<]>[[>>>]+<<<-<[<<[<<<]>>+>[>>>]<-]<<[<<<]>[>>[>>
>]<+<<[<<<]>-]]+<<<]]+[->>>]>>]>[brainfuck.org>>>]
ค่าอินพุตจะเว้นระยะทุกสามเซลล์: สำหรับทุกเซลล์ (V) alue มีเซลล์ abel (L) (ใช้สำหรับการนำทาง) และอีกหนึ่งเซลล์สำหรับพื้นที่ cratch (S) เค้าโครงโดยรวมของอาร์เรย์คือ
0 1 0 0 0 SVLSVL ... SVL 0 0 0 0 0 0 ...
เริ่มแรกเซลล์ L ทั้งหมดถูกตั้งค่าเป็น 1 เพื่อทำเครื่องหมายส่วนต่าง ๆ ของอาร์เรย์ที่ยังคงต้องเรียงลำดับ เมื่อเราแบ่งพาร์ติชั่นย่อยเสร็จแล้วเราแบ่งมันออกเป็นรูย่อยเล็ก ๆ โดยตั้งค่าเซลล์ L ของ pivot เป็น 0 จากนั้นหาเซลล์ L ขวาสุดที่ยังคงเป็น 1 และแบ่งพาร์ติชันย่อยถัดไป นี่คือการทำบัญชีทั้งหมดที่เราต้องการเพื่อจัดการกับการประมวลผลย่อยซ้ำ เมื่อเซลล์ L ทั้งหมดถูกทำให้เป็นศูนย์อาร์เรย์ทั้งหมดจะถูกจัดเรียง
ในการแบ่งพาร์ติชั่นย่อยเราจะดึงค่าที่ถูกต้องที่สุดไปยังเซลล์ S เพื่อทำหน้าที่เป็นเดือยและนำไปทางซ้าย (และเซลล์ V ว่างเปล่าที่สอดคล้องกัน) เปรียบเทียบกับค่าอื่น ๆ ในตอนท้ายเดือยจะได้รับการสลับกลับโดยใช้รหัส swap เดียวกัน (ซึ่งจะช่วยประหยัด 50 ไบต์หรือมากกว่านั้น) ในระหว่างการแบ่งพาร์ติชัน L เซลล์พิเศษสองเซลล์จะถูกตั้งค่าเป็น 0 เพื่อทำเครื่องหมายเซลล์สองเซลล์ที่อาจจำเป็นต้องสลับกัน ในตอนท้ายของการแบ่งพาร์ติชั่น 0 ที่เหลือจะรวมกับ 0 ที่ด้านซ้ายของระบบย่อยและ 0 ที่เหมาะสมจะสิ้นสุดการทำเครื่องหมายเดือย กระบวนการนี้ทำให้เหลือ 1 พิเศษในเซลล์ L ทางด้านขวาของ subarray ลูปหลักเริ่มต้นและสิ้นสุดที่เซลล์นี้
>+>>>>>,[>+>>,]>+[ set up; for each subarray:
--[+<<<-]<[ find the subarray; if it exists:
[<+>-]<[ S=pivot; while pivot is in S:
<[ if not at end of subarray
->[<<<+>>>>+<-] move pivot left (and copy it)
<<[>>+>[->]<<[<]<-]> move value to S and compare with pivot
]>>>+<[[-]<[>+<-]<]>[ if pivot greater then set V=S; else:
[>>>]+<<<-<[<<[<<<]>>+>[>>>]<-] swap smaller value into V
<<[<<<]>[>>[>>>]<+<<[<<<]>-] swap S into its place
]+<<< end else and set S=1 for return path
] subarray done (pivot was swapped in)
]+[->>>]>> end "if subarray exists"; go to right
]>[brainfuck.org>>>] done sorting whole array; output it