Tampaknya ada kegemaran yang sedang berlangsung tentang orang-orang yang dengan susah payah mempelajari tata letak keyboard baru seperti Dvorak atau Neo karena itu seharusnya membuat mereka lebih produktif. Saya berpendapat bahwa mengganti tata letak keyboard adalah ide yang buruk, karena itu bisa memakan waktu berbulan-bulan untuk mempercepat, dan ketika Anda akhirnya 5% lebih cepat daripada yang lain, Anda kacau jika Anda perlu mengetik pada komputer yang tidak milikmu sendiri.
Juga, semua orang ini lupa di mana hambatan sebenarnya dalam komunikasi modern terletak - tombol telepon.
Beginilah tampilan keypad telepon rata-rata Anda:
Huruf 'r' adalah huruf ketiga pada tombol 7; jadi jika Anda mengetik huruf 'r' di ponsel, Anda akan menekan tombol 7 tiga kali, untuk 's Anda akan menekannya 4 kali, dan untuk' a 'Anda akan menekan tombol 2 sekali.
Mempertimbangkan hal ini, menempatkan 'e' setelah 'd' mungkin merupakan keputusan yang buruk - 'e' adalah huruf yang paling umum digunakan dalam alfabet bahasa Inggris, jadi, jika Anda memberi label tombol 3 "EDF" dan bukan "DEF", Anda akan menghemat cukup banyak penekanan tombol.
Selain itu, Anda mungkin pernah mengalami sendiri bahwa mengetik 2 huruf yang menggunakan tombol yang sama adalah gangguan - jika Anda ingin menulis "TU", Anda tidak bisa menekan 8 tiga kali, karena itu akan menghasilkan 'V'. Jadi biasanya Anda akan menulis 'T', lalu tekan spasi, lalu tekan backspace, dan kemudian menulis 'U', yang sama dengan 5 penekanan tombol, bukan 3.
TL; DR
Diberikan dua aturan ini:
- Sebuah huruf diketik dengan menekan tombol n kali, di mana n adalah posisi di mana huruf berada pada label tombol
- Menulis dua huruf yang diketik menggunakan tombol yang sama membutuhkan tambahan menekan 2 tombol
Apa tata letak keyboard telepon yang membutuhkan paling sedikit penekanan tombol, mengingat teks tertentu? Anda hanya harus menggunakan tombol 2-9, 1 dan 0 yang dicadangkan untuk simbol khusus.
Memasukkan
Teks yang Anda harus temukan tata letaknya yang optimal disediakan melalui stdin. Anda tidak perlu menangani apa pun selain huruf kecil dan dapat mengasumsikan bahwa input hanya terdiri dari itu. Anda juga dapat mengasumsikan bahwa teks input cukup besar dan setiap huruf ada di sana setidaknya satu kali, jika itu membantu.
Keluaran
Saya tidak ingin menempatkan terlalu banyak kendala pada output, karena kadang-kadang memberikan beberapa keunggulan bahasa daripada yang lain; jadi bagaimanapun bahasa Anda menunjukkan array baik-baik saja, atau Anda dapat memisahkan setiap label dengan baris baru.
Mungkin ada beberapa kemungkinan tata letak optimal, Anda dapat mencetak salah satunya. Berikut ini contoh sederhana:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Poin Bonus
-35 jika algoritma Anda tidak memaksa semua tata letak yang mungkin (Saya melihat `permutasi 'Haskell di sini)
-3 jika kode Anda pas di dalam pesan teks (140 karakter) dan Anda memposting gambar yang Anda kirim kode ke teman.
Ini adalah tantangan pertama saya di StackExchange. Saya akan senang mendengar apakah Anda menyukainya, atau ada tanggapan lain tentang itu!
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
permutasi unik, menghitung penataan ulang kunci hanya sekali saja.