Saya baru-baru ini memiliki masalah untuk dipecahkan di tempat kerja di mana saya memiliki dua daftar: daftar master, dan daftar yang lebih kecil yang berisi subset item dalam daftar master yang berpotensi dalam urutan yang berbeda. Saya perlu menyusun ulang daftar master sedemikian rupa sehingga item dalam subset akan muncul dalam urutan yang sama tanpa mengubah urutan item yang tidak ditemukan dalam daftar dan menyimpan item di lokasi yang sama jika memungkinkan. Oke, itu mungkin terdengar membingungkan, jadi saya akan memecahnya:
- Daftar master mendefinisikan urutan item default.
- Daftar subset mendefinisikan urutan relatif dari item tertentu.
- Jika daftar master memiliki dua elemen yang tidak sesuai dengan daftar subset, item yang sebelumnya dalam daftar master harus dipindahkan ke indeks paling awal di mana ia berada di lokasi yang benar relatif terhadap item lain dalam daftar subset. (Yaitu segera setelah item kemudian)
Tugas Anda adalah mengimplementasikan algoritma pemesanan ulang ini.
Contoh Kasus Uji
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
Aturan
- Celah standar, yadda yadda, I / O yang nyaman, bla bla.
- Meskipun contoh menggunakan angka dan string, Anda hanya perlu mendukung satu jenis elemen, apakah itu bilangan bulat, string, atau apa pun dengan semantik kesetaraan yang terdefinisi dengan baik, termasuk daftar heterogen jika sesuai dengan bahasa Anda.
- Anda dapat mengasumsikan daftar master dan daftar subset tidak mengandung duplikat
- Anda dapat mengasumsikan bahwa semua item yang ditemukan dalam daftar subset ditemukan dalam daftar master
- Daftar mana pun mungkin kosong
- Anda harus, minimal, mendukung array hingga 100 elemen.
- Penataan ulang dapat diimplementasikan di tempat atau melalui pembuatan daftar / larik baru.
Selamat Golf!
code-golf
array-manipulation
Beefster
sumber
sumber
8 1 3 4 5 6 7 2 9 12 11 10
solusi yang valid untuk yang kedua-terakhir?Jawaban:
Retina 0.8.2 , 51 byte
Cobalah online! Mengambil input sebagai daftar subword yang dipisahkan koma pada baris pertama dan daftar kata utama yang dipisahkan koma pada baris kedua. Penjelasan:
Temukan dua subword yang berdekatan di mana kata kedua mendahului yang pertama pada daftar master.
Pindahkan kata kedua yang muncul setelah kata pertama dalam daftar master.
Ulangi sampai tidak ada kata yang keluar dari urutan.
Hapus subtitle.
sumber
JavaScript (ES6),
96 89 7471 byteIni dimulai sebagai kekacauan besar dan akhirnya menyusut ke bentuk yang agak ringkas dan elegan. Saya ingin mengucapkan terima kasih .splice () atas kolaborasi yang bermanfaat untuk yang satu itu. ;)
Mengambil input sebagai
(master)(subset)
. Keluaran dengan memperbarui daftar master.Cobalah online!
Bagaimana?
Berkomentar
sumber
Haskell, 79 byte
Cobalah online!
sumber
Rubi ,
7368 byteCobalah online!
Bagaimana?
a
danb
berisi semua elemenb
, tetapi dalam urutan yang sama seperti yang kita temukana
b
dan di persimpangan secara paralel, segera setelah kita menemukan perbedaan, kita dapat memindahkan satu elemen.a
posisi elemen yang kami temukanb
, kemudian menghapus elemen yang kami temukan di persimpangan, dan kemudian menambahkan sisa a.b
berada di urutan yang benara
sumber
0while
?Python 2 ,
1241091069996 byteCobalah online!
sumber
Perl 6 , 40 byte
Cobalah online!
Blok kode anonim yang mengambil input kari (seperti
f(subList)(masterList)
, dan menemukan permutasi leksografis pertama dari indeks daftar master di mana elemen-elemen dari sub daftar berada dalam urutan yang benar.Secara intuitif, permutasi memuaskan pertama akan meninggalkan elemen yang diurutkan dengan benar dalam urutan asli, sementara memindahkan yang salah menempatkan jarak minimum yang dibutuhkan ke depan untuk memilikinya dalam urutan yang benar, yang menempatkan mereka langsung setelah elemen sebelumnya di subset.
Penjelasan:
sumber
Jelly , 9 byte
Cobalah online! atau Test suite
Tidak efisien, terutama dengan daftar induk yang besar. Menghasilkan semua permutasi yang mungkin, memfilter orang-orang di mana subset berada dalam urutan yang salah, dan kemudian mengembalikan yang pertama.
Penjelasan
sumber
J , 49 byte
Cobalah online!
penjelasan
Kami mengambil subset sebagai arg kiri dan input penuh sebagai kanan.
Kami akan bekerja melalui kode dengan contoh khusus untuk kejelasan:
Ambil infiks kotak ukuran dua dari subset:
memproduksi:
menambahkannya ke input asli, dan membalikkan semuanya:
Kita mendapatkan:
Memecahkan masalah menjadi pengurangan kanan ke kiri di atas. Kita hanya perlu menemukan kata kerja yang tepat untuk dimasukkan
/
antara item.Setiap iterasi pengurangan akan memperbarui kotak paling kanan (input penuh, yang kami transformasikan) sehingga sesuai dengan batasan pemesanan yang diwakili oleh pasangan di sebelah kiri. Ketika pengurangan selesai, input akan menghormati pemesanan subset lengkap.
Jika pemesanan pasangan sama dengan memesan pada input, yang berikut ini akan dievaluasi menjadi 0 dan kami tidak akan melakukan apa pun:
Kalau tidak, akan mengevaluasi ke 1 dan kami akan menerapkan kata kerja di sebelah kiri
^:
yang memindahkan item kiri ke kanan item kanan. Gerakan ini hanyalah permutasi siklik dari semua item antara (dan termasuk) dua elemen yang dimaksud.
J memiliki primitif untuk menerapkan permutasi siklik seperti itu:
dan sisa kata kerja tidak melakukan apa-apa selain memilih indeks yang perlu kita daur:
yang tampaknya lebih lama dari yang seharusnya, tetapi saya tidak dapat golf frase itu lebih jauh.
Akhirnya kami melakukan rebox hasilnya
<@
dan selesai.sumber
Jelly , 24 byte
Cobalah online! atau Test suite
Penjelasan
Tautan diad yang menggunakan subset sebagai kiri dan daftar utama sebagai argumen yang benar. Contoh di bawah menggunakan 9001, 42, 69, 1337, 420, 99, 255 sebagai master dan 69, 9001, 1337 sebagai himpunan bagian.
sumber
C # (Visual C # Interactive Compiler) , 118 byte
Cobalah online!
Memanfaatkan beberapa kelas di
System.Collections.Generic
namespace. Master adalah aList<T>
dan subset adalah aQueue<T>
.sumber