Đưa ra một đầu vào, di chuyển nó dọc theo bàn phím bằng N ký tự


19

Các thách thức:

Cho bất kỳ đầu vào nào có thể được gõ trên bàn phím, di chuyển văn bản theo N ký tự.

Đây là bàn phím QWERTY được sử dụng. Bạn có thể bỏ qua các phím bổ trợ (Shift, Caps, Enter, Delete và Tab). Khi bạn đạt đến một vòng (ví dụ |) vòng lặp trở lại, vì vậy hãy |đi đến Qnếu N = 1.

nhập mô tả hình ảnh ở đây

Không gian phải được di chuyển dọc (chúng quay trở lại không gian khi bạn bỏ qua các sửa đổi). Nếu thay đổi được sử dụng để gõ ký tự (ví dụ !@) các nhân vật đã thay đổi cũng cần được gõ bằng sự thay đổi (tức là !đi vào @không 2nếu N = 1).

Bàn phím của Anh khác với điều này, nhưng vui lòng sử dụng bàn phím này để chúng tôi có thể so sánh.

Đầu vào:

Bất kỳ câu nào có thể được gõ trên bàn phím trên theo sau là một số nguyên dương. Không có kích thước tối đa cho số nguyên này.

Đầu ra:

Cùng một câu, chuyển theo N.

Ví dụ:

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

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng.


Chúng tôi có thể giả định rằng N<= 13bạn sẽ cần thay đổi tối đa 13 để trở về nhân vật ban đầu không?
flawr 17/05/2015

1
@flawr không, xin lỗi. Nó có thể là bất kỳ giá trị tích cực.
Tim

Không phải ví dụ "Hello World 7" là "Spggr Oe [g;"?
James Williams

Không nên là Hello World 7ví dụ Spgge Oe[g;? Cả hai onên ánh xạ tới cùng một nhân vật
edc65

Câu trả lời:


2

C, 217 byte

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

Phiên bản có thể đọc được với khoảng trắng, bao gồm, v.v .:

#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);
}

Các mã nói khá nhiều cho chính nó. Chỉ cần một bảng tra cứu ánh xạ từ mỗi ký tự sang ký tự tiếp theo, được áp dụng số lần đã cho. Phần lớn mã thực sự là để phân tích số ra khỏi đầu vào.


@Ypnypn Bạn có thể sử dụng các hàm không được khai báo trong C. Vì vậy, bao gồm không cần thiết cho nó để xây dựng. Nó thường đưa ra các cảnh báo về trình biên dịch, nhưng tôi được cho biết rằng điều này được cho phép miễn là nó được xây dựng và chạy.
Reto Koradi 17/05/2015


1

Bình thường, 126 byte

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

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

    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

Python 3, 311 byte

*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)]))

Xóa các khoảng trống không cần thiết trong" " for c in " "
mbomb007 17/05/2015

0

Python 3, 271 255 byte

Đường cơ sở, gần như vô căn cứ, được sử dụng để tạo ra các từ thay đổi trong câu hỏi.

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)

Giải trình:

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.

Tôi nghĩ bạn nên xóa cái này. Hãy để những người khác vạch ra chiến lược của riêng họ ...
mbomb007 17/05/2015

@ mbomb007 nó không được chơi gôn lắm và tôi đã sử dụng nó để tạo ra chúng ... Tôi nghĩ rằng nó đủ công bằng để đăng nó, cá nhân.
Tim

0

JavaScript (ES6), 200 216

Sử dụng chuỗi mẫu, các dòng mới là đáng kể và được tính.

Lưu ý về replace: hai đoạn mã string.split('x').map(w=>...)string.replace(/[^x]+/g,w=>...)là những cách hợp lệ như nhau để thực thi một hàm cho từng phần trong chuỗi, sử dụng dấu phân cách. Sử dụng một dòng mới làm dấu phân cách rất tiện lợi khi regrec thay thế trở thành /.+/g, bởi vì dấu chấm khớp với bất kỳ dòng không mới nào. Và sử dụng chuỗi templated, các dòng mới không có thêm chi phí.

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 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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.

0

Thạch , 67 byte

ØDṙ1ṭØQ;Øq;"“{}|“:"“<>?“-=`“[]\“;'“,./“~!@#$%^&*()_+“ ”
¢œiⱮ+2¦€œị¢

Hãy thử trực tuyến!

Một liên kết dyadic lấy chuỗi làm đối số bên trái của nó và số lượng vị trí để thay đổi làm đối số bên phải của nó.


0

Python 2 , 194 byte

f=lambda s,n:n and f(''.join(B[B.find(c)+1]for c in s),n-1)or s
A='qwertyuiop%sqasdfghjkl%sazxcvbnm%sz'
B='`1234567890-=`~!@#$%^&*()_+~'+A%('[]\\',";'",',./')+(A%('{}|',':"','<>?')).upper()+'  '

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.