Katakanlah Anda memiliki daftar kata dan Anda ingin dapat menggunakan kartu surat untuk mengeja setiap kata. Misalnya, untuk mengeja kucing , Anda akan menggunakan tiga kartu berlabel C, A, T.
Dengan asumsi setiap kartu memiliki dua sisi , kirimkan program untuk menentukan jumlah kartu minimum yang dapat digunakan untuk mengeja seluruh daftar kata.
Input adalah daftar kata, bisa berbasis file, kode keras, baris perintah, apa pun. Output adalah daftar kartu, diformat dan dipesan sesuai keinginan Anda, asalkan jelas bagaimana kartu diberi label.
Kasus tidak signifikan: Golf, golf, dan GOLF setara.
Beberapa petunjuk:
- jumlah kartu bisa tidak kurang dari panjang kata terlama
- tidak masuk akal jika kartu memiliki huruf yang sama di kedua sisi
- sementara kasus tidak signifikan, sarankan huruf kecil untuk memanfaatkan simetri tertentu
Contohnya, ini memanfaatkan simetri tertentu :
Input: ben, rawa, kutu, bug, do, doe, dog, due, dug, Ed, end, gob, Dewa, Ned, ode, pena, Poe, pug
Output: b / d, e / g, o / n
Input: an, dan, kera, adalah, tempat, tempat tidur, kuncup, bur, Dan, Deb, pangkat, telinga, Ed, era, tidur siang, panci, kacang polong, pub, Rae, berlari, gosok
Output: a / b, d / r, e / n
Menjadikannya sebuah kontes popularitas, jadi keanggunan kode, kinerja run-time, dan kepintaran (termasuk aturan-bending & celah) adalah penting!
Tambahan : Beberapa orang bertanya tentang simetri "diizinkan", apakah font khusus dapat digunakan, dan apakah kartu dapat dilipat.
Simetri yang dibolehkan adalah huruf apa saja yang terlihat mirip satu sama lain setelah 0, 90, 180 atau 270 derajat rotasi. Ini termasuk b / q, d / p dan n / u. Saya juga akan mengatakan M / W, Z / N, dan tentu saja I / l (huruf kapital i, huruf kecil L). Saya mungkin menggaruk permukaan, jadi jika ada orang lain yang Anda tidak yakin, tanyakan saja.
Untuk membuatnya tetap sederhana, harap batasi ke font sans-serif standar, misalnya yang digunakan dalam SE.
Sejauh melipat, sementara Anda dapat melakukan beberapa pergantian yang luar biasa, misalnya B dapat menjadi D, E, F, I, P, atau R, dan mungkin C atau L jika Anda melipat dengan sangat kreatif, saya pikir itu menekuk, secara harfiah, terlalu banyak !
Saya menemukan masalah ini saat bermain dengan beberapa kartu yang serupa dengan anak-anak saya. Saya mencatat betapa mudahnya memunculkan kartu satu sisi vs. betapa sulitnya membuat kartu dua sisi.
Tambahan : Telah memberikan hadiah untuk diberikan ke jawaban paling populer. Jika ada dasi, akan diberikan kepada orang yang mengajukan terlebih dahulu.
Petunjuk lain:
- menyelesaikan masalah satu sisi akan memberi Anda gambaran tentang jumlah minimum kartu yang dibutuhkan (mis. 20 kartu satu sisi diterjemahkan menjadi setidaknya 10 kartu sisi ganda yang dibutuhkan)
Tambahan : Oh repot, saya sibuk dan lupa tentang hadiah kadaluarsa. Akhirnya tidak ada seorang pun karena satu-satunya jawaban diajukan sebelum hadiah dimulai! Maaf soal itu.
n/u
,d/p
? Bagaimana denganb/q
danm/w
? Dan bagaimana jika saya melipatP
kartu menjadi dua sehingga bagian atas menjadiD
?Jawaban:
C # - CardChooser
Ringkasan
Aplikasi ini menggunakan metode brute force untuk mencoba menyelesaikan setiap daftar. Pertama-tama saya membuat daftar kartu potensial untuk dipilih, kemudian saya menentukan mana yang paling cocok (menghilangkan karakter paling banyak + mempersingkat kata paling panjang), menambahkan ini ke daftar hasil dan melanjutkan dengan proses ini sampai saya telah memilih kartu potensial yang cukup untuk menghapus setiap kata dalam daftar, maka saya mengirim ulang kartu-kartu itu ke setiap kata dan mencetak hasilnya.
Jika Anda ingin melihat versi yang lebih terbatas dari kode ini tanpa mengunduh dan membuat aplikasi formulir windows yang disediakan, Anda dapat menggunakan tautan yang disediakan untuk menjalankan program saya pada kumpulan data yang lebih kecil, harap dicatat bahwa ini adalah versi aplikasi konsol sehingga hasilnya kartu TIDAK diputar: http://ideone.com/fork/VD1gJF
Riwayat Revisi
Saat Ini - Menambahkan optimasi hasil yang lebih baik disarankan oleh @Zgarb
Perbarui 3 - Lebih banyak pembersihan kode, lebih banyak bug diperbaiki, hasil lebih baik
Pembaruan 2 - Formulir Windows, Lebih banyak keluaran verbose
Pembaruan 1 - Dukungan Baru / Lebih Baik untuk simetri karakter
Asli - Aplikasi Konsol
Contohnya
ACR, buritan, ain, sll, menang, katakan, kata, cepat, epik
dia, akan, dengan, tidak, akan, mau, tidak, belum, kamu, kamu, kamu akan
aaaa, bbbb, cccc
Kode
Saya masih perlu menggabungkan ini menjadi satu proyek yang lebih besar dengan kode ConsoleApp dan WindowsForms semua berbagi kelas dan metode yang sama, kemudian membagi daerah yang berbeda dalam metode RunButton_Click sehingga saya dapat menulis unit di sekitar mereka, tetap setiap kali saya menemukan waktu untuk melakukan itu Saya akan, karena sekarang inilah yang saya miliki:
sumber
i
kartu?said
Surat terakhir bukan W atau p