Thử thách bố trí bàn phím


14

Bố cục bàn phím mọi người thường sử dụng là bố cục QWERTY như hình bên dưới.

bàn phím QWERTY

Nhưng cũng có bố trí bàn phím khác:

DVORAK

Bàn phím DVORAK

COLEMAK

Bàn phím COLEMAK

CÔNG NHÂN Bàn phím nhân viên

Nhiệm vụ của bạn

Mã của bạn sẽ có hai đầu vào: tên của bố trí bàn phím và một chuỗi để phiên âm. Mục tiêu của bạn là chuyển đổi đầu vào QWERTY của bạn như thể bạn đang gõ với bố cục bàn phím được cung cấp làm tham số đầu tiên.

Quy tắc

Định dạng đầu vào là miễn phí, bạn có thể sử dụng chuỗi, mảng, v.v.

Bạn chỉ cần xử lý các phím với nền trắng. Cụ thể, bạn phải hoán chuyển các ký tự ASCII có thể in từ bảng chữ cái QWERTY sang một trong các bảng chữ cái khác:

 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{|}~

(Lưu ý: điều này được sao chép bằng tay bởi @ETHproductions, vì vậy nếu bạn thấy bất kỳ lỗi nào, vui lòng chỉ ra chúng!)

Thí dụ

DVORAK zZxX như đầu vào sẽ cung cấp như đầu ra ;:qQ

Đây là vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!


1
Ngoài ra, một số trường hợp thử nghiệm sẽ hữu ích.
Sản phẩm ETH

1
@Tutman Có, bạn có thể lấy 0 1 2 chẳng hạn

1
Đợi đã, chúng ta có thể lấy ví dụ !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~làm đầu vào cho bàn phím Dvorak không? Điều đó sẽ tầm thường hóa thách thức ... Làm thế nào về việc giới thiệu một hạn chế độ dài hoặc một cái gì đó tương tự?
Sản xuất ETH

