Tantangan tata letak keyboard

14

Layout keyboard yang umum digunakan adalah layout QWERTY seperti yang ditunjukkan di bawah ini.

keyboard QWERTY

Tetapi ada juga tata letak keyboard lainnya:

DVORAK

Keyboard DVORAK

COLEMAK

Keyboard COLEMAK

TUKANG Keyboard WORKMAN

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 sehingga jawaban tersingkat dalam byte menang!

Nayuki
sumber
1
Juga, beberapa kasus uji lagi akan bermanfaat.
Produksi ETH
1
@ Talkleman Ya, Anda dapat mengambil 0 1 2 misalnya
1
Tunggu, bisakah kita mengambil mis !_#$%&-()*}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?
ETHproduksi
1
@EriktheOutgolfer Tapi kemudian Anda bisa mengambil misalnya !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\‌​=^{`axje.uidchtnmbrl‌​'poygk,qf;?|+~sebagai input
ETHproduksi
1
@ETHproductions Ya Anda dapat menggunakan karakter-karakter itu sebagai input, meskipun tata letak tidak harus bergantung pada karakter yang akan dibangun. Satu-satunya penggunaan untuk mereka adalah memilih tata letak mana yang akan digunakan. 10 byte adalah batas tetap (IMO terlalu pendek), itu sebabnya saya tidak suka. Dan ya Anda mengatakan byte bukan karakter. Saya pikir ini seharusnya sudah sandbox untuk lebih banyak waktu.
Erik the Outgolfer

Jawaban:

3

Ruby , 258 247 238 byte

->c,t{c.tr"#{$f='\'"+,-./<=>?[]{'}}:;B-Z_b-z",%W(-_}w[vzW]VZ/=?+SsXJE>UIDCHTNMBRL"POYGK<QF:{xje.uidchtnmbrl'poygk,qf;
#$f}OoBCSFTDHUNEIMKY:QPRGLVWXJZ_bcsftdhuneimky;qprglvwxjz
#$f}IiVMHRTGYUNEOLKP:QWSBFCDXJZ_vmhrtgyuneolkp;qwsbfcdxjz)[t]}

Cobalah 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:

def swap_layout(message, layout)
    keyboards = [DVORAK, COLEMAK, WORKMAN] # Omitted here for brevity
    return message.tr(QWERTY, keyboards[layout])
end

string#trFungsi Ruby mengambil dua argumen: string yang berisi karakter untuk diganti, dan string yang berisi penggantian mereka. Bermanfaat, ini memungkinkan Anda untuk menentukan rentang karakter menggunakan a-zsintaks. 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 ...

Pengawas
sumber
Apakah mengambil bilangan bulat sebagai representasi keyboard untuk dipetakan agar memenuhi persyaratan? Kasing uji tampaknya secara eksplisit memerlukan nama keyboard tetapi, kemudian, aturan tampaknya akan memungkinkan input apa pun untuk mewakili keyboard.
Shaggy
@Shaggy Mengutip salah satu komentar penanya di pos, "Anda dapat mengambil 0 1 2 misalnya", yang persis seperti yang saya lakukan.
Tutleman
5

JavaScript (ES7), 282 273 251 250 byte

Mengambil ID tata letak keyboard kdan berbagai karakter adalam sintaks currying(k)(a) . Mengembalikan array karakter yang diterjemahkan.

ID tata letak adalah:

  • -32
  • 64
  • 160
k=>a=>a.map(c=>1/(t=`1_3-2}w[vz8SsW]VZ1XJE>UIDCHTN0BRL"POYGK<QF:/0=0{1xje.uidchtn0brl'poygk,qf;?0+995Oo6SFTD0UNEI0KY:0PRGL2J8sftd0unei0ky;0prgl2j998Ii5VMHRT0YUNEOLKP:0W0BFCD0J6vmhrt0yuneolkp;0w0bfcd0j5`.replace(/\d/g,n=>15**n)[c.charCodeAt()+k])?c:t)

Cobalah online!

Bagaimana itu bekerja

Kompresi

Ketiga tata letak target disimpan dalam string terkompresi tunggal, di mana masing-masing karakter:

  • karakter terjemahan dari QWERTY
  • digit yang mewakili jumlah karakter berurutan yang tidak perlu diterjemahkan

n15n10

n | 15**n       | length
--+-------------+-------------
0 | 1           | 1
1 | 15          | 2
2 | 225         | 3
3 | 3375        | 4
4 | 50625       | 5 (not used)
5 | 759375      | 6
6 | 11390625    | 8
7 | 170859375   | 9 (not used)
8 | 2562890625  | 10
9 | 38443359375 | 11

