Olarak yassı sıralama sadece izin verilen işlem dizisinin bir ön ek elemanlarını değiştirmektir. Veya bir yığın krep düşünün: Bir yığın spatulayı bir yere yerleştiririz ve tüm krepleri spatülün üstünden çeviririz.
Örneğin, 6 5 4 1 2 3
ilk önce ilk 6
elemanlar (tüm dizi) 3 2 1 4 5 6
çevrilerek, ara sonuç elde edilerek ve sonra 3
gelen ilk elemanlar çevrilerek sıralanabilir 1 2 3 4 5 6
.
Sadece bir işlem olduğu için, bütün sıralama süreci, bir tam sayı dizisi ile tanımlanabilir, burada her bir tam sayı, pr çevirisini içerecek eleman / krep sayısıdır. Yukarıdaki örnek için, sıralama sırası olacaktır 6 3
.
Başka bir örnek: 4 2 3 1
ile sıralanabilir 4 2 3 2
. İşte ara sonuçlar:
4 2 3 1
flip 4: 1 3 2 4
flip 2: 3 1 2 4
flip 3: 2 1 3 4
flip 2: 1 2 3 4
Görev:
Tamsayıların listesini alan ve geçerli bir krep sıralama dizisi basan bir program yazın.
Sıralanacak liste, stdin'den boşlukla ayrılmış bir liste veya komut satırı argümanları olabilir. Listeyi yazdırın, ancak biraz okunabilir olduğu sürece uygun.
Bu kodgolf!
Düzenle:
Yorumlarda söylediğim gibi , çıktıyı optimize etmeniz gerekmez (en kısa sırayı bulmak NP-zordur ). Bununla birlikte , ucuz bir çözümün istediğiniz sonucu ([yeni?] Bir bogosort türü) elde edene kadar rasgele sayılar atmak olacağını fark ettim. Şimdiye kadarki cevapların hiçbiri bunu yapmadı , bu yüzden şimdi algoritmanızın herhangi bir (sözde) rastgeleliğe güvenmemesi gerektiğini ilan ediyorum .
Hepiniz tekmelemekle birlikte, Ruby 2.0'da (60 karakter) bir bogopancakesort çeşidi var.
a=$*.map &:to_i
a=a[0,p(v=rand(a.size)+1)].reverse+a[v..-1]while a!=a.sort
4 3 2 1
bunun yerine gösterir4 2 3 1