ব্রেনফাক (178 বাইট)
এমনকি ব্রেনফাক জটিল হলেও, এটি ভাষার দানা দিয়ে কাজ করতে সহায়তা করে। নিজেকে জিজ্ঞাসা করুন "আমাকে কি এই মানটি একটি ঘরে আলাদাভাবে সংরক্ষণ করতে হবে?" আপনি প্রায়শই আরও সূক্ষ্ম কিছু করে গতি এবং সংক্ষিপ্তসার অর্জন করতে পারেন। এবং যখন মানটি একটি অ্যারে সূচক (বা একটি স্বেচ্ছাচারী প্রাকৃতিক সংখ্যা) হয়, এটি কোনও ঘরে কোনও মানানসই নাও হতে পারে । অবশ্যই, আপনি কেবল এটি আপনার প্রোগ্রামের সীমা হিসাবে গ্রহণ করতে পারেন। তবে বড় মূল্যবোধগুলি পরিচালনা করতে আপনার প্রোগ্রামটি ডিজাইন করা প্রায়শই অন্যান্য উপায়ে এটি আরও ভাল করে তুলবে।
যথারীতি, আমার প্রথম কার্যকরী সংস্করণটি 392 ডলার বাইট হওয়ার দরকারের দ্বিগুণ ছিল। অসংখ্য পরিবর্তন এবং দুটি বা তিনটি নতুন লেখাগুলি এই তুলনামূলকভাবে করুণাময় 178-বাইট সংস্করণ তৈরি করেছে। (যদিও মজাদারভাবে একটি রৈখিক-সময় সাজানো কেবল 40 বাইট।
>+>>>>>,[>+>>,]>+[--[+<<<-]<[[<+>-]<[<[->[<<<+>>>>+<-]<<[>>+>[->]<<[<]
<-]>]>>>+<[[-]<[>+<-]<]>[[>>>]+<<<-<[<<[<<<]>>+>[>>>]<-]<<[<<<]>[>>[>>
>]<+<<[<<<]>-]]+<<<]]+[->>>]>>]>[brainfuck.org>>>]
ইনপুট মানগুলি প্রতি তিনটি কক্ষকে পৃথক করে: প্রতিটি (ভি) আলিউ সেলের জন্য, একটি (এল) আবেল ঘর (নেভিগেশনের জন্য ব্যবহৃত) এবং (এস) ক্র্যাচ স্পেসের জন্য আরও একটি ঘর রয়েছে। অ্যারের সামগ্রিক বিন্যাস হ'ল
0 1 0 0 0 এসভিএলএসভিএল ... এসভিএল 0 0 0 0 0 0 ...
প্রাথমিকভাবে সমস্ত এল কোষ 1 তে সেট করা থাকে, অ্যারের অংশগুলি চিহ্নিত করার জন্য যে এখনও বাছাই করা দরকার। যখন আমরা একটি সাববারে বিভাজন সম্পন্ন করেছি, আমরা এর পিভট এল এল সেলটি 0 এ সেট করে ছোট ছোট সাবারিগুলিতে ভাগ করি, তারপরে ডানদিকের এল সেলটি সনাক্ত করি যা এখনও 1 এবং পার্শ্ববর্তী সুবারে বিভাজন করে। অদ্ভুতরূপে, সাবারিগুলির পুনরাবৃত্ত প্রক্রিয়াকরণ সঠিকভাবে পরিচালনা করার জন্য আমাদের এই সমস্ত বুককিপিং প্রয়োজন। সমস্ত এল কোষ শূন্য করা হয়ে গেলে পুরো অ্যারে বাছাই করা হয়।
সাববারে বিভাজন করতে আমরা পাইভট হিসাবে কাজ করতে তার ডানদিকের মানটি একটি এস কোষে টানুন এবং এটিকে সাববারেতে একে অপরের মানের সাথে তুলনা করে এবং প্রয়োজনীয় হিসাবে অদলবদল করে এটিকে (এবং সংশ্লিষ্ট খালি ভি সেল) বামে নিয়ে আসি। শেষে পিভটটি আবার অদলবদল করে, একই অদলবদল কোডটি ব্যবহার করে (যা 50 টি বাইট বাঁচায়)। বিভাজনের সময় দুটি অতিরিক্ত এল কোষ 0 তে সেট করা থাকে, যাতে দুটি কক্ষ একে অপরের সাথে অদলবদলের প্রয়োজন হতে পারে চিহ্নিত করে; পার্টিশন শেষে, বাম 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