ब्रेनफक (178 बाइट्स)
भले ही ब्रेनफक बोझिल हो, यह भाषा के अनाज के साथ काम करने में मदद करता है। अपने आप से पूछें "क्या मुझे इस मूल्य को एक सेल में स्पष्ट रूप से संग्रहीत करना है?" आप अक्सर अधिक सूक्ष्म कुछ करके गति और गति प्राप्त कर सकते हैं। और जब मान एक सरणी सूचकांक (या एक मनमाना प्राकृतिक संख्या) होता है, तो यह एक सेल में फिट नहीं हो सकता है । बेशक, आप बस अपने कार्यक्रम की एक सीमा के रूप में स्वीकार कर सकते हैं। लेकिन बड़े मूल्यों को संभालने के लिए अपने कार्यक्रम को डिजाइन करना अक्सर इसे अन्य तरीकों से बेहतर बना देगा।
हमेशा की तरह, मेरा पहला काम करने का संस्करण दो बार था जब तक कि यह 392 बाइट्स की आवश्यकता थी। कई संशोधनों और दो या तीन प्रमुख पुनर्लेखनों ने इस तुलनात्मक रूप से सुशोभित 178-बाइट संस्करण का उत्पादन किया। (हालांकि आश्चर्यजनक रूप से एक रैखिक-समय की छँटाई केवल 40 बाइट्स है।)
>+>>>>>,[>+>>,]>+[--[+<<<-]<[[<+>-]<[<[->[<<<+>>>>+<-]<<[>>+>[->]<<[<]
<-]>]>>>+<[[-]<[>+<-]<]>[[>>>]+<<<-<[<<[<<<]>>+>[>>>]<-]<<[<<<]>[>>[>>
>]<+<<[<<<]>-]]+<<<]]+[->>>]>>]>[brainfuck.org>>>]
इनपुट मानों को हर तीन सेल में स्थान दिया गया है: प्रत्येक (V) एल्यु सेल के लिए, (L) एबेल सेल (नेविगेशन के लिए उपयोग किया जाता है) और (S) क्रैच स्पेस के लिए एक और सेल है। सरणी का समग्र लेआउट है
0 1 0 0 0 SVLSVL ... SVL 0 0 0 0 0 0 ...
प्रारंभ में सभी एल कोशिकाएं उस सरणी के कुछ हिस्सों को चिह्नित करने के लिए 1 पर सेट हैं, जिन्हें अभी भी छंटाई की आवश्यकता है। जब हम एक सबर्रे का विभाजन कर रहे होते हैं, तो हम इसकी छोटी धुरी को अपनी धुरी के L सेल में 0 पर सेट करके विभाजित करते हैं, फिर सबसे सही L सेल का पता लगाते हैं जो अभी भी 1 है और अगले सबर्रे को विभाजित करें। अजीब तरह से, यह सब बहीखाता पद्धति है जिसे हमें ठीक से सबरेज़ के पुनरावर्ती प्रसंस्करण को संभालने की आवश्यकता है। जब सभी एल कोशिकाओं को शून्य कर दिया जाता है, तो पूरे सरणी को क्रमबद्ध किया जाता है।
एक सबर्रे को विभाजित करने के लिए, हम धुरी के रूप में कार्य करने के लिए एस सेल में इसका सही मान खींचते हैं, और इसे छोड़ देते हैं (और इसी खाली वी सेल), इसे सबर्रे में एक दूसरे मूल्य की तुलना में और आवश्यकतानुसार स्वैप करते हैं। अंत में एक ही स्वैप कोड (जो 50 बाइट्स या तो बचाता है) का उपयोग करके धुरी को वापस स्वैप किया जाता है। विभाजन के दौरान, दो कोशिकाओं को चिह्नित करने के लिए दो अतिरिक्त एल कोशिकाओं को 0 पर सेट किया जाता है, जिन्हें एक दूसरे के साथ स्वैप करने की आवश्यकता हो सकती है; विभाजन के अंत में, बाईं ओर 0 सबरेरे के बाईं ओर फ्यूज करेगा, और दाएं 0 अपनी धुरी को चिह्नित करेगा। यह प्रक्रिया भी एल सेल में एक अतिरिक्त 1 को सबर्रे के दाईं ओर छोड़ती है; मुख्य लूप इस सेल में शुरू और समाप्त होता है।
>+>>>>>,[>+>>,]>+[ 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