1
@EriktheOutgolfer Nhưng sau đó, bạn có thể lấy ví dụ !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\‌​=^{`axje.uidchtnmbrl‌​'poygk,qf;?|+~như đầu vào
ETHproductions

1
@ETHproductions Có, bạn có thể sử dụng các ký tự đó làm đầu vào, mặc dù bố cục không được phụ thuộc vào chúng để được xây dựng. Việc sử dụng duy nhất cho họ sẽ là chọn bố cục để sử dụng. 10 byte là một giới hạn cố định (IMO quá ngắn), đó là lý do tại sao tôi không thích nó. Và có bạn nói byte không chars. Tôi nghĩ rằng điều này nên được sandbox thêm thời gian.
Erik the Outgolfer

Câu trả lời:


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]}

Hãy thử trực tuyến!

Đây là một hàm lấy hai đối số: thông điệp được hoán đổi và giá trị 0-2 đại diện cho bố cục được hoán đổi, trong đó 0 tương ứng với Dvorak, 1 với Colemak và 2 cho Workman.

Về cơ bản, tôi không nghĩ rằng điều này khác nhiều so với các câu trả lời khác. Dễ đọc hơn, nó trông như thế này:

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

string#trHàm của Ruby có hai đối số: một chuỗi chứa các ký tự được thay thế và một chuỗi chứa các thay thế của chúng. Thật hữu ích, nó cho phép bạn chỉ định phạm vi các ký tự bằng a-zcú pháp. Một nhận thức tiết kiệm không gian quan trọng khác là không cần thiết phải bao gồm các ký tự giống nhau trong cả bốn bố cục, cho phép tôi loại bỏ tất cả các chữ số, chữ "A" ở cả chữ hoa và chữ thường và một số ít nhân vật đặc biệt.

Một cú pháp kỳ lạ khác là việc sử dụng %W(). Điều này tạo ra một chuỗi các chuỗi chứa mọi thứ bên trong dấu ngoặc đơn, được phân tách bằng khoảng trắng. Tất cả các ngắt dòng trong trình thực sự hoạt động như các dấu tách phần tử. %W()cũng cho phép nội suy chuỗi (được thực hiện với #{}toán tử) - %w()sẽ là điều tương tự, nhưng không có phép nội suy chuỗi.

Tôi cũng muốn dành một chút thời gian để đổ lỗi cho Dvorak vì đã làm xáo trộn các kế hoạch tối ưu hóa của tôi thông qua sự khăng khăng của nó là hoàn toàn khác biệt so với mọi người khác, mọi lúc; một giải pháp Qwerty / Colemak / Workman có thể rất ngắn ...


Có lấy một số nguyên làm đại diện của bàn phím để ánh xạ để đáp ứng các yêu cầu? Trường hợp thử nghiệm dường như yêu cầu rõ ràng tên của bàn phím, nhưng, sau đó, các quy tắc dường như sẽ cho phép bất kỳ đầu vào nào đại diện cho bàn phím.
Xù xì

@Shaggy Để trích dẫn một trong những bình luận của người hỏi về bài đăng, "bạn có thể lấy 0 1 2 chẳng hạn", đó chính xác là những gì tôi đã làm.
Người hướng dẫn

5

JavaScript (ES7), 282 273 251 250 byte

Lấy ID bố cục bàn phím kvà một mảng các ký tự atheo cú pháp currying (k)(a). Trả về một mảng các ký tự được dịch.

ID bố cục là:

  • -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)

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Nén

Tất cả ba bố cục đích được lưu trữ trong một chuỗi nén, trong đó mỗi ký tự là:

  • một nhân vật dịch từ QWERTY
  • một chữ số biểu thị số lượng ký tự liên tiếp không cần dịch

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

Chẳng hạn, #$%&-()*trong DVORAK được lưu trữ 3-2#$%&()*có ánh xạ giống hệt nhau trong QWERTY và chỉ -là bản dịch thực tế.

Cụ thể, 0123456789được ánh xạ theo cùng một cách trên tất cả các bố cục và không bao giờ phải dịch. Do đó, không có sự mơ hồ có thể có giữa một chữ số được sử dụng để nén và một chữ số được sử dụng để dịch.

Giảm bớt sức ép

n15n3-23375-225

Dịch

Đối với mỗi nhân vật ctrong a, chúng tôi trích xuất các vật dịch t, sử dụng knhư một bù đắp trong chuỗi bố trí không nén, và thử nghiệm cho dù đó là một chữ số với 1/t. Nếu vậy, chúng tôi xuất ký tự gốc cthay thế.


Tôi phải chạy xuống cầu thang để đội mũ chỉ để tôi có thể ném nó cho bạn! Tôi biết ai đó sẽ đánh bại tôi nhưng tôi rất vui vì đã bị đánh bại trong phong cách. Bạn sẽ có upvote của tôi ngay sau khi tôi hoàn thành việc tiêu hóa chính xác cách bạn rút kiệt tác này ra.
Xù xì

4

Võng mạc , 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.*
^.

Hãy thử trực tuyến! Tiền tố thông điệp với một chữ cái D, Choặc Wcho cách bố trí bàn phím mong muốn. Thật không may, Retina hỗ trợ một loạt các chữ cái ma thuật ( plà một chữ rõ ràng, nhưng tôi đã xoay sở để viết d) một cái mà tất cả cần phải được trích dẫn, ngoại trừ tôi có thể sử dụng v-xthay vì v\wx. Chỉnh sửa: Đã lưu 3 byte nhờ @ETHproductions.


Nếu -s đại diện cho phạm vi ký tự, tôi nghĩ bạn có thể lưu một số bằng cách thay đổi <-@ABCthành <-C.
Sản phẩm ETH

@ETHproductions Huh, tôi tự hỏi tại sao tôi lại bỏ qua nó trong phiên bản chữ hoa ...
Neil

3

PHP, 364 byte

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]);

Mảng chứa 3 mảng trong đó khóa là 0 = W, 1 = C, 2 = D

Hãy thử trực tuyến!


2

Python 2, 422 byte

Đã thử kết hợp bố cục với một số cách thông minh, nhưng nó không giúp được gì nhiều.
Dùng thử trực tuyến

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))

Chơi tốt :) Tôi không giỏi python nên tôi thực sự không thể giúp bạn chơi gôn này ^^

2

JavaScript (ES6), 461 409 404 395 385 byte

Tôi đã viết phiên bản gốc bên dưới lên trên điện thoại của mình khi đang ngồi trên xe buýt và sau đó hết thời gian để chơi golf đúng cách để có nhiều điều thú vị hơn để theo dõi. Cảm ơn @ETHproductions cho sự giúp đỡ cho đến nay.

Các chuỗi Bàn phím đã được sao chép trực tiếp từ câu hỏi để đổ lỗi cho Antoine ETH cho bất kỳ lỗi nào!

Điều này lấy một số nguyên biểu thị bố cục bàn phím (0 cho DVORAK, 94 cho COLEMAK & 188 cho WORKMAN) và một mảng của chuỗi làm đối số bằng cách currying - ví dụ: f(0)(["z","Z","x","X"])đầu ra ;: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``

Thử nó

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>


Trên thực tế, tôi đã biên dịch các chuỗi: P
ETHproductions

Hãy xem ... bạn sẽ không bao giờ lấy QWERTYlàm đầu vào, vì vậy tôi nghĩ rằng bạn có thể lưu một số byte bằng cách không lưu trữ Object trong một biến. Nó trông giống nhưs=>[...s].map(c=>({D:"...",C:"...",W:"..."}[k[0]]["...".indexOf(c)]).join``
ETHproductions

Aha, vâng, tôi biết có một cách để làm việc trực tiếp với đối tượng, map()nhưng tôi đã hết thời gian - tin hay không, tôi đã viết nó lên trong khi ngồi trên xe buýt đến rạp chiếu phim. Tôi sẽ cập nhật nó với đề xuất của bạn và một vài cải tiến tôi đã phát hiện ra vào ngày mai.
Xù xì

1

05AB1E , 199 192 187 byte

ž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.;}‡‡

Sử dụng ID 1cho DVORAK; 2cho COLEMAK và3 .
Đẩy ID trước, sau đó là chuỗi chúng tôi muốn chuyển ngữ.

Dùng thử trực tuyến hoặc xác minh phạm vi ASCII đầy đủ cho cả ba .

Giải trình:

ž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)

Xem mẹo 05AB1E này của tôi (phần Cách nén chuỗi không phải là một phần của từ điển? ) Để hiểu cách hoạt động của chuỗi nén.


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]));}

Chạy với ./multitrans <0-2> <string> nơi 0 = Dvorak, 1 = Colemak và 2 = Workman.

Tôi đã thêm các dòng mới ở giữa để làm cho mã dễ đọc hơn bên dưới. Mã này tạo ra một bản đồ dịch từ các chuỗi trong đó tìm kiếm ký tự Qwerty trả về bản dịch ( t[0]['s'] = 'o'cho s thành Dvorak), và sau đó nó sử dụng bản đồ để dịch. Các chuỗi dịch được rút ngắn vì một số ký tự không cần phải thay đổi bao giờ. Nó có thể có thể được giảm hơn nữa, mặc dù.

#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]));
}

Thêm: Qwerty -> Chỉ Dvorak (197 byte)

Gần đây tôi đã viết mã này thay đổi Qwerty thành Dvorak, mặc dù thủ đô không được dịch.

#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])]);}

0

C, 394 byte

Thử trực tuyến

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++;}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.