Misalnya, #$%&-()*dalam DVORAK disimpan 3-2karena #$%&dan ()*memiliki pemetaan yang identik di QWERTY dan hanya- terjemahan yang sebenarnya.

Secara khusus, 0123456789dipetakan 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 digit n15n3-23375-225

Terjemahan

Untuk setiap karakter cdalam a, kami mengekstrak karakter terjemahan t, menggunakan ksebagai offset dalam string tata letak yang tidak terkompresi, dan menguji apakah itu digit 1/t. Jika demikian, kami mengeluarkan karakter asli csebagai gantinya.

Arnauld
sumber
Aku harus berlari ke bawah untuk mengenakan topi supaya aku bisa melepasnya kepadamu! Saya tahu seseorang akan mengalahkan saya, tetapi saya senang dipukuli dengan gaya. Anda akan mendapatkan upvote saya segera setelah saya selesai mencerna dengan tepat bagaimana Anda menarik karya ini.
Shaggy
4

Retina , 273 270 byte

T`p` !_#-&\-()*}\w[vzdSsW]VZ@AXJ\E>UIDC\HTNMBR\L"P\OYGK<QF:/\\=^{\`axje.ui\dc\htnmbr\l'\p\oygk,qf;?|+~`^D.*
T`p` -9\O\o<-CSFTD\HUN\EIMKY:QPRG\LVWXJZ-csft\d\huneimky;q\prg\lv-xjz-~`^C.*
T`p` -9Ii<-AVM\HRTGYUN\E\O\LKP:QWSBFCDXJZ-avm\hrtgyune\o\lk\p;q\wsbfc\dxjz-~`^W.*
^.

Cobalah online! Awali pesan dengan satu huruf D, Catau Wuntuk tata letak keyboard yang diinginkan. Sayangnya Retina mendukung banyak surat ajaib ( pmenjadi yang jelas, tetapi saya berhasil memasukkan d) yang semuanya perlu dikutip, kecuali saya dapat menggunakanv-x sebagai gantinya v\wx. Sunting: Disimpan 3 byte berkat produk @ETH.

Neil
sumber
Jika -s mewakili rentang karakter, saya pikir Anda dapat menyimpan beberapa dengan mengubah <-@ABCke <-C.
ETHproductions
@ ETHproductions Huh, saya heran mengapa saya mengabaikannya dalam versi huruf besar ...
Neil
3

PHP, 364 Bytes

echo strtr($argv[2],($t=[[":;BCDEFHIJKLMNOPRTUVWYbcdefhijklmnoprtuvwy","IiVMHRTYUNEOLKP:WBFCDJvmhrtyuneolkp;wbfcdj"],[":;DEFGIJKLNOPRSTUYdefgijklnoprstuy","OoSFTDUNEIKY:PRGLJsftduneiky;prglj"],["\"'+,-./:;<=>?BCDEFGHIJKLNOPQRSTUVWXYZ[]_bcdefghijklnopqrstuvwxyz{}","_-}w[vzSsW]VZXJE>UIDCHTNBRL\"POYGK<QF:/={xje.uidchtnbrl'poygk,qf;?+"]][ord($argv[1])%3])[0],$t[1]);

Array berisi 3 array di mana kunci adalah 0 = W, 1 = C, 2 = D

Cobalah online!

Jörg Hülsermann
sumber
2

Python 2, 422 byte

Mencoba menggabungkan tata letak dengan cara yang cerdas, tetapi tidak banyak membantu.
Cobalah online

from string import*
Q=' '+printable
D=' '+digits
p,P=punctuation.split(':;')
w='avmhrtgyuneolkp;qwsbfcdxjz'
c='abcsftdhuneimky;qprglvwxjz'
d="uidchtnmbrl'poygk"
K={'C':D+c+c.upper().replace('Y;','Y:')+p+'Oo'+P,'W':D+w+w.upper().replace('P;','P:')+p+'Ii'+P,'D':D+'axje.'+d+',qf;AXJE>'+d.upper().replace("L'",'L"')+'<QF:!_#$%&-()*}w[vzSsW]VZ@/\=^{`?|+~'}
k,s=input().split()
print''.join(map(lambda x:K[k[0]][Q.index(x)],s))
Possum Mati
sumber
Dimainkan dengan baik :) Saya tidak terlalu bagus di python jadi saya tidak bisa membantu Anda bermain golf ini ^^
2

