입력이 주어지면 키보드를 따라 N 자씩 이동하십시오.


19

도전 과제 :

키보드로 입력 할 수있는 입력이 있으면 N 문자 씩 텍스트를 이동하십시오.

사용할 QWERTY 키보드는 다음과 같습니다. 수정 자 키 (Shift, Caps, Enter, Delete 및 Tab)는 무시해도됩니다. 한쪽에 도달하면 (예를 들어 |) 루프백 |이 발생하므로 Qif 로갑니다 N = 1.

여기에 이미지 설명을 입력하십시오

공백을 따라 이동할 필요는 없습니다 (수정자를 건너 뛰면 공백으로 돌아갑니다). 변화 (예 : 문자를 입력하는 데 사용 된 경우 !@) 변경된 캐릭터도 변화를 이용하여 입력해야합니다 (즉, !에 이동 @하지 2경우 N = 1).

영국 키보드는 이것과 다르지만 비교할 수 있도록 이것을 사용하십시오.

입력:

위 키보드에서 입력 할 수있는 모든 문장 다음에 양의 정수가옵니다. 이 정수의 최대 크기는 없습니다.

산출:

같은 문장이 N으로 바뀌었다.

예 :

My name is Tim 3
?o .f/y [g I[/
Hello World 7
Spgge Oe[g;
I Wi5h I h4d b3773r C@d3ing ski{{s 3
{ T[8l { l7h ,6006u N%h6[.k g'[QQg

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.


N<= 13원래 캐릭터로 돌아가려면 최대 13 개까지 이동해야 한다고 가정 할 수 있습니까 ?
flawr

1
@flawr 아뇨, 죄송합니다. 양수 값일 수 있습니다.
Tim

"Hello World 7"예제가 "Spggr Oe [g;"가 아니어야합니까?
James Williams

Hello World 7예가 아니어야합니까 Spgge Oe[g;? 두 사람 o은 같은 문자에 매핑해야합니다
edc65

답변:


2

C, 217 바이트

char*t=" @A$%^*a)_(~.=/z-234567890\"'>`?Z#SNVFRGHJOKL:<MP{WTDYIBECUX]q\\&=1snvfrghjokl;,mp[wtdyibecux}Q|!";l,d,k;f(char*s){for(l=strlen(s);s[--l]-32;);d=atoi(s+l);for(s[l]=0;d--;)for(k=l;k--;s[k]=t[s[k]-32]);puts(s);}

공백, 포함 등을 포함한 읽기 가능한 버전 :

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

char* t = " @A$%^*a)_(~.=/z-234567890\"'>`?Z#SNVFRGHJOKL:<MP{WTDYIBECUX]q\\&=1snvfrghjokl;,mp[wtdyibecux}Q|!";
int l, d, k;

void f(char* s) {
    l = strlen(s);
    for( ; s[--l] - 32; );
    d = atoi(s + l);
    s[l] = 0;
    for ( ; d--; ) {
        for (k = l; k--; s[k] = t[s[k] - 32]);
    }
    puts(s);
}

코드는 거의 대부분을 말합니다. 각 문자에서 다음 문자로 매핑되는 룩업 테이블 만 주어진 횟수만큼 적용됩니다. 대부분의 코드는 실제로 입력에서 숫자를 구문 분석하기위한 것입니다.


@Ypnypn C에서 선언되지 않은 함수를 사용할 수 있으므로 빌드에 포함이 필요하지 않습니다. 일반적으로 컴파일러 경고를 제공하지만 빌드하고 실행하는 한 이것이 허용된다는 말을 들었습니다.
Reto Koradi


1

Pyth, 126 바이트

XjdPczdsJc"~!@#$%^&*()_+ `1234567890-= qwertyuiop[]\ QWERTYUIOP{}| asdfghjkl;, ASDFGHJKL:\" zxcvbnm,./ ZXCVBNM<>?")sm.<dvecz)J

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

    czd                       split input by spaces
   P                          remove the last element
 jd                           join by spaces (=#1)

          "..."               string with the chars of each row
         c     )              split by spaces
        J                     assign to J
       sJ                     sum of J (=#2)

                       cz)    split input by spaces
                      e       take the last element
                     v        and evaluate it 
                 m        J   map each row d of J to:
                  .<d           rotate the row d by value
                s             sum (=#3)

X                             Take #1, and replace the chars in #2 by the chars in #3

1

파이썬 3, 311 바이트

*i,s=input().split()
r=["`1234567890-=","qwertyuiop[]\\","asdfghjkl;'","zxcvbnm,./","~!@#$%^&*()_+","QWERTYUIOP{}|",'ASDFGHJKL:"',"ZXCVBNM<>?"]
print("".join([[x[int(s):]+x[:int(s)]for x in r][r.index([x for x in r if c in x][0])][([x for x in r if c in x][0]).index(c)]if c!=" "else " " for c in " ".join(i)]))

" " for c in " "
mbomb007

0

파이썬 3, 271255 바이트

거의 골프가없는 기준선은 질문에서 변화된 단어를 만드는 데 사용됩니다.

x=input().split()
n=int(x[-1])
x=' '.join(x[:-1])
l=['`1234567890-=','qwertyuiop[]\\',"asdfghjkl;'",'zxcvbnm,./', '~!@#$%^&*()_+','QWERTYUIOP{}|','ASDFGHJKL:"','ZXCVBNM<>?',' ']
y=''
for i in x:
 for q in l:
  if i in q:y+=q[(q.index(i)+n)%len(q)]
print(y)

설명:

x=input().split()    # Get input
n=int(x[-1])         # Get N from input
x=' '.join(x[:-1])   # Get the words from input
                     # Create list of letters

l=['`1234567890-=', 'qwertyuiop[]\\',
   "asdfghjkl;'",   'zxcvbnm,./',
   '~!@#$%^&*()_+', 'QWERTYUIOP{}|',
   'ASDFGHJKL:"',   'ZXCVBNM<>?',
   ' ']

y=''                 # Blank string
for i in x:          # Loop through letters in input
    for q in l:      # Loop through items in list
        if i in q:   # Is letter of input in item of list?
            y+=q[                          # Append letter to y
                 (q.index(i)+n)            # locate the letter in item, and add N
                               %len(q)]    # % is modulus, loop to beginning if big
print(y)             # Print out the offset word.

나는 당신이 이것을 삭제해야한다고 생각합니다. 다른 사람들이 자신의 전략을
연습하게 해주세요

@ mbomb007 골프는별로 없었고 그것을 만들 때 사용했습니다 ... 개인적으로 게시하기에는 충분하다고 생각합니다.
Tim

0

자바 스크립트 (ES6), 200 216

템플릿 문자열을 사용하면 줄 바꿈이 중요하고 계산됩니다.

참고 사항 replace: 두 스 니펫 string.split('x').map(w=>...)이며 string.replace(/[^x]+/g,w=>...)구분 기호를 사용하여 문자열의 각 부분에 대해 함수를 실행하는 동일한 방법입니다. /.+/g점이 개행 문자와 일치하지 않기 때문에 바꾸기 정규 표현식이로 바뀌면 개행 문자를 구분 기호로 사용하는 것이 편리합니다 . 또한 템플릿 문자열을 사용하면 줄 바꿈에 추가 비용이 들지 않습니다.

f=(t,d)=>[for(c of t)`~!@#$%^&*()_+
1234567890-=
QWERTYUIOP{}|
qwertyuiop[]\\
ASDFGHJKL:"
asdfghjkl;'
ZXCVBNM<>?
zxcvbnm,./`.replace(/.+/g,r=>(p=r.indexOf(c))<0?0:q=r[(p+d)%r.length],q=c)&&q].join('')

// less golfed
x=(t,d)=>
  [for(c of t)
    '~!@#$%^&*()_+ 1234567890-= QWERTYUIOP{}| qwertyuiop[]\\ ASDFGHJKL:" asdfghjkl;\' ZXCVBNM<>? zxcvbnm,./'
    .split(' ')
    .map(r=>(p=r.indexOf(c))<0?0:q=r[(p+d)%r.length],q=c)&&q
  ].join('')
  
// TEST

out=x=>O.innerHTML+=x+'\n'

;[['Hello World',7,],['My name is Tim',3],['I Wi5h I h4d b3773r C@d3ing ski{{s', 3]]
.forEach(p=>out(p+' -> '+f(p[0],p[1])))
<pre id=O></pre>


0

CJam, 107 바이트

lS/)~\S*\",./ ;'  <>? :\"  _+~!@#$%^&*() -=`"A,s(++S/"zxcvbnm
asdfghjkl
[]\qwertyuiop"N/_32ff^+.+_@fm>s\ser

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

lS/)   e# Read one line from STDIN, split at spaces and pop the last chunk.
~\S*\  e# Evaluate the popped chunk and join the remaining ones back together.
",./ ;'  <>? :\"  _+~!@#$%^&*() -=`"
       e# Push that string.
A,s(++ e# Concatenate it with "1234567890".
S/     e# Split at spaces.
"zxcvbnm asdfghjkl []\qwertyuiop"
       e# Push that string.
S/     e# Split at spaces. (`N/' would split at linefeeds.)
_32ff^ e# XOR each character of a copy with 32.
+      e# Concatenate the copies.
.+     e# Perform vectorized concatenation. This pushes the following array:
          [ ",./zxcvbnm" ";'asdfghjkl" "[]\qwertyuiop" "<>?ZXCVBNM"
           ":\"ASDFGHJKL" "{}|QWERTYUIOP" "_+~!@#$%^&*()" "-=`1234567890" ]
_@fm>  e# Rotate each chunk by the number of character specified in the input.
s\s    e# Flatten this array and the original.
er     e# Perform transliteration.


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