키보드 쉬프트 암호


21

다음과 같은 입력이 주어집니다.

  • 정수 n입니다 n > 0.
  • 문자열 비어 있지 및 (영숫자 수도에만 해당).sss~=[0-9A-Z]+

표준 간소화 된 QWERTY 키보드 사용 (아래 참조) :

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

다음 작업을 수행하십시오.

  • 키보드에서 각 문자가있는 원래 행을 찾으십시오.
  • n원래 위치 + n 을 기준 으로 문자를 올바른 이동 된 문자로 바꿉니다 .
    • EG s="AB"n=2:이 A될 것입니다 DB될 것입니다 M.
  • 인 경우 keyboard_row[position + n] > keyboard_row.length시작 부분으로 돌아갑니다.
    • EG s="0P"n=2:이 0될 것입니다 2P될 것입니다 W.

예 :

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

규칙

  • 이것은 , 가장 낮은 바이트 수의 승리입니다.

언뜻보기보다 약간 어렵습니다.


2
문자열 대신 문자 배열로 입력을받을 수 있습니까? 현재 우리 가정 만 물어 잊었다 ..
케빈 Cruijssen에게

@KevinCruijssen는 어깨를 으쓱 너무 엉뚱한 아니라, 확인합니다. 넥타이를 끊을 바이트를 절약하지 않으면 불평하지 않습니다.
Magic Octopus Urn

답변:


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
젤리에 키보드 레이아웃이 내장되어 있습니까?
Magic Octopus Urn

4
@MagicOctopusUrn 아니오, 지금 QWERTY 만 :
-P

13 바이트? 어떤 문자 집합을 사용해야합니까? UTF-8에서는 26 바이트입니다!
Cephalopod 2019

2
@Cephalopod Jelly는 Jelly 코드 페이지를 사용합니다 .
Dennis

9

파이썬 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

Java 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());}

@ OlivierGrégoire가 직접 인쇄하는 대신 입력 배열을 수정함으로써 -1 바이트 .

설명:

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

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[].
Olivier Gré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

자바 스크립트 (ES6), 101 99 바이트

카레 구문으로 입력을 (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 바이트

3 바이트를 절약 한 @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


1

펄, 59 58 57 56 바이트

포함 +을 위해-p

STDIN에 입력을 두 줄로, 먼저 문자열을 입력 한 다음 반복하십시오.

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

와우, 나는 당신이 내 29 바이트를 가지고 있다고 믿을 수 없다! 나는 원래 그것으로 꽤 행복했습니다 ...
Dom Hastings



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 문자의 순 이득.

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