cân não (178 byte)
Ngay cả khi brainfuck là cồng kềnh, nó sẽ giúp làm việc với các hạt của ngôn ngữ. Hãy tự hỏi mình "Tôi có phải lưu trữ giá trị này một cách rõ ràng trong một tế bào không?" Bạn thường có thể đạt được tốc độ và sự điều chỉnh bằng cách làm một cái gì đó tinh tế hơn. Và khi giá trị là một chỉ số mảng (hoặc số tự nhiên tùy ý), nó có thể không phù hợp trong một ô. Tất nhiên, bạn chỉ có thể chấp nhận đó là một giới hạn của chương trình của bạn. Nhưng thiết kế chương trình của bạn để xử lý các giá trị lớn thường sẽ làm cho nó tốt hơn theo những cách khác.
Như thường lệ, phiên bản làm việc đầu tiên của tôi dài gấp đôi, nó cần phải là 392 byte. Nhiều sửa đổi và hai hoặc ba bản viết lại chính đã tạo ra phiên bản 178 byte tương đối duyên dáng này. (Mặc dù sắp xếp thời gian tuyến tính chỉ là 40 byte.)
>+>>>>>,[>+>>,]>+[--[+<<<-]<[[<+>-]<[<[->[<<<+>>>>+<-]<<[>>+>[->]<<[<]
<-]>]>>>+<[[-]<[>+<-]<]>[[>>>]+<<<-<[<<[<<<]>>+>[>>>]<-]<<[<<<]>[>>[>>
>]<+<<[<<<]>-]]+<<<]]+[->>>]>>]>[brainfuck.org>>>]
Các giá trị đầu vào được đặt cách nhau mỗi ba ô: đối với mỗi ô (V) alue, có một ô abel (L) (được sử dụng để điều hướng) và thêm một ô cho không gian khóa (S). Bố cục tổng thể của mảng là
0 1 0 0 0 SVLSVL ... SVL 0 0 0 0 0 0 ...
Ban đầu tất cả các ô L được đặt thành 1, để đánh dấu các phần của mảng vẫn cần sắp xếp. Khi chúng tôi phân vùng xong một phân đoạn, chúng tôi chia nó thành các phân đoạn nhỏ hơn bằng cách đặt ô L của trục của nó thành 0, sau đó xác định ô L bên phải vẫn là 1 và phân vùng tiếp theo. Điều kỳ lạ, đây là tất cả các sổ sách kế toán mà chúng ta cần để xử lý đúng cách xử lý đệ quy của các tập hợp con. Khi tất cả các ô L đã được zero, toàn bộ mảng được sắp xếp.
Để phân vùng một phân đoạn, chúng ta kéo giá trị ngoài cùng bên phải của nó vào một ô S để đóng vai trò là trục và đưa nó (và ô V trống tương ứng) sang trái, so sánh nó với các giá trị khác trong phân đoạn phụ và hoán đổi khi cần. Cuối cùng, trục được hoán đổi trở lại, sử dụng cùng một mã trao đổi (giúp tiết kiệm 50 byte hoặc hơn). Trong quá trình phân vùng, hai ô L bổ sung được giữ thành 0, để đánh dấu hai ô có thể cần được hoán đổi với nhau; ở cuối phân vùng, 0 bên trái sẽ hợp nhất với 0 ở bên trái của phân đoạn phụ và 0 bên phải sẽ kết thúc đánh dấu trục của nó. Quá trình này cũng để lại thêm 1 trong ô L ở bên phải của phân đoạn; vòng lặp chính bắt đầu và kết thúc tại ô này.
>+>>>>>,[>+>>,]>+[ 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