키보드 레이아웃 도전


14

사람들이 일반적으로 사용하는 키보드 레이아웃은 아래와 같이 QWERTY 레이아웃입니다.

QWERTY 키보드

그러나 다른 키보드 레이아웃도 있습니다 :

DVORAK

DVORAK 키보드

콜맥

COLEMAK 키보드

노동자 노동자 키보드

당신의 작업

코드는 키보드 레이아웃의 이름과 녹음 할 문자열의 두 가지 입력을받습니다. 목표는 첫 번째 매개 변수로 제공된 키보드 레이아웃으로 입력하는 것처럼 QWERTY 입력을 변환하는 것입니다.

규칙

입력 형식은 자유롭고 문자열, 배열 등을 사용할 수 있습니다. 또한 세 개의 다른 값을 사용하여 바이트 수를 줄이기 위해 레이아웃을 나타낼 수 있지만 각각 10 바이트 이하로 표현할 수 있어야합니다.

흰색 배경의 키만 처리하면됩니다. 특히 인쇄 가능한 ASCII 문자를 QWERTY 알파벳에서 다른 알파벳 중 하나로 바꿉니다.

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

(참고 : 이것은 @ETHproductions에 의해 수작업으로 작성되었으므로 오류가 표시되면 알려주세요!)

DVORAK zZxX 입력으로 출력으로 제공 ;:qQ

이것은 이므로 바이트 단위의 최단 답변이 이깁니다!


1
또한 더 많은 테스트 사례가 유용 할 것입니다.
ETHproductions

1
@Tutleman 예, 예를 들어 0 1 2를 사용할 수 있습니다.

1
잠깐, 예 !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~를 들어 Dvorak 키보드의 입력으로 사용할 수 있습니까? 그것은 도전을 사소하게 만들 것입니다 ... 길이 제한이나 비슷한 것을 도입하는 것은 어떻습니까?
ETHproductions

