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.Jawaban:
Perl, 333
Berikut adalah upaya untuk mengoptimalkan aturan # 2. Setelah komentar saya, di atas, dan sebagai pengganti jawaban yang memperhitungkan aturan itu (lih. Pertanyaan tingkat tinggi), saya berpikir bahwa saya berutang usaha di sini ...
Solusi yang tidak dioptimalkan untuk aturan # 2 dapat menghasilkan output yang sangat jauh dari optimal. Saya memeriksa teks bahasa Inggris alami yang panjang ("Alice in Wonderland", sebenarnya), pra-diproses (hanya huruf kecil), dan misalnya skrip Perl dari jawaban OJW, hasilnya adalah
er
sendirian reruntuhan itu, ditambah beberapa pasangan lain seharusnya tidak pernah berakhir pada kunci yang sama ...Btw,
zxqjvkbpfmygwculdrshnioate
adalah huruf yang diurutkan, frekuensi naik, dari teks itu.Jika kita mencoba menyelesaikannya dengan cara mudah (berharap untuk -35 bonus, mungkin) dan menempatkan huruf satu per satu, memilih kunci yang tersedia dengan jumlah pasangan minimal, kita dapat mengakhiri dengan misalnya:
Saya tidak memposting kode untuk solusi (salah) ini di sini. Misalnya, perhatikan,
c
lebih sering daripadaw
dan ditempatkan terlebih dahulu.tc
(ct
) pasangan jelas lebih jarang dariac
(ca
) - 43 + 235 melawan 202 + 355. Tapi kemudianw
berakhir dengana
- 598 + 88. Kita berakhir dengan pasanganaw
dantc
(total 964), meskipun akan lebih baikac
dantw
(total 635). Dll ..Jadi, algoritma berikutnya mencoba untuk memeriksa masing-masing 8 huruf yang tersisa (atau 2, jika terakhir) paling sering terhadap huruf yang sudah ada di keypad, dan untuk menempatkannya sehingga jumlah pasangan menjadi minimal.
Hasilnya adalah:
Saya tidak suka
ac
pasangan (Kucing menjadi salah satu karakter, setelah semua), tapi tetap penempatan huruf yang optimal untuk bahasa Inggris, jika kode saya tidak salah. Bukan upaya 'bermain golf', hanya beberapa solusi kerja, jelek atau tidak.sumber
Python3, saatnya Montecarlo!
Untuk mengatasi masalah ini, pertama-tama saya menghitung berapa "klik" yang Anda butuhkan dengan keyboard default (awal:)
abc,def,ghi,jkl,mno,pqrs,tuv,wxyz
. Kemudian saya memodifikasi keyboard ini dan melihat apakah lebih murah (teks ditulis dengan lebih sedikit klik). Jika keyboard ini lebih murah, maka itu menjadi yang default. Saya mengulangi proses1M
kali ini.Untuk mengubah keyboard, pertama-tama saya memutuskan berapa banyak perubahan yang harus dilakukan (jumlah maksimum perubahan adalah jumlah total huruf di keyboard). Kemudian, untuk setiap saklar, saya memilih dua tombol dan dua posisi dan saya mentransfer karakter dari posisi pertama ke yang kedua.
Jumlah maksimum sakelar per waktu adalah jumlah huruf di keyboard karena itu adalah jumlah minimum perubahan yang Anda perlukan untuk beralih dari dua keyboard lengkap yang berbeda. (Saya ingin selalu memungkinkan untuk beralih dari satu keyboard ke keyboard lainnya)
Output dari
echo "jackdawslovemybigsphinxofquartz" | python .\myscript.py
adalah:Di mana
61
jumlah tombol ditekan untuk menulis pesan yang diberikan.Karakter (tanpa spasi dan tidak ada komentar): 577
Saya tahu ini panjang tapi saya benar-benar baru dalam hal ini.
Saya merasa sangat lucu sehingga saya memutuskan untuk mencoba algoritma ini dengan LO HOBBIT (saya punya salinan asli di rumah juga!). Ini memiliki
383964
huruf dan ini adalah klik pasangan vs keypad yang saya temukan:Jadi saya mengklaim yang terakhir ini adalah salah satu tombol paling praktis (dalam hal klik).
sumber
Nah, jika Anda hanya ingin karakter paling populer yang ditugaskan ke tempat sampah 2-9, Perl dapat melakukannya dalam 127 karakter ...
memberikan sesuatu seperti:
Atau cetak semuanya dalam satu baris, hapus 12 karakter:
sumber
$x{$_}++for split/\s*/,<>;map$o{$n++%8}.=$_,sort{$x{$b}<=>$x{$a}}keys%x;print map"$_:".$o{$_-2},2..9
Haskell, 160 - 35 = 125
Contoh:
Orang mungkin berpendapat bahwa ini tidak mengoptimalkan untuk aturan 2, tetapi itu memang paling sering menempatkan huruf pada tombol yang berbeda .
sumber
JavaScript, 192 - 35 = 157
Hanya memperhatikan aturan karakter yang berulang; ini tidak memperhitungkannya. Tetapi seperti yang dicatat oleh @mniip dalam jawabannya:
Ini mungkin berada di Ruby, tapi saya tidak di rumah dan dipaksa untuk menggunakan Internet Explorer (eww). Tapi hei, kadang-kadang menyenangkan menggunakan bahasa yang mengerikan di golf ke golf! ;)
Output sampel (untuk input Anda):
Karena JS tidak memiliki STDIN, program mengasumsikan bahwa input disimpan dalam variabel
s
.sumber
'abcdefghia'
tidak sepenuhnya optimal.'azbcdefghizjklmnopqzrstuvwxyz'
b=['','','','','','','','']
keb=[x='',x,x,x,x,x,x,x]
,s.split('')
ke ,s.split(x)
dano[x]=o[x]?o[x]+1:1
keo[x]=-~o[x]
.Python (119-35 = 84):
Mengasumsikan string adalah variabel a, dan hanya berisi huruf kecil:
ungolfed:
PYG (76-35 = 41):
Aaah, kita bisa menjatuhkan impor enourmous. Sekali lagi, ini mengasumsikan string yang dilucuti dalam a.
sumber