键盘布局挑战


14

人们通常使用的键盘布局是QWERTY布局,如下所示。

QWERTY键盘

但是,还有其他键盘布局:

德沃克

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'Apr

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太短),这就是为什么我不喜欢它。是的,您说字节不是字符。我认为应该在沙盒中放更多时间。
暴民埃里克(Erik the Outgolfer)

Answers:


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

Ruby的string#tr函数带有两个参数:一个包含要替换字符的字符串,一个包含其替换字符的字符串。有用的是,它允许您使用a-z语法指定字符范围。另一个节省空间的关键实现是,不必在所有四种布局中都包含相同的字符,这使我摆脱了所有数字,大写和小写字母“ A”以及少数几个特殊的角色。

语法的另一个怪异之处是的使用%W()。这将创建一个字符串数组,其中包含括号内的所有内容,并用空格分隔。提交中的所有换行符实际上都用作元素分隔符。%W()还允许字符串插值(由#{}运算符完成)- %w()原来是一样的,但是没有字符串插值。

我还想花一点时间责怪Dvorak,因为它一直坚持与众不同,从而破坏了我的优化计划。Qwerty / Colemak / Workman解决方案本来可以这么短...


是否采用整数作为要映射的键盘表示形式以满足要求?测试用例似乎明确要求使用键盘的名称,但是规则似乎允许任何输入代表键盘。
Shaggy's

@Shaggy在帖子中引用提问者的评论之一,“例如您可以采用0 1 2”,这正是我所做的。
Tutleman '17

5

的JavaScript(ES7),282个 273 251 250字节

以currying语法获取键盘布局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在所有布局上都以相同的方式进行映射,而不必翻译。因此,用于压缩的数字和用于转换的数字之间没有歧义。

减压

n15ñ3-23375-225

翻译

对于每一个字符ca,我们提取翻译文字t,使用k在未压缩的布局字符串的偏移,并测试它是否是一个数字1/t。如果是这样,我们将输出原始字符c


我只好跑下楼戴上帽子,这样我才能把它戴在你身上!我知道有人会击败我,但我很高兴能被打败。在我完全消化了您如何完成此杰作之后,您将获得我的赞誉。
Shaggy's

4

视网膜273270字节

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

在线尝试!前缀将消息与单字母DCW为所需的键盘布局。不幸的是,视网膜支持一堆魔术字母(p很明显,但是我确实设法插入了一个d),所有这些字母都需要用引号引起来,除非我能够使用v-x代替v\wx。编辑:由于@ETHproductions,节省了3个字节。


如果-s代表字符范围,我认为您可以通过更改<-@ABC为来保存一些字符<-C
ETHproductions'Apr

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

数组包含3个数组,其中键代表0 = W,1 = C,2 = D

在线尝试!


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


2

的JavaScript(ES6),461个 409 404 395 385字节

我坐在公交车上时在手机上写下了原始版的下面的内容,然后又用光了时间来正确打高尔夫球,因此需要进行更多的练习。到目前为止,感谢@ETHproductions的帮助。

直接从问题中复制了键盘字符串,因此将任何错误归咎于Antoine ETH!

这需要表示(对于DVORAK,94 Colemak键盘&188 WORKMAN 0)的键盘布局的整数和字符串的数组作为由钻营参数-例如,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'Apr

让我们看看...您永远不会得到QWERTY输入,因此我认为您可以通过不将Object存储在变量中来节省一些字节。它看起来像s=>[...s].map(c=>({D:"...",C:"...",W:"..."}[k[0]]["...".indexOf(c)]).join``
ETHproductions'Apr

啊哈,是的,我知道有一种方法可以直接在物体上工作,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.;}‡‡

将ID 1用于DVORAK;2适用于COLEMAK和WORKMAN 3
先按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 = Dvorak的,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(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++;}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.