Revolusi berikutnya dalam mengetik di laptop dirilis pada tanggal 1 April 2014 oleh SwiftKey . Namun, saya ingin menjadi orang pertama yang menulis klon nano swiping, tetapi, karena saya tidak dapat menemukan teks gesek yang baik ke perpustakaan teks asli, dan saya tidak bisa menunggu mereka, saya bertanya di sini.
Tugas
Tulis program yang menerima teks gesek dan mengeluarkan teks-nyata yang setara. Contoh:
Input: hgrerhjklo
Output: hello
Ketika pengguna melakukannya:
Contoh lain:
Input: wertyuioiuytrtjklkjhgfd
Output: world
Input: poiuytrtyuioiugrewsasdfgbhnmkijnbg
Output: programming
Input: poiuygfdzxcvhjklkjhgres
Output: puzzles
Input: cvhjioiugfde
Output: code
Input: ghiolkjhgf
Output: golf
Aturan
- Program akan mengambil satu 'kata' yang digesek di atas stdin atau argv
- Huruf pertama dan terakhir dari input yang digesek akan sama dengan huruf pertama dan terakhir dari kata asli
- Anda dapat mengasumsikan pengguna akan membuat garis lurus yang wajar, tetapi Anda dapat menggunakan data sampel untuk memverifikasi ini (saya membuat data sampel, dan saya akan membuat data uji akhir)
- Untuk input yang ambigu, Anda dapat membuat pilih salah satu output, tetapi saya akan mencoba untuk menghapus semua ambiguitas dari data uji
- Kata ini akan ada dalam daftar kata ini (tetapi digesek). Daftar kata akan berada di direktori saat ini, dan dapat dibaca (baris baru dipisahkan, akan dinamai
wordlist
, tidak ada ekstensi). - Babatan hanya akan berisi karakter alfabet huruf kecil
- Gesek dapat berisi karakter yang digandakan, jika pengguna berhenti sebentar pada kunci
- Program harus menampilkan pada stdout (kasus tidak masalah)
- Program harus kembali
0
sebagai kode pengembalian - Anda harus memberikan perintah jalankan, kompilasi perintah (jika perlu), nama dan jalur input mana yang digunakan
- Namun, celah standar berlaku (mereka mungkin tidak membantu)
- Tidak ada perpustakaan non-builtin yang diizinkan
- Lebih disukai solusi deterministik, non-golf / tidak jelas
- Tidak ada penulisan file, jaringan, dll.
- Kode Anda harus berjalan dalam satu detik atau kurang (kode Anda dijalankan sekali per kata)
- Proses penilaian dijalankan pada prosesor Intel i7 Haswell, dengan 4 kode virtual (2 yang nyata), sehingga Anda dapat menggunakan utas jika Anda harus
- Panjang kode maksimum 5000 byte
- Bahasa yang Anda gunakan harus memiliki versi gratis (tidak percobaan) yang tersedia untuk Linux (Arch Linux, jika itu penting)
Kriteria Kemenangan
- Pemenangnya adalah solusi yang paling akurat (diberi skor oleh program kontrol , menggunakan daftar tes yang disediakan)
- Popularitas adalah tie breaker
- Tabel penilaian akan diperbarui setiap beberapa hari
- Time-out dan crash dihitung sebagai gagal
- Tantangan ini akan berjalan selama dua minggu atau lebih, tergantung pada popularitas
- Skor akhir akan menggunakan daftar kata yang berbeda, yang dipilih secara acak (panjang yang sama, dari daftar kata yang sama)
Lain
- Anda dapat menggunakan program kontrol untuk menguji program Anda
- Jika Anda tidak sabar, dan ingin program Anda diperbarui / ditambahkan dengan cepat, mulai masalah atau tarik permintaan di https://github.com/matsjoyce/codegolf-swipe-type/blob/master
- Entri dikelola di https://github.com/matsjoyce/codegolf-swipe-type/blob/master/entries
- Log dari setiap program dijalankan di https://github.com/matsjoyce/codegolf-swipe-type/blob/master/logs
- Log utama di https://github.com/matsjoyce/codegolf-swipe-type/blob/master/log.log
- Posisi setiap kunci akan diberikan sebagai file csv di direktori saat ini disebut
keypos.csv
, dengan nilai x dan y diberikan relatif terhadapQ
(lihat https://github.com/matsjoyce/codegolf-swipe-tipe/blob/master/ keypos.csv ) - Setiap kunci 1,5 x 1,5 cm (unit yang sama seperti di keypos.csv)
Papan Skor Saat Ini
daftar tes ( log ):
Three Pass Optimizer:Errors: 0/250 Fails: 7/250 Passes: 243/250 Timeouts: 0/250
Corner Sim: Errors: 0/250 Fails: 9/250 Passes: 241/250 Timeouts: 0/250
Discrete Fréchet Distance:Errors: 0/250 Fails: 17/250 Passes: 233/250 Timeouts: 0/250
Turnaround: Errors: 0/250 Fails: 18/250 Passes: 232/250 Timeouts: 0/250
Direction Checker: Errors: 0/250 Fails: 19/250 Passes: 231/250 Timeouts: 0/250
Regex Solver: Errors: 0/250 Fails: 63/250 Passes: 187/250 Timeouts: 0/250
Corner Sim: Errors: 0/250 Fails: 10/250 Passes: 240/250 Timeouts: 0/250
Three Pass Optimizer:Errors: 2/250 Fails: 14/250 Passes: 234/250 Timeouts: 0/250
Turnaround: Errors: 0/250 Fails: 16/250 Passes: 234/250 Timeouts: 0/250
Direction Checker: Errors: 0/250 Fails: 17/250 Passes: 233/250 Timeouts: 0/250
Discrete Fréchet Distance:Errors: 0/250 Fails: 18/250 Passes: 232/250 Timeouts: 0/250
Regex Solver: Errors: 0/250 Fails: 67/250 Passes: 183/250 Timeouts: 0/250
Final Run
daftar tes ( log ):
Corner Sim: Errors: 0/250 Fails: 14/250 Passes: 236/250 Timeouts: 0/250
Three Pass Optimizer:Errors: 0/250 Fails: 18/250 Passes: 232/250 Timeouts: 0/250
Direction Checker: Errors: 0/250 Fails: 20/250 Passes: 230/250 Timeouts: 0/250
Turnaround: Errors: 0/250 Fails: 23/250 Passes: 227/250 Timeouts: 0/250
Discrete Fréchet Distance:Errors: 0/250 Fails: 30/250 Passes: 220/250 Timeouts: 0/250
Regex Solver: Errors: 0/250 Fails: 55/250 Passes: 195/250 Timeouts: 0/250
Dilakukan dengan baik untuk semua orang dan hgfdsasdertyuiopoiuy swertyuiopoijnhg!
code-challenge
keyboard
matsjoyce
sumber
sumber
l
, yang tidak dua kali lipat.Jawaban:
JavaScript, ES6, Three Pass Optimizer,
112 187 235 240 241243 dan231234 berlaluFilter tiga lintasan yang pertama kali mengetahui kunci-kunci penting dalam urutan penekanan tombol dan kemudian melewati urutan tersebut melalui tiga filter:
Kode
Kode mengasumsikan variabel yang dipanggil
words
hadir yang merupakan array dari semua kata dari halaman iniLihat kode ini di sini
Lihat kasus uji yang sedang beraksi di sini
Kedua tautan di atas hanya berfungsi pada Firefox terbaru (33 dan lebih tinggi) (karena ES6).
sumber
keypos.csv
file yang tepat sekarang. Fungsi-fungsi IO yang tersedia terdaftar di developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…Ruby, Regex Solver -
30 140 176 180 182187 dan179183 berlaluSaya akan mencari tahu skornya nanti. Berikut ini adalah solusi yang sangat naif yang tidak memperhitungkan tata letak keyboard:
Dibutuhkan input dari ARGV dan mencetak hasilnya. Saya hanya memfilter daftar kata dengan huruf pertama dan terakhir, dan mereka saya mencoba semua kata yang tersisa terhadap input (menghilangkan surat duplikat dan menggunakan regex seperti
^g.*u.*e.*s$
untuk "tebak") dan kembalikan yang pertama jika ada adalah beberapa solusi.Jalankan seperti
Orang lain, silakan gunakan kembali langkah ini sebagai filter pertama - Saya percaya ini tidak akan membuang kata-kata yang benar, sehingga pemeriksaan pendahuluan ini dapat sangat mengurangi ruang pencarian untuk algoritma yang lebih baik.
Sunting: Mengikuti saran OP, saya sekarang memilih kandidat terpanjang, yang tampaknya menjadi heuristik yang layak.
Juga terima kasih kepada es1024 untuk mengingatkan saya tentang surat duplikat.
sumber
paradoxically
, karenal
hanya akan muncul sekali dalam input, daripada dua kali seperti yang diminta oleh regex.C ++, Discret Fréchet Distance -
201220222232 dan 232 berlaluBagi saya, masalah ini sangat membutuhkan Fréchet Distance yang sayangnya sangat sulit untuk dihitung.
Hanya untuk bersenang-senang, saya sudah mencoba untuk mendekati masalah dengan menerapkan pendekatan diskrit yang dijelaskan oleh Thomas Eiter dan Heikki Mannila dalam Computing Discrete Fréchet Distance (1994).
Pada awalnya, saya menggunakan pendekatan yang sama dengan yang lain untuk memfilter semua kata dalam daftar yang merupakan input berikutnya (juga akuntansi untuk beberapa kejadian berurutan dengan karakter yang sama). Lalu, saya mengisi kurva poligon dari huruf ke huruf setiap kata dengan titik tengah dan mencocokkannya dengan kurva input. Akhirnya, saya membagi setiap jarak dengan panjang kata dan mengambil skor minimum.
Sejauh ini, metode ini tidak berfungsi dengan baik seperti yang saya harapkan (Ia mengenali contoh kode sebagai "chide"), tetapi ini bisa saja hasil dari bug yang belum saya temukan. Selain itu, ide lain adalah menggunakan variasi lain dari jarak fréchet ("rata-rata" dan bukan "panjang tali anjing maksimum").
Sunting: Sekarang, saya menggunakan perkiraan untuk "panjang tali anjing rata-rata". Ini berarti bahwa saya menemukan pemetaan terurut antara kedua jalur yang meminimalkan jumlah semua jarak dan kemudian membaginya dengan jumlah jarak.
Jika karakter yang sama muncul dua kali atau lebih sering dalam kata kamus, saya hanya meletakkan satu simpul di jalur.
Saya telah mengkompilasi kode dengan dentang, tetapi
g++ ./thiscode.cpp -o ./thiscode
juga harus berfungsi dengan baik.sumber
programmijng
- itu memberi sayapang
.programming
seperti yang seharusnya. Bisakah Anda batalkan komentar pada garis// cout << thispair->first << ": " << score << endl;
dan tempel skor yang dihasilkan?Python 2, Turnarounds,
224 226 230232 dan230234 berlaluIni adalah pendekatan yang sangat mudah:
Jalankan sebagai
Solusinya tidak terlalu kuat. Satu penekanan tombol yang salah akan membuatnya gagal. Namun, karena serangkaian kasus uji memiliki
sangat sedikitkesalahan ejaan, kinerjanya cukup baik, hanya menjadi bingung dalam beberapa kasus di mana ia mengambil kata-kata yang terlalu panjang.Sunting: Saya mengubahnya sedikit untuk tidak menggunakan file posisi kunci yang disediakan tetapi tata letak yang disederhanakan. Ini membuatnya lebih mudah untuk algoritma saya karena dalam file kunci tidak spasi secara merata. Saya dapat mencapai hasil yang sedikit lebih baik dengan memasukkan beberapa penghambat ad-hoc untuk kasus-kasus yang ambigu, tetapi itu akan terlalu mengoptimalkan untuk set tes khusus ini. Beberapa gagal tetap yang sebenarnya tidak ambigu tetapi saya tidak menangkap dengan algoritma sederhana saya karena hanya mempertimbangkan perubahan arah lebih dari 90 derajat.
sumber
brats
bisa jadi'bgrdsasdrtrds'
yang tidak bisa dikacaukanbreasts
. Namun, saya juga tidak akan keberatan jika Anda membiarkannya apa adanya.PHP, Direction Checker,
203 213 216 229231 dan229233 lolosIni dimulai dengan melewati kamus untuk mendapatkan daftar kata-kata yang semua suratnya ada di input (apa yang Martin lakukan di sini ), dan juga hanya memeriksa
l.*
alih - alihl.*l.*
kapanl
digandakan.Kata terpanjang di sini kemudian disimpan dalam variabel.
Pemeriksaan lain kemudian dilakukan, berdasarkan pada tombol di titik-titik di mana gesekan mengubah arah (+ / 0 ke - atau - / 0 ke +, dalam x atau y). Daftar kata-kata yang mungkin diperiksa terhadap daftar karakter ini, dan kata-kata yang tidak cocok dihilangkan. Pendekatan ini bergantung pada tikungan tajam dalam menggesek untuk menjadi akurat.
Kata terpanjang yang tersisa dikeluarkan, atau jika tidak ada kata yang tersisa, kata terpanjang dari sebelumnya dihasilkan.
Sunting: Menambahkan semua karakter dalam garis horizontal yang mengarah ke perubahan arah sebagai nilai yang mungkin untuk diperiksa.
Diperlukan PHP 5.4 (atau ganti semua
[..]
denganarray(..)
).sumber
keypos.csv
sss
) - Saya tidak berpikir penghapusan duplikat Anda akan menangkap mereka.Python 3, Corner Simulator, 241 dan 240 lintasan
Algoritma:
significant_letter
fungsi) (pass ketiga)Kode:
Jalankan dengan
python3 entries/corner_sim.py
sumber