キーボードレイアウトの課題


14

一般的に使用されるキーボードレイアウトは、以下に示すQWERTYレイアウトです。

QWERTYキーボード

しかし、他のキーボードレイアウトもあります。

DVORAK

DVORAKキーボード

コレマック

COLEMAKキーボード

職人 WORKMANキーボード

あなたのタスク

コードは、キーボードレイアウトの名前と、文字起こしする文字列の2つの入力を受け取ります。あなたの目標は、QWERTY入力を、最初のパラメーターとして指定されたキーボードレイアウトで入力しているかのように変換することです。

ルール

入力形式は無料です。文字列、配列などを使用できます。さらに、3つの異なる値を使用してレイアウトを表現し、バイト数を減らすことができますが、それぞれ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;?|+~ドヴォルザークのキーボードの入力として受け取れますか?それは挑戦を平凡にするでしょう...長さ制限または類似のものを導入するのはどうですか?
-ETHproductions

1
@EriktheOutgolferしかし、その後、例えば!_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\‌​=^{`axje.uidchtnmbrl‌​'poygk,qf;?|+~入力として取ることができます
-ETHproductions

1
@ETHproductionsはい、これらの文字を入力として使用できますが、レイアウトは構築するためにそれらにまったく依存してはなりません。それらの唯一の用途は、使用するレイアウトを選択することです。10バイトは固定された制限(IMOが短すぎる)であり、それが気に入らない理由です。そして、はい、バイトは文字ではなく、と言います。これはもっと長い時間サンドボックス化されるべきだったと思う。
エリックアウトゴルファー

回答:


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

オンラインでお試しください!

これは、2つの引数をとる関数です。交換されるメッセージと、交換されるレイアウトを表す値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

Rubyのstring#tr関数は、置換される文字を含む文字列と、置換を含む文字列の2つの引数を取ります。便利なことに、a-z構文を使用して文字の範囲を指定できます。もう1つの重要なスペース節約の実現方法は、4つのレイアウトすべてで同じ文字を含める必要がないことです。これにより、すべての数字、大文字と小文字の両方の文字「A」、特殊文字。

もう1つの奇妙な構文は、の使用です%W()。これにより、空白で区切られた括弧内のすべてを含む文字列の配列が作成されます。サブミッション内のすべての改行は、実際には要素セパレーターとして機能します。%W()また、文字列の補間を許可します(これは#{}演算子で行われます)- %w()同じことでしたが、文字列の補間はありませんでした。

また、Dvorakが、常に最適化の計画をいじり回しているのは、他の人とはまったく異なることを常に主張しているためです。Qwerty / Colemak / Workmanソリューションは非常に短くできたかもしれません...


要件を満たすようにマップするキーボードの表現として整数を使用していますか?このテストケースでは、キーボードの名前が明示的に要求されているように見えますが、その場合、ルールは入力がキーボードを表すことを許可しているように見えます。
シャギー

@Shaggy投稿に対する質問者のコメントの1つを引用すると、「0 1 2を例に取ることができます」。これはまさに私がやったことです。
タトルマン

5

JavaScriptの(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)

オンラインでお試しください!

使い方

圧縮

3つのターゲットレイアウトはすべて、単一の圧縮文字列に格納されます。各文字は次のいずれかです。

  • 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 では、QWERTYで同一のマッピングを持ち、実際の翻訳のみである3-2ため#$%&、として保存されます。()*-

特に、0123456789はすべてのレイアウトで同じ方法でマッピングされ、翻訳する必要はありません。したがって、圧縮に使用される数字と変換に使用される数字の間にあいまいさはありません。

減圧

n15n3-23375-225

翻訳

各文字のc中にa、私たちは、翻訳文字を抽出しt使用して、k非圧縮のレイアウト文字列のオフセット、そしてそれが持つ桁のかどうかのテストとして1/t。その場合、c代わりに元の文字を出力します。


帽子をかぶるには階下に走らねばならなかった 誰かが私をbeatるだろうことは知っていましたが、スタイルでbeatられたことをうれしく思います。あなたがこの傑作をどのように引き出したかを正確に消化し終えるとすぐに、あなたは私の賛成票を得るでしょう。
シャギー

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

オンラインでお試しください!単一文字のメッセージ接頭辞DC又はW所望のキーボードレイアウトのために。残念ながら、網膜は、魔法の手紙の束をサポート(p明らかに1であることを、私は中にスリップし管理しなかったd)私が使用することができた以外、すべての必要性が引用されるためにどのv-xのではなくv\wx。編集:@ETHproductionsのおかげで3バイトを節約しました。


-sが文字の範囲を表す場合、に変更<-@ABCすることで節約できると思います<-C
-ETHproductions

@ETHproductionsええ、なぜ私は大文字バージョンでそれを見落としていたのだろう...-
ニール

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

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

よくやった:)私はPythonが得意ではないので、これをゴルフするのを本当に手伝うことはできません^^

2

JavaScript(ES6)、461 409 404 395 385バイト

バスに座っている間、携帯電話で以下のオリジナルバージョンを作成し、それを適切にゴルフするために時間を使い果たしたので、従うべきもっとクランチがあります。これまで@ETHproductionsに助けてくれてありがとう。

キーボードの文字列は質問から直接コピーされたため、エラーがある場合はアントワーヌ ETHを非難します。

これは、キーボードレイアウトを表す整数(DVORAKの場合は0、COLEMAKの場合は94、WORKMANの場合は188)とカリー化による引数としての文字列の配列(たとえばoutput)を取りf(0)(["z","Z","x","X"])ます;: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入力として取得することは決してないので、変数にオブジェクトを保存しないことでいくつかのバイトを節約できると思います。次のようになりますs=>[...s].map(c=>({D:"...",C:"...",W:"..."}[k[0]]["...".indexOf(c)]).join``
-ETHproductions

ああ、はい、私はオブジェクト内で直接作業する方法があることを知っていましたが、map()時間を使い果たしました-信じられないかもしれませんが、映画のバスに座ってこれを書きました。あなたの提案と、明日自分が見つけたいくつかの改善点で更新します。
シャギー

1

05AB1E199 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をプッシュし、次に音訳する文字列をプッシュします。

オンラインで試す、3つすべての完全な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 = Colemak、及び2 =ワークマン。

コードを少し読みやすくするために、間に改行を追加しました。このコードは、文字列から翻訳マップを生成します。この場合、Qwerty文字を検索すると(t[0]['s'] = 'o'sが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 Only(197バイト)

私は最近、QwertyをDvorakに変更するこのコードを書きましたが、大文字は翻訳されていません。

#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.