Layout keyboard yang umum digunakan adalah layout QWERTY seperti yang ditunjukkan di bawah ini.
Tetapi ada juga tata letak keyboard lainnya:
DVORAK
COLEMAK
Tugas Anda
Kode Anda akan mengambil dua input: nama tata letak keyboard dan string untuk ditranskripsikan. Tujuan Anda adalah mengonversi input QWERTY Anda seolah-olah Anda mengetik dengan tata letak keyboard yang diberikan sebagai parameter pertama.
Aturan
Format input gratis, Anda dapat menggunakan string, array, dll. Selain itu, Anda dapat menggunakan tiga nilai berbeda untuk mewakili tata letak untuk mengurangi jumlah byte Anda, tetapi masing-masing harus mewakili dalam 10 byte atau kurang.
Anda hanya perlu menangani tombol dengan latar belakang putih. Khususnya, Anda harus mengubah karakter ASCII yang dapat dicetak dari alfabet QWERTY ke salah satu alfabet lain:
QWERTY: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
DVORAK: !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~
COLEMAK: !"#$%&'()*+,-./0123456789Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJZ[\]^_`abcsftdhuneimky;qprglvwxjz{|}~
WORKMAN: !"#$%&'()*+,-./0123456789Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJZ[\]^_`avmhrtgyuneolkp;qwsbfcdxjz{|}~
(Catatan: ini ditranskripsi dengan tangan oleh @ETHproductions, jadi jika Anda melihat kesalahan, harap tunjukkan!)
Contoh
DVORAK zZxX
sebagai input akan memberikan sebagai output ;:qQ
Ini adalah kode-golf sehingga jawaban tersingkat dalam byte menang!
!_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~
sebagai input untuk keyboard Dvorak? Itu akan meremehkan tantangan ... Bagaimana kalau memperkenalkan batasan panjang atau sesuatu yang serupa?!_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~
sebagai inputJawaban:
Ruby ,
258247238 byteCobalah online!
Ini adalah fungsi yang mengambil dua argumen: pesan yang akan ditukar, dan nilai 0-2 mewakili tata letak yang akan ditukar, di mana 0 sesuai dengan Dvorak, 1 untuk Colemak, dan 2 untuk Pekerja.
Pada dasarnya, saya rasa ini tidak jauh berbeda dari jawaban yang lain. Lebih mudah dibaca, tampilannya seperti ini:
string#tr
Fungsi Ruby mengambil dua argumen: string yang berisi karakter untuk diganti, dan string yang berisi penggantian mereka. Bermanfaat, ini memungkinkan Anda untuk menentukan rentang karakter menggunakana-z
sintaks. Realisasi penghematan-ruang utama lainnya adalah bahwa tidak perlu menyertakan karakter yang sama di keempat tata letak, yang memungkinkan saya untuk menyingkirkan semua digit, huruf "A" dalam huruf besar dan kecil, dan beberapa karakter spesial.Satu sintaks aneh lainnya adalah penggunaan
%W()
. Ini menciptakan array string yang berisi segala sesuatu di dalam tanda kurung, dipisahkan oleh spasi putih. Semua linebreak dalam pengiriman sebenarnya berfungsi sebagai pemisah elemen.%W()
juga memungkinkan interpolasi string (yang dilakukan dengan#{}
operator) -%w()
akan menjadi hal yang sama, tetapi tanpa interpolasi string.Saya juga ingin mengambil waktu sejenak untuk menyalahkan Dvorak karena mengacaukan rencana saya untuk optimasi melalui desakannya untuk benar-benar berbeda dari orang lain, sepanjang waktu; solusi Qwerty / Colemak / Workman bisa jadi sangat pendek ...
sumber
JavaScript (ES7),
282273251250 byteMengambil ID tata letak keyboard
k
dan berbagai karaktera
dalam sintaks currying(k)(a)
. Mengembalikan array karakter yang diterjemahkan.ID tata letak adalah:
Cobalah online!
Bagaimana itu bekerja
Kompresi
Ketiga tata letak target disimpan dalam string terkompresi tunggal, di mana masing-masing karakter:
Misalnya,
#$%&-()*
dalam DVORAK disimpan3-2
karena#$%&
dan()*
memiliki pemetaan yang identik di QWERTY dan hanya-
terjemahan yang sebenarnya.Secara khusus,
0123456789
dipetakan dengan cara yang sama pada semua tata letak dan tidak pernah harus diterjemahkan. Oleh karena itu, tidak ada kemungkinan ambiguitas antara angka yang digunakan untuk kompresi dan angka yang digunakan untuk terjemahan.Dekompresi
Untuk mendekompresi string tata letak, kami mengganti setiap digitn 15n
3-2
3375-225
Terjemahan
Untuk setiap karakter
c
dalama
, kami mengekstrak karakter terjemahant
, menggunakank
sebagai offset dalam string tata letak yang tidak terkompresi, dan menguji apakah itu digit1/t
. Jika demikian, kami mengeluarkan karakter aslic
sebagai gantinya.sumber
Retina ,
273270 byteCobalah online! Awali pesan dengan satu huruf
D
,C
atauW
untuk tata letak keyboard yang diinginkan. Sayangnya Retina mendukung banyak surat ajaib (p
menjadi yang jelas, tetapi saya berhasil memasukkand
) yang semuanya perlu dikutip, kecuali saya dapat menggunakanv-x
sebagai gantinyav\wx
. Sunting: Disimpan 3 byte berkat produk @ETH.sumber
-
s mewakili rentang karakter, saya pikir Anda dapat menyimpan beberapa dengan mengubah<-@ABC
ke<-C
.PHP, 364 Bytes
Array berisi 3 array di mana kunci adalah 0 = W, 1 = C, 2 = D
Cobalah online!
sumber
Python 2, 422 byte
Mencoba menggabungkan tata letak dengan cara yang cerdas, tetapi tidak banyak membantu.
Cobalah online
sumber
JavaScript (ES6),
461409404395385 byteSaya menulis versi asli di bawah ini di ponsel saya sambil duduk di bus dan kemudian kehabisan waktu untuk golf dengan benar sehingga ada lebih banyak lagi untuk mengikuti. Terima kasih kepada @ETHproductions untuk bantuannya sejauh ini.
String Keyboard disalin langsung dari pertanyaan, jadi salahkan
AntoineETH atas kesalahan!Ini membutuhkan integer yang mewakili tata letak keyboard (0 untuk DVORAK, 94 untuk COLEMAK & 188 untuk PEKERJA) dan sebuah array dari string sebagai argumen oleh currying - misalnya,
f(0)(["z","Z","x","X"])
output;:qQ
.Cobalah
sumber
QWERTY
input, jadi saya pikir Anda bisa menyimpan beberapa byte dengan tidak menyimpan Objek dalam variabel. Itu akan terlihat sepertis=>[...s].map(c=>({D:"...",C:"...",W:"..."}[k[0]]["...".indexOf(c)]).join``
map()
tapi saya kehabisan waktu - percaya atau tidak, saya menulis ini sambil duduk di bus ke bioskop. Saya akan memperbaruinya dengan saran Anda dan beberapa perbaikan yang saya lihat sendiri besok.05AB1E ,
199192187 bytesMenggunakan ID
1
untuk DVORAK;2
untuk COLEMAK dan3
untuk PEKERJA.Dorong ID terlebih dahulu, lalu string yang ingin kita transliterasi.
Cobalah online atau verifikasi rentang ASCII lengkap untuk ketiganya .
Penjelasan:
Lihat tip tambang 05AB1E ini (bagian Bagaimana memampatkan string bukan bagian dari kamus? ) Untuk memahami cara kerja string terkompresi.
sumber
C ++, 528 byte
Jalankan dengan
./multitrans <0-2> <string>
mana 0 = Dvorak, 1 = Colemak, dan 2 = Pekerja.Saya menambahkan baris baru di antaranya untuk membuat kode sedikit lebih mudah dibaca di bawah ini. Kode ini menghasilkan peta terjemahan dari string di mana mencari karakter Qwerty mengembalikan terjemahan (
t[0]['s'] = 'o'
untuk s ke Dvorak), dan kemudian menggunakan peta untuk menerjemahkan. String terjemahan dipersingkat karena beberapa karakter tidak perlu diubah. Mungkin bisa dikurangi lebih jauh.Ekstra: Qwerty -> Dvorak Saja (197 byte)
Baru-baru ini saya menulis kode ini yang mengubah Qwerty menjadi Dvorak, meskipun huruf kapital tidak diterjemahkan.
sumber
C, 394 byte
Coba Online
sumber