Saya memiliki setumpuk kaus kaki bersih yang ingin saya pisahkan menjadi pasangan. Sayangnya, saya hanya bisa mengambil kaus kaki dari kedua ujung tumpukan, bukan di tengah. Lebih lanjut, saya hanya dapat menghapus kaus kaki dari tumpukan pasangan yang serentak. Strategi saya adalah pertama membagi tumpukan menjadi satu atau lebih tumpukan yang lebih kecil. Saya pikir beberapa contoh akan memperjelas ini. Saya akan mewakili setiap kaus kaki sebagai bilangan bulat positif (bilangan bulat yang cocok menunjukkan kaus kaki yang sama).
Jika tumpukan kaus kaki awal adalah
1 2 3 3 2 1
maka saya tidak perlu melakukan pemisahan. Saya bisa menghapus kedua 1
kaus kaki, lalu kedua 2
kaus kaki, lalu kedua 3
kaus kaki.
Jika bukan tumpukan awal adalah
1 2 3 2 3 1
maka saya harus membaginya terlebih dahulu karena saya tidak akan bisa memasangkan semua kaus kaki hanya dengan melepasnya dari ujungnya. Satu kemungkinan adalah membaginya menjadi dua tumpukan
1 2 3 and 2 3 1
Sekarang saya bisa melepas 1
kaus kaki, pergi 2 3 and 2 3
, diikuti 3
kaus kaki, pergi 2 and 2
, dan akhirnya 2
kaus kaki.
Pekerjaan Anda
Mengingat tumpukan kaus kaki awal, tulis sebuah program yang akan membaginya menjadi tumpukan yang lebih kecil yang memungkinkan saya untuk menyortir kaus kaki. Program Anda harus membagi tumpukan menjadi jumlah tiang paling sedikit yang mungkin (jika ada beberapa solusi terbaik, Anda hanya perlu menemukan satu).
Input akan diberikan sebagai daftar, string yang dibatasi, atau bentuk lain yang sesuai. Ini hanya akan berisi bilangan bulat antara 1
dan beberapa nilai maksimum n
, dengan setiap bilangan bulat terjadi tepat dua kali.
Output harus terdiri dari daftar input yang dipecah menjadi daftar yang lebih kecil, diberikan dalam bentuk apa pun yang mudah.
Contohnya
Input Sample Output
1 1 1 1
1 2 1 2 1; 2 1 2
1 3 2 4 3 2 1 4 1 3 2; 4 3 2 1 4
1 2 3 4 3 4 1 2 1; 2 3; 4 3 4 1 2
1 1 2 2 3 3 1 1 2; 2 3 3
4 3 4 2 2 1 1 3 4 3 4 2; 2 1 1 3
Perhatikan bahwa ini bukan satu-satunya output yang diizinkan untuk sebagian besar input ini. Untuk kasus kedua, misalnya, output 1 2; 1 2
atau1 2 1; 2
juga akan diterima.
Terima kasih kepada Sp3000 untuk beberapa saran pengujian!
Saya benci menghabiskan waktu lama menyortir pakaian saya, jadi buat kode Anda sesingkat mungkin. Jawaban terpendek dalam byte menang!
Catatan
- Saya tidak ingin harus melihat ke belakang kaus kaki untuk melihat apakah ada pasangan yang cocok, jadi mengambil kedua kaus kaki dengan sepasang dari ujung yang sama tidak diperbolehkan. Misalnya jika tumpukan itu
1 1 2 2
maka Anda tidak akan dapat meninggalkannya sebagai satu tumpukan dan mengambil kedua1
kaus kaki dari ujung kiri.
123213
bisa dipecah menjadi1; 23; 213
(1; 23; 213
->1; 2; 21
->; 2; 2
)?123213
hanya menggunakan dua tumpukan, jawaban Anda harus memberikan satu dari dua tumpukan tumpukan.Jawaban:
Pyth, 25 byte
Suite uji
Penjelasan:
sumber
JavaScript (ES6), 329
Bukan tugas yang mudah untuk bahasa yang tidak memiliki kombinatorik bawaan.
Mungkin golf lebih ringan.
Catatan: semua partisi setidaknya berukuran 2, karena partisi dengan elemen tunggal selalu kurang bermanfaat.
Penjelasan dalam bagian-bagian
(Ini terlalu bertele-tele, tapi saya merasa sulit untuk menjelaskan - akhirnya melompat ke "menyatukan semuanya")
Fungsi rekursif untuk menghitung semua kemungkinan pemisahan array
Sekarang, saya perlu partisi dengan ukuran 2 atau lebih, jadi saya harus menggunakan fungsi ini dengan parameter sligtly berbeda. Parameter v adalah "ukuran array - jumlah partisi yang diinginkan - 1". Maka saya harus membangun partisi dengan cara yang sedikit berbeda.
Jadi, saya dapat menyebutkan daftar partisi tanpa split, 1 split, 2 splits dan sebagainya. Ketika saya menemukan partisi yang berfungsi, saya akan berhenti dan menampilkan hasil yang ditemukan.
Untuk memeriksa, memindai daftar partisi, catat nilainya pada awal dan akhir dari masing-masing, jika menemukan nilai yang direplikasi kemudian hapus. Ulangi sampai tidak ada yang bisa dihapus, akhirnya: jika semua pasangan dihapus maka partisi ini baik.
Kemudian, bagian yang hilang hanyalah loop caling fungsi G yang meningkatkan jumlah partisi. Loop keluar saat hasilnya ditemukan.
Kumpulkan semuanya
Uji
sumber