мозковий ебать (178 байт)
Навіть якщо мозковий ебать громіздкий, це допомагає працювати з зерном мови. Запитайте себе "Чи потрібно явно зберігати це значення у комірці?" Ви можете часто набирати швидкості та чіткості, роблячи щось більш тонке. І коли значення є індексом масиву (або довільним натуральним числом), воно не може вміщуватися в комірці. Звичайно, ви можете просто прийняти це як обмеження вашої програми. Але проектування вашої програми для обробки великих значень часто покращує її іншими способами.
Як завжди, моя перша робоча версія була вдвічі довшою, ніж мала бути - 392 байти. Численні модифікації та два-три основні переписування створили цю порівняно витончену 178-байтну версію. (Хоча кумедно сортування лінійного часу становить лише 40 байт.)
>+>>>>>,[>+>>,]>+[--[+<<<-]<[[<+>-]<[<[->[<<<+>>>>+<-]<<[>>+>[->]<<[<]
<-]>]>>>+<[[-]<[>+<-]<]>[[>>>]+<<<-<[<<[<<<]>>+>[>>>]<-]<<[<<<]>[>>[>>
>]<+<<[<<<]>-]]+<<<]]+[->>>]>>]>[brainfuck.org>>>]
Вхідні значення розміщені кожні три комірки: для кожної клітинки (V) алью є (L) клітина абеля (використовується для навігації) та ще одна комірка для (S) місця стискання. Загальний макет масиву є
0 1 0 0 0 SVLSVL ... SVL 0 0 0 0 0 0 ...
Спочатку всі клітинки L встановлюються на 1, щоб позначити частини масиву, які ще потребують сортування. Коли ми закінчимо розділення підмагістралі, ми розділимо його на менші підматриці, встановивши L-комірку його обертання на 0, а потім знайдемо крайню праву клітинку L, яка досі є 1, і розділимо цей підмасив наступним. Як не дивно, це все те, що нам потрібно, щоб правильно обробити рекурсивну обробку підрисів. Коли всі L комірки були нульовими, весь масив сортується.
Щоб розділити підмасив, ми втягуємо його найправіше значення у S-комірку, щоб вона діяла як зведена, і приводимо її (та відповідну порожню V-комірку) вліво, порівнюючи її між собою в підрядному масиві та замінюючи за необхідності. Зрештою, зворотний шар повертається назад, використовуючи той самий код підкачки (який зберігає 50 байт або близько того). Під час розподілу дві додаткові клітинки L утримуються на 0, щоб позначити дві клітини, які, можливо, потрібно буде поміняти один з одним; наприкінці розбиття лівий 0 зливається з 0 ліворуч від підмагістралі, а правий 0 закінчується позначенням його стрижня. Цей процес також залишає додатковий 1 в L-клітці праворуч від підмагістралі; основна петля починається і закінчується в цій комірці.
>+>>>>>,[>+>>,]>+[ 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