键盘移位密码


21

给出以下输入:

  • 一个整数n,其中n > 0
  • 字符串s,其中s不能为空且s~=[0-9A-Z]+(仅字母数字大写)。

使用标准的简化QWERTY键盘(如下所示):

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

执行以下操作:

  • 找到每个字符在键盘上的原始行。
  • 根据字母的n原始位置+ n将其替换为正确的等价字母。
    • EG s="AB"and n=2A将成为DB并将成为M
  • 如果为keyboard_row[position + n] > keyboard_row.length,请重新开始。
    • EG s="0P"and n=20将成为2P并将成为W

例子:

f("0PLM",1)    = 1QAZ
f("ZXCVB",2)   = CVBNM
f("HELLO",3)   = LYDDW
f("0PLM",11)   = 1QSV
f("0PLM",2130) = 0PHX

规则


这比乍看之下要困难一些。


2
我们是否可以将输入作为字符数组而不是字符串?目前以我们
为准

@KevinCruijssen 肯定地耸了耸肩,这并不太奇怪。除非它为您节省了打平领带的麻烦,否则我不是在抱怨。
魔术章鱼缸

Answers:


11

果冻,13个字节

ØQØDṭ,ṙ€¥⁸F€y

在线尝试!

怎么运行的

ØQØDṭ,ṙ€¥⁸F€y  Main link. Left argument: n (integer). Right argument: s (string)

ØQ             Qwerty; set the return value to
               ["QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM"].
  ØD           Digits; yield "0123456789".
    ṭ          Tack, yielding ["QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM", "0123456789"].
        ¥⁸     Call the two links to the left as a dyadic chain, with right
               argument n.
      ṙ€       Rotate each string in the array n units to the left.
     ,         Yield the pair of the unmodified and the rotated string array.
          F€   Flatten each, mapping, e.g., ["QWERTYUIOP", ..., "0123456789"] to
               "QWERTYUIOPASDFGHJKLZXCVBNM0123456789".
            y  Translate s according to the mapping we've built.

2
果冻内置键盘布局吗?
魔术章鱼缸

4
@MagicOctopusUrn不,现在只有QWERTY :-P
暴民埃里克(Erik the Outgolfer)

13个字节?那应该是哪个字符集?在UTF-8中,它是26个字节!
Cephalopod

2
@Cephalopod Jelly使用Jelly代码页
丹尼斯

9

Python 2,110个字节

lambda s,n,y='1234567890'*99+'QWERTYUIOP'*99+'ASDFGHJKL'*99+'ZXCVBNM'*99:''.join(y[y.find(c)+n%630]for c in s)

在线尝试!

这使用足够大的字符串(每行99个副本)和行长度之间的LCM(630)来找到正确的替换,从而避免了每行之间的单独校正。


7

爪哇8,159个 158字节

n->s->{for(int i=s.length,j;i-->0;)for(String x:"1234567890;QWERTYUIOP;ASDFGHJKL;ZXCVBNM".split(";"))if((j=x.indexOf(s[i])+n)>=n)s[i]=x.charAt(j%x.length());}

-1字节,感谢@OlivierGrégoire修改了输入数组,而不是直接打印。

说明:

在线尝试。

n->s->{  // Method with integer and character-array parameters, and no return-type
  for(int i=s.length,j;i-->0;)
         //  Loop over the input character-array with index
    for(String x:"1234567890;QWERTYUIOP;ASDFGHJKL;ZXCVBNM".split(";"))
         //   Inner loop over the qwerty-lines
      if((j=x.indexOf(s[i])+n)>=n)
         //    If the current qwerty-line contains the character
         //     Set `j` to the index of this character on that line + input `n`
        s[i]=x.charAt(j%x.length());}
         //     Replace the character at index `i`
         //     with the new character (at index `j` modulo length_of_qwerty_line)

1
158个字节,以输入-输出为代价char[]
奥利维尔·格雷戈尔(OlivierGrégoire),

5

视网膜,49字节

"$&"+T`9o`dQW\ERTYUI\OPQASDFG\HJK\LAZXC\VBNMZ
0A`

在线尝试!接受输入ns在单独的行上。说明:

"$&"+

重复n次数。

T`9o`dQW\ERTYUI\OPQASDFG\HJK\LAZXC\VBNMZ

将所有字符向右移动一键。

0A`

删除n


5

JavaScript(ES6),101 99字节

以currying语法接受输入(s)(n)。适用于字符数组。

s=>n=>s.map(c=>(S='1QAZ2WSX3EDC4RFV5TGB6YHN7UJM8IK_9OL_0P')[(p=S.search(c)+n*4)%(-~'9986'[p%4]*4)])