JavaScript (ES6), 461 409 404 395 385 byte

Saya 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 Antoine ETH 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.

k=>s=>s.map(c=>`!_#$%&-()*}w[vz${a="0123456789"}SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\\=^{\`axje.uidchtnmbrl'poygk,qf;?|+~${b="!\"#$%&'()*+,-./"+a}Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJ${d="Z[\\]^_\`a"}bcsftdhuneimky;qprglvwxjz{|}~${b}Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJ${d}vmhrtgyuneolkp;qwsbfcdxjz{|}~`[`${b}:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY${d}bcdefghijklmnopqrstuvwxyz{|}~`.search(c)+k]).join``

Cobalah

f=
k=>s=>s.map(c=>`!_#$%&-()*}w[vz${a="0123456789"}SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\\=^{\`axje.uidchtnmbrl'poygk,qf;?|+~${b="!\"#$%&'()*+,-./"+a}Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJ${d="Z[\\]^_\`a"}bcsftdhuneimky;qprglvwxjz{|}~${b}Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJ${d}vmhrtgyuneolkp;qwsbfcdxjz{|}~`[`${b}:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY${d}bcdefghijklmnopqrstuvwxyz{|}~`.search(c)+k]).join``
o.innerText=f(j.value=0)([...i.value="zZxX"])
i.oninput=j.oninput=_=>o.innerText=f(+j.value)([...i.value].filter(c=>`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\`abcdefghijklmnopqrstuvwxyz{|}~`.includes(c)))
<select id=j><option value=0>DVORAK<option value=94>COLEMAK<option value=188>WORKMAN</select><input id=i><pre id=o>

Shaggy
sumber
Sebenarnya saya menyusun string: P
ETHproduk
Mari kita lihat ... Anda tidak akan pernah mendapatkan QWERTYinput, 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``
Produk ETH
Aha, ya, saya tahu ada cara untuk bekerja langsung dari objek, dalam waktu 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.
Shaggy
1

05AB1E , 199 192 187 bytes

žQDIiA¦'mKDuì“"'+,-./:;<=>?[]_{}“«.•4Zl˜η‡#ûwj˜ÐAδO•Duìð“>"<:.',;“S.;“_-}w[vzSsW]VZ/={?+“«ë¹<i.•2¸3'ÐQïK¤)•Duì„:;©ì.•C^ÿ¶₆*γŽ¨ï•Duì„Ooìë.•Brì·=ζW˜ΛlÝδ•Duì®ì.•]X)àƒ₆ä¤QúØM•Duì„Iiì}ð®S.;}‡‡

Menggunakan ID 1untuk DVORAK;2untuk COLEMAK dan 3untuk PEKERJA.
Dorong ID terlebih dahulu, lalu string yang ingin kita transliterasi.

Cobalah online atau verifikasi rentang ASCII lengkap untuk ketiganya .

Penjelasan:

žQ                    # Push printable ASCII builtin string:
                      #  “ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~“
  D                   # Duplicate it
   Ii                 # If the input-integer is 1:
     A                #  Push the lowercase alphabet
      ¦'mK           '#  Remove the first character (the 'a') and 'm'
          Duì         #  Prepend an uppercase copy
     "'+,-./:;<=>?[]_{}“«
                     "#  And then append the string “"'+,-./:;<=>?[]_{}“
     .•4Zl˜η‡#ûwj˜ÐAδO 
                      #  Push compressed string "xje uidchtnbrl poygk qf "
        Duì           #  Prepend an uppercase copy
     ð                #  Push a space " "
      “>"<:.',;“S    "#  Push the characters [">",'"',"<",":",".","'",",",";"]
                 .;   #  Replace the first space with ">", second with '"', etc.
     _-}w[vzSsW]VZ/={?+“«
                      #  And then append the string “_-}w[vzSsW]VZ/={?+“
   ë                  # Else:
    ¹<i               #  If the input-integer is 2 instead: 
       .•2¸3'ÐQïK¤)• '#   Push compressed string "defgijklnoprstuy"
          Duì         #   Prepend an uppercase copy
       „:;            #   Push string ":;"
          ©           #   Store it in the register (without popping)
           ì          #   And then prepend this ":;" in front of the "DEF...def..."-string
       .•C^ÿ¶₆*γŽ¨ï•  #   Push compressed string "sftduneiky prglj"
          Duì         #   Prepend an uppercase copy
       Ooì           #   And then prepend "Oo"
    ë                 #  Else (so the input-integer is 3):
     .•Brì·=ζW˜ΛlÝδ•  #   Push compressed string "bcdefhijklmnoprtuvwy"
        Duì           #   Prepend an uppercase copy
     ®ì               #   And then prepend ":;" (from the register)
     .•]X)àƒ₆ä¤QúØM  #   Push compressed string "vmhrtyuneolkp wbfcdj"
        Duì           #   Prepend an uppercase copy
     Iiì             #   And then prepend "Ii"
    }                 #  After the inner if-else:
     ð                #  Push a space " "
      ®S              #  Push the characters [":",";"] (from the register)
        .;            #  Replace the first space with ":" and the second space with ";"
   }                  # After the outer if-else:
                     # Transliterate the two strings we created,
                      #  in the duplicate printable ASCII string
                     # And then transliterate the printable ASCII string with this string,
                      #  in the (implicit) string-input
                      # (after which the result is output implicitly)

