beyin fırtınası (178 bayt)
Brainfuck hantal olsa bile, dilin tahıl ile çalışmak için yardımcı olur. Kendinize "Bu değeri açıkça bir hücrede depolamak zorunda mıyım?" Daha ince bir şey yaparak sık sık hız ve karar kazanabilirsiniz. Değer bir dizi dizini (veya rastgele bir doğal sayı) olduğunda, bir hücreye sığmayabilir . Tabii ki, bunu programınızın sınırı olarak kabul edebilirsiniz. Ancak, programınızı büyük değerlerle başa çıkacak şekilde tasarlamak, genellikle başka şekillerde daha iyi hale getirecektir.
Her zamanki gibi, ilk çalışan sürümüm olması gerekenden iki katıydı - 392 bayt. Çok sayıda değişiklik ve iki veya üç büyük yeniden yazma, bu nispeten zarif 178 bayt sürümü üretti. (Eğlenceli bir şekilde doğrusal zaman sıralama olsa da , sadece 40 bayttır.)
>+>>>>>,[>+>>,]>+[--[+<<<-]<[[<+>-]<[<[->[<<<+>>>>+<-]<<[>>+>[->]<<[<]
<-]>]>>>+<[[-]<[>+<-]<]>[[>>>]+<<<-<[<<[<<<]>>+>[>>>]<-]<<[<<<]>[>>[>>
>]<+<<[<<<]>-]]+<<<]]+[->>>]>>]>[brainfuck.org>>>]
Giriş değerleri her üç hücreye yerleştirilir: her (V) alue hücresi için, bir (L) abel hücresi (navigasyon için kullanılır) ve (S) kazı alanı için bir hücre daha vardır. Dizinin genel düzeni
0 1 0 0 0 SVLSVL ... SVL 0 0 0 0 0 0 ...
Başlangıçta, tüm L hücreleri, hala sıralanması gereken dizinin kısımlarını işaretlemek için 1'e ayarlanır. Bir alt diziyi bölmeyi bitirdiğimizde, pivotunun L hücresini 0'a ayarlayarak daha küçük alt dizilere böler, sonra hala 1 olan en sağdaki L hücresini ve sonradan alt diziyi bölen bölümü buluruz. İşin garibi, alt kayıtların özyinelemeli işlemlerini düzgün bir şekilde yapmamız için gereken tüm kayıt tutma işlemleri budur. Tüm L hücreleri sıfırlandığında, tüm dizi sıralanır.
Bir alt diziyi bölmek için, en sağdaki değeri, Pivot gibi davranmak için bir S hücresine çekeriz ve onu (ve buna karşılık gelen boş V hücresini), alt dizideki diğer değerlerle karşılaştırarak ve gerektiğinde değiştiririz. Sonunda, pivot aynı takas kodunu kullanarak (50 byte tasarruf sağlayan) tekrar takılır. Bölünme sırasında, birbiriyle değiştirilmesi gerekebilecek iki hücreyi işaretlemek için iki ekstra L hücresi 0 olarak tutulur; bölümlemenin sonunda, sol 0, alt dizinin solundaki 0 ile birleşir ve sağ 0, dönme noktasını işaretleyerek sona erer. Bu işlem ayrıca, L hücresinde, alt dizinin sağına ekstra 1 bırakır; ana döngü bu hücrede başlar ve biter.
>+>>>>>,[>+>>,]>+[ 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