Diberikan input, pindahkan sepanjang keyboard dengan N karakter

19

Tantangan:

Diberikan input apa pun yang dapat diketik pada keyboard, pindahkan teks bersama dengan karakter N.

Ini adalah keyboard QWERTY yang akan digunakan. Anda dapat mengabaikan tombol pengubah (Shift, Caps, Enter, Delete dan Tab). Setelah Anda mencapai satu sisi (misalnya |) putaran kembali, jadi |pergi ke Qjika N = 1.

masukkan deskripsi gambar di sini

Spasi tidak harus dipindahkan (mereka kembali ke ruang saat Anda melewatkan pengubah). Jika shift digunakan untuk mengetik karakter (misalnya !dan @) karakter yang diubah juga harus diketik menggunakan shift (yaitu !pergi ke @tidak 2jika N = 1).

Keyboard UK berbeda dengan ini, tapi tolong gunakan ini sehingga kami dapat membandingkan.

Memasukkan:

Setiap kalimat yang bisa diketik di keyboard di atas diikuti oleh bilangan bulat positif. Tidak ada ukuran maksimum untuk bilangan bulat ini.

Keluaran:

Kalimat yang sama, digeser oleh N.

Contoh:

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

Ini kode golf, jadi kode terpendek menang.

Tim
sumber
Bisakah kita berasumsi bahwa N<= 13Anda perlu menggeser paling banyak 13 untuk kembali ke karakter aslinya?
flawr
1
@ flawr nggak, maaf. Itu bisa berupa nilai positif.
Tim
Bukankah seharusnya contoh "Hello World 7" menjadi "Spggr Oe [g;"?
James Williams
Bukankah seharusnya Hello World 7contohnya Spgge Oe[g;? Keduanya oharus dipetakan dengan karakter yang sama
edc65

Jawaban:

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

Versi yang dapat dibaca dengan spasi putih, termasuk, dll:

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

Kode ini cukup banyak berbicara sendiri. Hanya tabel pencarian yang memetakan dari setiap karakter ke karakter berikutnya, yang diterapkan beberapa kali. Banyak kode sebenarnya untuk menguraikan angka dari input.

Reto Koradi
sumber
@ Ypnypn Anda dapat menggunakan fungsi yang tidak dideklarasikan di C. Jadi, tidak diperlukan untuk membuatnya. Biasanya memberikan peringatan kompiler, tetapi saya telah diberitahu bahwa ini diizinkan selama itu membangun dan berjalan.
Reto Koradi
2

05AB1E , 61 byte

-1 byte terima kasih kepada Kevin Cruijssen

žVDu«1ú`žhÀ“~!@#$%^&*()_+ `ÿ-=ÿ<>?ÿ:"ÿ{}|ÿ,./ÿ;'ÿ[]\“#vyy¹._‡

Cobalah online!

Grimmy
sumber
1

Pyth, 126 byte

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

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

    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
Jakube
sumber
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)]))
James Williams
sumber
Hapus spasi yang tidak perlu di" " for c in " "
mbomb007
0

Python 3, 271 255 byte

Baseline, hampir ungolfed, digunakan untuk membuat kata-kata yang bergeser dalam pertanyaan.

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)

Penjelasan:

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.
Tim
sumber
Saya pikir Anda harus menghapus ini. Biarkan orang lain mengerjakan strategi mereka sendiri ...
mbomb007
@ mbomb007 itu tidak terlalu golf, dan saya menggunakannya untuk membuat mereka ... Saya pikir cukup adil untuk mempostingnya, secara pribadi.
Tim
0

JavaScript (ES6), 200 216

Menggunakan string template, baris baru itu signifikan dan dihitung.

Catatan tentang replace: dua cuplikan string.split('x').map(w=>...)dan string.replace(/[^x]+/g,w=>...)merupakan cara yang sama-sama valid untuk menjalankan fungsi untuk setiap bagian dalam string, menggunakan pemisah. Menggunakan baris baru sebagai pemisah berguna sebagai ganti regexp menjadi /.+/g, karena titik cocok dengan baris yang bukan baris baru. Dan menggunakan string templated baris baru tidak memiliki biaya tambahan.

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>

edc65
sumber
0

CJam, 107 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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.
Dennis
sumber
0

Jelly , 67 byte

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

Cobalah online!

Sebuah link diadik yang menggunakan string sebagai argumen kirinya dan jumlah tempat yang harus digeser sebagai argumen kanannya.

Nick Kennedy
sumber
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()+'  '

Cobalah online!

Chas Brown
sumber