Lihat tip tambang 05AB1E ini (bagian Bagaimana memampatkan string bukan bagian dari kamus? ) Untuk memahami cara kerja string terkompresi.

Kevin Cruijssen
sumber
1

C ++, 528 byte

#include <map>
#define M(a,b)a!='\0'?a:b
std::map<char,char>t[3];char*c[]={"\"'+,-./:;<=>?BCDEFGHIJKLMNOPQRSTUVWXYZ[]_bcdefghijklmnopqrstuvwxyz{}","_-}w[vzSsW]VZXJE>UIDCHTNMBRL\"POYGK<QF:/={xje.uidchtnmbrl'poygk,qf;?+","\"'+,-./Oo<=>?BCSFTDHUNEIMKY:QPRGLVWXJZ[]_bcsftdhuneimky;qprglvwxjz{}","\"'+,-./Ii<=>?VMHRTGYUNEOLKP:QWSBFCDXJZ[]_vmhrtgyuneolkp;qwsbfcdxjz{}"};int main(int d,char*v[]){for(int i=1;i<4;i++)for(int j=0;j<68;j++)t[i-1][c[0][j]]=c[i][j];for(int k=0;v[2][k];k++)printf("%c",M(t[v[1][0]-'0'][v[2][k]],v[2][k]));}

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.

#include <map>
#define M(a,b)a!='\0'?a:b
std::map<char,char>t[4];
char*c[4]={
"\"'+,-./:;<=>?BCDEFGHIJKLMNOPQRSTUVWXYZ[]_bcdefghijklmnopqrstuvwxyz{}",
"_-}w[vzSsW]VZXJE>UIDCHTNMBRL\"POYGK<QF:/={xje.uidchtnmbrl'poygk,qf;?+",
"\"'+,-./Oo<=>?BCSFTDHUNEIMKY:QPRGLVWXJZ[]_bcsftdhuneimky;qprglvwxjz{}",
"\"'+,-./Ii<=>?VMHRTGYUNEOLKP:QWSBFCDXJZ[]_vmhrtgyuneolkp;qwsbfcdxjz{}"};
int main(int d,char*v[]){
    for(int i=1;i<4;i++)
        for(int j=0;j<68;j++)
            t[i-1][c[0][j]]=c[i][j];
    for(int k=0;v[2][k];k++)
        printf("%c",M(t[v[1][0]-'0'][v[2][k]],v[2][k]));
}

Ekstra: Qwerty -> Dvorak Saja (197 byte)

Baru-baru ini saya menulis kode ini yang mengubah Qwerty menjadi Dvorak, meskipun huruf kapital tidak diterjemahkan.

#include<string>
char*d="\',.pyfgcrlaoeuidhtns;qjkxbmwvz ";std::string t="qwertyuiopasdfghjkl;zxcvbnm,./ ";int main(int c,char*v[]){for(int j=0;j<strlen(v[1]);j++)printf("%c",d[t.find(v[1][j])]);}
JackMacWindows
sumber
0

C, 394 byte

Coba Online

char*K[3]={"!_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL\"POYGK<QF:/\\=^{`axje.uidchtnmbrl'poygk,qf;?|+~",
"!\"#$%&'()*+,-./0123456789Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJZ[\\]^_`abcsftdhuneimky;qprglvwxjz{|}~",
"!\"#$%&'()*+,-./0123456789Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJZ[\\]^_`avmhrtgyuneolkp;qwsbfcdxjz{|}~"};
main(int c,char**v){char*t=v[2];while(*t)putchar(*t>32?K[atoi(v[1])][*t-33]:*t),t++;}
Khaled.K
sumber