1
@EriktheOutgolfer 그러나 당신은 예를 !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\‌​=^{`axje.uidchtnmbrl‌​'poygk,qf;?|+~들어 입력으로 취할 수 있습니다
ETHproductions

1
@ETHproductions 예, 레이아웃을 구성 할 때 레이아웃에 전혀 의존해서는 안되지만 해당 문자를 입력으로 사용할 수 있습니다. 그것들을 사용할 유일한 것은 사용할 레이아웃을 선택하는 것입니다. 10 바이트는 고정 한계 (IMO가 너무 짧음)이므로 마음에 들지 않습니다. 그리고 예, 바이트가 문자가 아니라고 말합니다. 나는 이것이 더 많은 시간 동안 샌드 박스되어야한다고 생각합니다.
Outgolfer Erik

답변:


3

루비 , 258 247 238 바이트

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

온라인으로 사용해보십시오!

이것은 스왑 될 메시지와 스왑 될 레이아웃을 나타내는 값 0-2의 두 인수를 취하는 함수입니다. 여기서 0은 Dvorak, 1은 Colemak, 2는 Workman에 해당합니다.

근본적으로, 나는 이것이 다른 답변과 크게 다르다고 생각하지 않습니다. 더 읽기 쉽게, 다음과 같습니다 :

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

루비의 string#tr함수는 대체 할 문자를 포함하는 문자열과 대체를 포함하는 문자열의 두 가지 인수를 사용합니다. 유용하게는 다음을 사용하여 문자 범위를 지정할 수 있습니다.a-z 구문을 . 다른 주요 공간 절약 실현은 네 가지 레이아웃 모두에서 동일한 문자를 포함 할 필요가 없다는 것입니다. 이로 인해 모든 숫자, 대문자 "A"및 대문자 소문자를 제거 할 수 있습니다. 특수 문자.

다른 이상한 구문은을 사용하는 것입니다 %W(). 이렇게하면 공백으로 구분 된 괄호 안에있는 모든 것을 포함하는 문자열 배열이 생성됩니다. 제출의 모든 줄 바꿈은 실제로 요소 구분 기호로 작동합니다. %W()문자열 보간을 허용합니다 ( #{}연산자를 사용하여 수행됨 )-%w() 문자열 보간이없는 것과 똑같 았을 것입니다.

또한 Dvorak이 다른 모든 사람들과 완전히 다른 점을 강조하면서 최적화 계획을 어지럽 힌 것에 대해 잠시 시간을 내고 싶습니다. Qwerty / Colemak / Workman 솔루션은 너무 짧아서 ...


키보드의 표현으로 정수를 사용하여 요구 사항을 충족하도록 매핑합니까? 테스트 케이스는 키보드 이름을 명시 적으로 요구하는 것으로 보이지만, 규칙은 모든 입력이 키보드를 나타내는 것을 허용하는 것 같습니다.
Shaggy

@Shaggy 게시물에 대한 asker의 의견 중 하나를 인용하기 위해 "예를 들어 0 1 2를 사용할 수 있습니다"라고 말한 것입니다.
Tutleman

5

자바 스크립트 (ES7), 282 (273) (251) 250 바이트

커리 구문에서 키보드 레이아웃 ID k와 문자 배열을 사용 a합니다.(k)(a) . 번역 된 문자의 배열을 반환합니다.

레이아웃 ID는 다음과 같습니다.

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

온라인으로 사용해보십시오!

작동 원리

압축

세 가지 대상 레이아웃은 모두 하나의 압축 문자열에 저장되며 각 문자는 다음 중 하나입니다.

  • QWERTY의 번역 문자
  • 번역 할 필요가없는 연속 문자 수를 나타내는 숫자

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

예를 들어, #$%&-()*DVORAK에 저장되어 3-2있기 때문에 #$%&그리고 ()*QWERTY으로 만 동일한 매핑을 가질- 실제의 번역이다.

특히 0123456789모든 레이아웃에서 동일한 방식으로 매핑되므로 변환 할 필요가 없습니다. 따라서 압축에 사용 된 숫자와 변환에 사용되는 숫자 사이에 모호성이 없습니다.

감압

n153-23375-225

번역

의 각 문자 c에 대해 압축되지 않은 레이아웃 문자열에서 오프셋으로 사용하여 a변환 문자를 추출하고로 숫자인지 여부를 테스트합니다 . 그렇다면 원래 문자를 대신 출력합니다 .tk1/tc


모자를 쓰려고 아래층으로 달려 가서 당신에게 모자를 씌울 수있었습니다! 누군가 나를 이길 줄 알았지 만 스타일이 맞아서 기뻤습니다. 내가이 걸작을 어떻게 뽑아 냈는지 정확하게 요약하자마자 나의 투표를해야합니다.
Shaggy

4

망막 , 273 270 바이트

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.*
^.

온라인으로 사용해보십시오! 하나의 문자 메시지를 접두사 D, C또는 W원하는 키보드 레이아웃. 불행히도 Retina는 많은 마법 문자를 지원합니다 ( p명백한 문자 이지만 d, 나는 v-x대신 사용할 수 있음을 제외하고는 모두 인용해야 합니다 ) v\wx. 편집 : @ETHproductions 덕분에 3 바이트가 절약되었습니다.


-s가 문자 범위를 나타내는 경우 로 변경 <-@ABC하여 일부를 저장할 수 있다고 생각합니다 <-C.
ETHproductions

@ETHproductions 허, 왜 내가 대문자 버전에서 간과했는지 궁금해 ...
Neil

3

PHP, 364 바이트

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

배열은 키가 0 = W, 1 = C, 2 = D를 나타내는 3 개의 배열을 포함합니다.

온라인으로 사용해보십시오!


2

파이썬 2, 422 바이트

레이아웃을 영리한 방법으로 결합하려고 시도했지만별로 도움이되지 않았습니다.
온라인으로 사용해보십시오

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

잘 연주했습니다 :) 나는 파이썬을 잘하지 않아서 정말 골프를 도울 수 없어요 ^^

2

자바 스크립트 (ES6), 461 409 404 395 385 바이트

나는 버스에 앉아있는 동안 휴대 전화에 아래 버전의 원본을 작성한 다음 제대로 골프를 치기 위해 시간이 부족하여 따라야 할 더 많은 위기가 있습니다. 지금까지 도움을 주신 @ETHproductions에게 감사합니다.

키보드 문자열은 질문에서 직접 복사되었으므로 오류에 대해 Antoine ETH를 비난 하십시오!

키보드 레이아웃 (DVORAK의 경우 0, COLEMAK의 경우 94, WORKMAN의 경우 188)을 나타내는 정수와 f(0)(["z","Z","x","X"])출력 을 currying하여 문자열 배열을 인수로 사용 합니다 ;: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``

시도 해봐

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>


실제로 나는 문자열을 컴파일했다 : P
ETHproductions

보자 ... QWERTY입력으로 절대 얻을 수 없으므로 Object를 변수에 저장하지 않으면 바이트를 절약 할 수 있다고 생각합니다. 다음과 같이 보일 것입니다s=>[...s].map(c=>({D:"...",C:"...",W:"..."}[k[0]]["...".indexOf(c)]).join``
ETHproductions

Aha, 그렇습니다. 나는 물건을 직접 처리하는 방법이 있다는 것을 알고 있었지만 map()시간이 부족했습니다. 믿거 나 말거나, 영화관 버스에 앉아있는 동안 이것을 썼습니다. 나는 당신의 제안과 내일 나 자신을 발견 한 몇 가지 개선 사항으로 업데이트 할 것입니다.
Shaggy

1

05AB1E , 199 (192) 187 바이트

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

1DVORAK에 ID 를 사용합니다 . 2COLEMAK 및 3WORKMAN.
먼저 ID를 누른 다음 음역하려는 문자열을 푸시합니다.

온라인으로 시도 하거나 세 가지 모두에 대한 전체 ASCII 범위를 확인 하십시오 .

설명:

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

이 05AB1E 광산의 팁을 참조하십시오 (섹션 압축 문자열 사전의 일부에 어떻게? ) 방법 압축 된 문자열 작업을 이해하기.


1

C ++, 528 바이트

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

실행 ./multitrans <0-2> <string>여기서, 0 = 드보락 1 = 콜맥, 2 = 노동자.

아래에 코드를 약간 더 읽기 쉽게하기 위해 줄 바꾸기를 추가했습니다. 이 코드는 문자열에서 번역 맵을 생성하여 Qwerty 문자를 검색하면 번역을 반환하고 ( t[0]['s'] = 'o'Dvorak로 변환 한 경우) 맵을 사용하여 번역합니다. 일부 문자를 변경할 필요가 없으므로 번역 문자열이 줄어 듭니다. 그래도 더 줄어들 수 있습니다.

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

추가 : Qwerty-> Dvorak 만 (197 바이트)

나는 최근 자본이 번역되지 않았지만 쿼티를 드보락으로 바꾸는이 코드를 작성했습니다.

#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 바이트

온라인 시도

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++;}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.