修复我的胖手指


21

高尔夫挑战赛

我有一个问题,我的手指很胖,我经常在键盘上向右滑动一个键。

随着时间的流逝,这种担心恐怕会越来越糟。

偷听我做的每一次按键操作;向右移shifte pne!

Befpre然后我想要一个程序(或functipn)将每个按键自动移回左键。

我将确保在其余的时间里把我的巨蛋打起来,以免引起仇视!


目的:

编写一个程序或函数,该程序或函数在标准QWERTY键盘上接受以下绿色键之一的输入,并在其左侧返回键的字符。在此处输入图片说明


条件:

•您可以假定运行此程序的人正在使用QWERTY键盘,如上图所示。

•输入和输出都不区分大小写,对于此挑战,您可以使用任何大小写(或大小写混合),并且如果需要,还可以假设所有输入都处于一种情况。

•如果由于某种原因您的语言无法允许用户输入返回键,则您可能会为此忽略一次击键

•这个挑战仅仅是按键的默认值,例如,如果该4键被按下,你可以假设它总是会4永不$

•您可以假设仅会按下绿色键。


例子Input-> Output

S-> a
4-> 3
=-> -
[->p


这是,因此字节数最短的程序将获胜!


您能提供测试用例吗?
Kritixi Lithos

1
@KritixiLithos Certaimly!我现在就编辑tjat @
Albert Renshaw

你是说]-> [吗?
shooqie


3
您可能不在乎,但这是一个有趣的琐事:这是ANSI键盘布局。请注意Enter键上方的反斜杠;与ISO键盘相反,在ISO键盘中,反斜杠按钮位于Z的左侧。(它也是美式的,但是更容易识别!)
Doddy

Answers:


7

Ruby,76 71 69字节

->a{"`1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm,./"[/.#{a}/][0]}

5

Perl 6的87个 83 69字节

{[Q"`1234567890-=qwertyuiop[]\asdfghjkl;'
zxcvbnm,./".comb].&{%(.[1..*]Z=>$_)}{$_}}

{~Q"`1234567890-=qwertyuiop[]\asdfghjkl;'
zxcvbnm,./".match(/.)>$_/)}

在线尝试!

想知道是否有一种方法可以将硬编码的字符串编码为更短的内容...

(窃取GB的正则表达式为-14个字节。)


1
也许如果我们有$"这个范围可以节省一些字符
-Ven

5

果冻34 33字节

ØD”`1¦ṭØqż“[]\“;'¶“,./“0-=”Fṡ2UZy

在线尝试!

怎么运行的

ØD”`1¦ṭØqż“[]\“;'¶“,./“0-=”Fṡ2UZy  Main link. Argument: s (string)

ØD                                 Digits; yield "0123456789".
  ”`1|                             Replace '0' with a backtick.
       Øq                          Qwerty; yield
                                   ["qwertyuiop", "asdfghjkl", "zxcvbnm"].
      ṭ                            Tack; add "`123456789" as the last element of
                                   the qwerty array.
          “[]\“;'¶“,./“0-=”        Yield ["[]\\", ";'\n", "0-="].
         ż                         Zip; combine the strings of the array to the
                                   left with the corresponding strings of the array
                                   to the right, yielding an array of string pairs.
                           F       Flatten, yielding a string.
                            ṡ2     Obtain all overlapping pairs of characters.
                              U    Upend; reverse each pair.
                               Z   Zip, yielding a pair of strings.
                                y  Translate the input s according to the generated
                                   replacement table.

3
我不认识Jelly,您可以添加代码说明吗?我很好奇您如何不用输入整个键盘的字符串文字就能摆脱
困境

1
我还没有时间,但是我会尽快添加一个解释。
丹尼斯,

1
做完了 我也打了一下。
丹尼斯,

1
Øq漂亮!我喜欢这个,谢谢!
艾伯特·伦肖

4

Python 3,85 78字节:

lambda x,k="`1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm<>?":k[k.‌​find(x)-1]

1
您可以使用1 lambda将该字符串作为可选参数传递:lambda x,k="1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm<>?":k[k.find(x)-1]减少几个字节
Rod

好点,我补充一下。
L3viathan

我认为您需要在1的左侧打个勾
。– xnor

@xnor对,修复它。
L3viathan

4

Python,76个字节

s="1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm<>?"
dict(zip(s,'`'+s)).get

在线尝试!

制作一个字典,该字典通过将字符串的移位版本压缩到拉链中,将每个键向左移。最下面的是函数,最上面的是定义。

使用translate创建映射可以提供更长的解决方案。在线尝试!

lambda s:s.translate("';"*22+"_0__9`12345678_LM-<>_\\VXSWDFGUHJKNBIO=EARYCQZT\nP][___"*4)

4

视网膜53 51字节

T`1-90\-=QW\ERTYUI\OP[]\\ASDF-HJ-L;'¶ZXCVBNM,./`\`o

在线尝试!

一个简单的音译,将每个字符向后移1个位置。从1到的所有内容都是/原始字符集,而下一部分是新的字符集,o用于表示其他字符集。

H并且L是视网膜中音译的特殊字符类(分别映射到十六进制数字和大写字母),但是幸运的是,它们出现在键盘上按字母顺序排列的序列(FGHJKL)中,因此我们可以通过将它们放在范围内并像这样获得它们来避免转义2个字节。


3

C ++,109个字节

void f(char i){std::string k="`1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm,./";std::cout<<k[k.find(i)-1];}

在线尝试!


3

TI基本(70字节)

我怀疑它会比这更短...

Input Str1
"`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./
sub(Ans,inString(Ans,Str1)-1,1

PS的两个字节令牌Str1`\sub(,和inString(


3

V57 54 51字节

感谢@ nmjcman101节省了3个字节,hxVp而不是使用多行键盘

i`¬190-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./<esc>/<C-r>a
hxVp

在线尝试!

<esc>0x1b<c-r>0x12

注意:这不支持回车键

包含不可打印的东西,所以这是十六进制转储

00000000: 6960 ac31 3930 2d3d 7177 6572 7479 7569  i`.190-=qwertyui
00000010: 6f70 5b5d 5c61 7364 6667 686a 6b6c 3b27  op[]\asdfghjkl;'
00000020: 7a78 6376 626e 6d2c 2e2f 1b2f 1261 0a68  zxcvbnm,././.a.h
00000030: 7856 70                                  xVp

说明

大多数程序都会生成键盘。i进入插入模式,其后的每个字符都会打印到缓冲区。但是这里有一个小问题,¬19在1到9之间插入字符。

程序在处退出插入模式<esc>。然后在这里/<c-r>a搜索缓冲区中的参数。这会将光标移到找到的字符的顶部。

h                  " move the cursor to the left
 x                 " delete this character
  Vp               " select this line and replace it with the deleted character

我不是100%,但是我想代替hylHVGp@DJMcMayhem可以解决摩托车问题hxVp。我不确定为什么要把它G放在那里,不是都一行吗?也dhVp将工作。
nmjcman101 '17

@ nmjcman101啊,是的,G自从键盘以前是多行的时候,我一定一直保留着。谢谢!
Kritixi Lithos

2

PowerShell,82个字节

$k="1234567890-=qwertyuiop[]\asdfghjkl;'
zxcvbnm,./";$k[$k.IndexOf((read-host))-1]

支持Enter键,但是不能使用Enter键进行测试,Read-Host因为在PowerShell中按无值的Enter键不会返回任何结果。


2

Japt56 42字节

;D=Dv ·q i"[]\\",A i";'",22 +",./")Dg1nDbU

说明

;D=Dv ·q i"[]\\",A i";'",22 +",./")Dg1nDbU

;D=D                                        // Shortcut for QWERTY (with newlines and spaces), assigning to variable D
    v                                       // Setting D to lowercase
      ·q                                    // Joining D into an array with no spaces or newlines
        i"[]\\",A                          // Inserting "[]\" into index 10 (A)
                   i";'",22                 // Inserting ";'" into index 22
                           +",./"           // Appending ",./"
                                  Dg        // Returns the character at index:
                                    1n      //    -1+
                                       DbU  //     Index of U (the input)

在线尝试!


这很酷,您可以添加一个说明吗?
艾伯特·伦肖

1
@AlbertRenshaw添加了说明。
奥利弗·

2

Java 8,99字节

c->{String r="`1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm,./";return r.charAt(r.indexOf(c)-1);}

说明:

在这里尝试。

c->{                // Method with character as both parameter and return-type
  String r="`1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm,./";
                    //  Literal String of the qwerty keyboard layout of the challenge
  return r.charAt(  //  Return the character at the following index:
    r.indexOf(c)    //   The index of the input character
    -1);            //   -1 to shift it to the left
}                   // End of method

1
我放弃。我试图用正则表达式来做到这一点,但我惨败用一些特殊字符... c->"`1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm,./".replaceAll("(?s).*(.)"+c+".*","$1")
奥利维尔·格雷戈尔(OlivierGrégoire),

2

JavaScript(ES6),74个字节

c=>(s=".,mnbvcxz\n';lkjhgfdsa\\][poiuytrewq=-0987654321`")[s.indexOf(c)+1]

由于/不在我的字符串中,所以indexOf返回-1,当递增时,将导致.输出。93个字节来处理字符串:

s=>s.replace(/./g,c=>s[s.indexOf(c)+1],s="><mnbvcxz\n';lkjhgfdsa\\][poiuytrewq=-0987654321`")

@KevinCruijssen感谢您发现我不小心移动了这三个键。我现在不动他们了。
尼尔

1

GNU sed,72 + 1(r标志)= 73个字节

s:$:`1234567890-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm,./:
s:(.).*(.)\1.*:\2:

返回键无法测试,因为设计使用sed会将输入\n用作定界符,然后将脚本运行多少行。

测试运行:连续的输入输出对(完成后按Ctrl + D或Ctrl + C)

me@LCARS:/PPCG$ sed -rf shift_key.sed
s
a
4
3
=
-
a
\
1
`
\
]

1

05AB1E,50个字节

'`žhÀ"-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm,./"JDÀ‡

在线尝试!

说明:

'`                                                  # 1 char string: `
  žh                                                # Push numbers 0123456789
    À                                               # Rotated 1 left (123456890)
     "-=qwertyuiop[]\\asdfghjkl;'\nzxcvbnm,./"      # Push string literal
                                              J     # Join all elements pushed to the stack to one string
                                               D    # Duplicate
                                                À   # Rotate 1 left
                                                 ‡  # Transliterate: a.get(b.indexOf(input))

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.