Blokir jenis acak
The blok mengocok semacam adalah metode (bukan buatan) menyortir daftar. Ini berfungsi sebagai berikut, diilustrasikan oleh sebuah contoh.
[6, 1, 0, 3, 2, 4, -2, -1]
Break list into contiguous blocks
[6][1, 0][3, 2, 4][-2, -1]
Sort each block
[6][0, 1][2, 3, 4][-2, -1]
Sort blocks lexicographically
[-2, -1][0, 1][2, 3, 4][6]
Concatenate
[-2, -1, 0, 1, 2, 3, 4, 6]
Partisi menjadi blok yang berdekatan dapat dipilih secara sewenang-wenang. Namun, tidak semua pilihan blok akan menghasilkan daftar yang diurutkan di akhir:
[6, 1, 0, 3, 2, 4, -2, -1]
[6, 1, 0][3, 2, 4][-2, -1]
[0, 1, 6][2, 3, 4][-2, -1]
[-2, -1][0, 1, 6][2, 3, 4]
[-2, -1, 0, 1, 6, 2, 3, 4]
Jika semua blok memiliki panjang 1, atau jika hanya ada satu blok, maka hasilnya tentu saja akan diurutkan. Tetapi ini adalah kasus yang agak ekstrim. Dalam tantangan ini, tugas Anda adalah menemukan keseimbangan antara jumlah blok dan panjang maksimum blok.
Tugas
Masukan Anda adalah daftar kosong dari bilangan bulat L , yang diambil dalam format apa pun yang masuk akal. Output Anda harus bilangan bulat terkecil N sehingga L dapat blok mengocok diurutkan sehingga jumlah blok dan panjang masing-masing blok yang paling N .
Hitungan byte terendah di setiap bahasa menang. Aturan standar kode-golf berlaku.
Uji kasus
[5] -> 1
[1,2] -> 2
[0,2,1,-1] -> 3
[-1,0,2,1] -> 2
[9,3,8,2,7] -> 4
[9,2,8,3,7] -> 3
[5,9,3,7,2,4,8] -> 7
[-1,-2,1,2,-1,-2,7] -> 4
[6,1,0,3,2,4,-2,-1] -> 4
[12,5,6,-6,-1,0,2,3] -> 3
[1,0,1,0,1,0,1,0,1,0] -> 6
[1,2,1,3,1,2,3,2,4,3] -> 5
[7,7,7,7,8,9,7,7,7,7] -> 4
Brachylog , 17 byte
Cobalah online!
Penjelasan
Ini adalah jawaban sendiri; Saya merancang tantangan ini dengan mempertimbangkan Brachylog dan menemukan gagasan
~c₎{…}ᵈ
yang menarik.Built-in
c
menyatukan daftar daftar. Jika diberi subskripN
, ia membutuhkan jumlah daftarN
. Simbol₎
memodifikasi built-in untuk mengambil pasangan sebagai input dan menggunakan elemen kanannya sebagai subskrip. Dengan demikianc₎
mengambil pasangan[L,N]
, mensyaratkan bahwa jumlah daftar diL
adalahN
, dan mengembalikan rangkaianL
. Ketika dijalankan secara terbalik,~c₎
ambil daftarL
dan kembalikan pasangan[P,N]
, di manaP
ada partisiL
menjadiN
blok. Mereka disebutkan dalam urutan meningkatN
.Metapredicate
ᵈ
mengubah predikat biasa menjadi yang memeriksa hubungan antara dua elemen pasangan. Secara lebih eksplisit,{…}ᵈ
dibutuhkan pasangan[A,B]
, cek yangA{…}B
menahan, dan keluaranB
. Saya menggunakannya untuk memverifikasi yangP
dapat diurutkan-blok dan hanya berisi daftar panjang paling banyakN
.Catatan yang
P
mungkin berisi daftar kosong. Ini memastikan kebenaran juga dalam kasus-kasus di mana panjang maksimal blok lebih besar dari jumlah blok.sumber
Python 2 ,
186146 byteCobalah online!
Fungsi kedua diambil dari tip ini oleh feersum .
sumber
Ruby , 158 byte
Cobalah online!
sumber
Pyth ,
24 2320 byteSuite uji.
Bagaimana itu bekerja
sumber
APL (Dyalog Classic) ,
7167 byte⎕IO
harus0
Cobalah online!
Bagaimana?
⌊/
- Temukan minimum ...(⌈/≢,≢¨)
- ... maksimum panjang dan jumlah elemen ...¨
- ... dari setiap elemen ...T/⍨
- ... elemen yang ...{S[⍋S]≡∊⍵[⍋↑⍵]}¨
- ... disortir saat diratakan, dari ...T←{⍵[⍋⍵]}¨¨
- ... elemen yang diurutkan dari elemen ...⊂∘S¨(-≢S)↑¨2⊥⍣¯1¨⍳2*≢S←⍵
- ... partisi argumen (bersama dengan beberapa sampah)sumber