타이핑하지만 왼쪽에 [닫힘]

배경

회의 메모를 작성하는 작업이 제공되었습니다. Google 문서에 입력하기 시작했지만 회의 중에 입력하는 동안 키보드를 볼 시간이 충분하지 않습니다.

다행히도 키보드를 보지 않고도 입력 할 수 있습니다. 회의 후에는 입력 한 모든 것이 왼쪽의 열쇠라는 것을 알게됩니다.

도전

이 문제를 해결하기 위해 QWERTY 키보드 레이아웃의 문자, 숫자 및 스페이스 바를 사용하게됩니다.

  • 표준 입력 방법으로 텍스트를 입력하면 모든 문자가 키보드에서 왼쪽으로 하나씩 이동하는 결과 텍스트를 출력합니다.

    • 문자의 대부분을 위해, 단지 문자를보고 (왼쪽 문자로 번역 c된다 x, t된다 r, 등).

    • letter의 q경우 리터럴 탭 문자 ( \t)로 변환하십시오 .

    • letter의 a경우 caps lock을 활성화하여 나머지 문자열의 대소 문자를 바꾸십시오.

    • 편지 쓰기를 들어 z, 문자열의 다음 문자를 대문자로.

    • 스페이스 바에는 번역이 필요하지 않습니다.

  • 번역하는 동안 대문자를 유지하고 캡 잠금에 유의하십시오 (캡 잠금이 활성화 된 경우 대소 문자가 반대인지 확인).

  • 입력 문자열의 모든 문자는 문자, 숫자 또는 공백입니다. 문장 부호 나 다른 문자는 포함 할 수 없습니다.

테스트 사례

\t 리터럴 탭 문자입니다

Hello world    -> Gwkki qieks
Code Golf      -> Xisw Fikd
Queried apples -> \tyweuws OOKWA

채점

바이트 단위의 최저 점수가 이깁니다. 즐기세요!



답변

자바 스크립트 (V8) , 271 바이트

f=(s,k='~!@#$%^&*()_+`1234567890-=\tQWERTYUIOP{}|\tqwertyuiop[]\\ASDFGHJKL:"\n\\asdfghjkl;\'ZXCVBNM<>?zxcvbnm,./')=>s.replace(/[^ ]/g,c=>k[k.indexOf(c)-1]).replace(/\\([^\\]*)\\?/g,(m,c)=>c.replace(/[a-zA-z]/g,l=>l>'Z'?l.toUpperCase():l.toLowerCase())).replace(/[?']/,"")

온라인으로 사용해보십시오!
내 첫 JavaScript 코드 골프. 확실히 더 짧을 수 있지만 이것이 좋은 시작이라고 생각합니다.
기본적으로 k문자열 에서 각 문자를 찾아서 이전 문자로 바꾼 다음 Aor 사이의 모든 경우 를 바꾸고 or의 a모든 발생을 제거합니다 (shift 키는 자체적으로 아무것도하지 않기 때문에).
일반적인 QWERTY 키보드 레이아웃이어야하지만 그렇지 않은 경우 알려주십시오.Zz


답변

파이썬 3 , 211 바이트

d=' ~!@#$%^&*()`~1!2@3#4$5%6^7&8*9(0)		qQwWeErRtTyYuUiIoOpPaAsSdDfFgGhHjJkKlLzZxXcCvVbBnNmM  '
c=s=0
for i in input():k=d.find(i);print(end=d[k-2+(c*i.isalpha()^s)*(1-k%2*2)][i in'aAzZ':]);c^=i in'aA';s=i in'zZ'

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

일반 문자와 해당 시프트 수정 버전이 함께 그룹화 된 조회 문자열을 사용합니다. 입력의 각 문자에 대해 왼쪽에서 두 자리의 문자를 검색합니다. 부가하여 대문자를 변경 1(또는 -1이동 XOR 캡 로크가 활성화 될 때 상기 룩업 값에 현재 문자가 대문자 인 경우). 숫자는 캡 잠금 수정 자의 영향을받지 않습니다.


답변

PHP , 227 바이트

for(;''<$s=$argn[$i++];)$s!=a&&$s!=A?$s!=z&&$s!=Z?($t=$m[stripos($m='~1!2@3#4$5%6^7&8*9(0	qwertyuiopasdfghjklzxcvbnm',$s)-1])+(print$s>' '?$s<A?!$h?$s-1?$s?$s-1:9:'`':$t:($t>=A&&(($s<a)+$h+$c)%2?$t^' ':$t):$s)+$h=0:$h=1:$c=!$c;

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

~1!2@3#4$5%6^7&8*9(0 qwertyuiopasdfghjklzxcvbnm각 숫자마다 왼쪽에 SHIFT 모드가 있고 각 문자마다 왼쪽에 문자 / 키가 있는 매핑 문자열 ( )을 만들었습니다 .

입력 문자와 각 문자를 반복합니다.

  • 문자가 a또는 인 A경우 caps lock 플래그가 반대로됩니다 (논리적 아님).
  • 문자가 z또는 인 Z경우 shift 플래그는로 설정됩니다 1.
  • 캐릭터가 아닌 경우 aAzZ:
    • 매핑 문자열에서 현재 문자 왼쪽의 문자가에 저장됩니다 $t.
    • 현재 문자가 공백이면 인쇄됩니다.
    • 현재 문자가 숫자이며, 시프트 플래그 값의 경우 1, $t인쇄 된 숫자 인 경우, 다른, 1, `자리 인 경우, 인쇄 0, 9인쇄와 달리, digit-1인쇄된다.
    • 현재 문자가 문자 인 경우, 시프트 플래그의 상태에 따라 대문자 또는 대문자로 대문자 잠금 플래그 및 현재 문자의 대소 문자 (소문자 / 대문자) $t가 인쇄됩니다. 여기서 유일한 특수한 경우는 탭 문자이며 그대로 인쇄됩니다.
    • Shift 플래그는 항상 0끝에 다시 설정됩니다 .

답변

빨강 , 218 바이트

func[t][c: z: 0 rejoin collect[foreach s t[case[find"Aa"s[c: c xor 32]find"Zz"s[z: 32]on
[keep(select/case"  poiuytrewq^-lkjhgfdsamnbvcxzPOIUYTREWQ^-LKJHGFDSAMNBVCXZ0987654321~"s)xor either s <#"Z"[0][c xor z]z: 0]]]]]

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

현재 AaZz숫자에는 영향을 미치지 않습니다.


답변

C (gcc) , 276 바이트

i;j;k;h;l;m;n;o;f(char*b){char*c=calloc(m=strlen(b),1),*a=" \tqwertyuiop\aasdfghjkl\nzxcvbnm\tQWERTYUIOP\aASDFGHJKL\nZXCVBNM`1234567890";for(i=k=j=n=0;j<=m;l=a[i=index(a,b[j++])-a-1])k=l^7?k:!k,o=l>64&l<91?a[i-30*k]:l<97?h=i?l^7?l?l^10?l:0:32:0:0:a[i+29*k],o?c[n++]=o:n;b=c;}

-33 바이트의 ceilingcat 덕분입니다.

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