测试用例

怎么样?

我们在交织键盘行的字符串S中寻找输入的每个字符的位置p:前4个字符为“ 1QAZ”(键盘的第一列),后4个字符为“ 2WSX”(第二列)键盘)等等。未使用的职位用下划线填充,而最后一个则简单地丢弃。

col # | 0    | 1    | 2    | 3    | 4    | 5    | 6    | 7    | 8    | 9
------+------+------+------+------+------+------+------+------+------+---
row # | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 01
------+------+------+------+------+------+------+------+------+------+---
char. | 1QAZ | 2WSX | 3EDC | 4RFV | 5TGB | 6YHN | 7UJM | 8IK_ | 9OL_ | 0P

这使我们能够轻松地使用p mod 4标识行,并且无需在行之间使用显式分隔符。

我们前进4n个位置,为此行应用正确的模(分别为40、40、36和28),并选择在S中此新位置找到的替换字符。



3

C, 152个  149字节

感谢@gastropner节省了三个字节!

j,l;f(S,n){for(char*s=S,*k;*s;++s)for(k="1234567890\0QWERTYUIOP\0ASDFGHJKL\0ZXCVBNM\0";l=strlen(k);k+=l+1)for(j=l;j--;)k[j]-*s||putchar(k[(j+n)%l]);}

在线尝试!

展开:

j,l;
f(S,n)
{
    for (char*s=S, *k; *s; ++s)
        for (k="1234567890\0QWERTYUIOP\0ASDFGHJKL\0ZXCVBNM\0"; l=strlen(k); k+=l+1)
            for (j=l; j--;)
                k[j]-*s || putchar(k[(j+n)%l]);
}

我正在产生幻觉,或者可以将内部循环更改为,for(j=l;j--;)但是我不知道为什么不进行任何其他更改。不过,应该让你到149.
gastropner

@gastropner嗯,是的,搜索顺序无关紧要,因此可以正常工作。谢谢!
Steadybox

2

红色,152字节

f: func[s n][foreach c s[foreach[t l]["1234567890"10"QWERTYUIOP"10"ASDFGHJKL"9"ZXCVBNM"7][if p: find t c[if(i:(index? p)+ n // l)= 0[i: l]prin t/(i)]]]]

在线尝试!

取消高尔夫:

f: func [s n][1
    foreach c s [
        foreach [t l] ["1234567890"10"QWERTYUIOP"10"ASDFGHJKL"9"ZXCVBNM"7][
            p: find t c
            if p [ 
                i: (index? p) + n // l
                if i = 0 [i: l]
                prin t/(i) ]]]]


1

Perl 5,94 + 1(-p)= 95字节

$s=<>;for$i(1234567890,QWERTYUIOP,ASDFGHJKL,ZXCVBNM){eval"y/$i/".(substr$i,$s%length$i)."$i/"}

在线尝试!


该死,我没看到你的答案。它们基本上是相同的,随时使用我的优化方法,我将删除答案。让我知道,如果没有,我将删除此评论:)
Dom Hastings

@DomHastings它们足够不同。请两者都保留。我喜欢看到方法上的变化。我向所有人学习...
Ton Hospel '18

1

Japt,20个字节

用完晚餐的大门,打高尔夫球和更多的解释。

;£=D·i9òs)æøX)gV+UbX

试试吧


1

Perl,59 58 57 56字节

包括+用于-p

在STDIN上输入2行,首先是字符串,然后是重复

(echo 0PLM; echo 2130) | perl -pe '$a="OPQWERTYUILASDF-MZXCVBNM0-90";eval"y/HI$a/J$a/;"x<>'

哇,我简直不敢相信你有29字节是我的!我本来就很满意...
Dom Hastings '18


0

干净144个 119字节

import StdEnv

\n s=[l.[(i+n)rem(size l)]\\c<-s,l<-["1234567890","QWERTYUIOP","ASDFGHJKL","ZXCVBNM"],i<-[0..]&j<-:l|j==c]

在线尝试!

带签名的Lambda函数 Int ![Char] -> [Char]


0

红宝石,101字节

->s,n{n.times{s.tr! '1234567890QWERTYUIOPASDFGHJKLZXCVBNM','2345678901WERTYUIOPQSDFGHJKLAXCVBNMZ'};s}

在线尝试!

老实说,我对“聪明”的方法做不到更好的选择感到失望。我最接近的是

a=%w{1234567890 QWERTYUIOP ASDFGHJKL ZXCVBNM}
b=a.map{|r|r[1..-1]<<r[0]}*''
a*=''
n.times{s.tr! a,b}

净收益为7个字符。

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.