Biorąc pod uwagę dane wejściowe, przesuń je wzdłuż klawiatury o N znaków

19

Wyzwanie:

Biorąc pod uwagę wszelkie dane, które można wpisać na klawiaturze, przesuń tekst o N znaków.

Oto klawiatura QWERTY do użycia. Możesz zignorować klawisze modyfikujące (Shift, Caps, Enter, Delete i Tab). Gdy dojdziesz do jednej (na przykład |) pętli z powrotem, |przejdź do Qif N = 1.

wprowadź opis zdjęcia tutaj

Przestrzenie nie muszą być przenoszone (wracają w przestrzeń, gdy pomijasz modyfikatory). Jeżeli zmiana została wykorzystana do wpisania znaku (np !a @) zmieniony znak powinien być również wprowadzane za pomocą przesunięcia (tj !idzie @nie 2jeśli N = 1).

Klawiatury brytyjskie różnią się od tego, ale proszę użyć tego, abyśmy mogli porównać.

Wejście:

Każde zdanie, które można wpisać na powyższej klawiaturze, po którym następuje dodatnia liczba całkowita. Nie ma maksymalnego rozmiaru tej liczby całkowitej.

Wynik:

To samo zdanie, przesunięte przez N.

Przykłady:

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

To jest kod golfowy, więc wygrywa najkrótszy kod.

Tim
źródło
Czy możemy założyć, że N<= 13skoro będziesz musiał przesunąć maksymalnie o 13, aby powrócić do pierwotnej postaci?
flawr
1
@flawr nie, przepraszam. Może to być dowolna wartość dodatnia.
Tim
Czy przykład „Hello World 7” nie powinien brzmieć „Spggr Oe [g;”?
James Williams
Nie powinien to Hello World 7być przykład Spgge Oe[g;? Obaj opowinni odwzorować tę samą postać
edc65

Odpowiedzi:

2

C, 217 bajtów

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

Czytelna wersja z białymi znakami, zawiera itp .:

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

Kod mówi sam za siebie. Tylko tabela odnośników, która odwzorowuje każdą postać na następną, która jest stosowana określoną liczbę razy. Znaczna część kodu służy do parsowania liczby na wejściu.

Reto Koradi
źródło
@Ypnypn Możesz używać niezadeklarowanych funkcji w C. Zatem dołączenia nie są potrzebne do jego zbudowania. Zwykle daje ostrzeżenia kompilatora, ale powiedziano mi, że jest to dozwolone, dopóki się kompiluje i uruchamia.
Reto Koradi
2

05AB1E , 61 bajtów

-1 bajt dzięki Kevin Cruijssen

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

Wypróbuj online!

Ponury
źródło
1

Pyth, 126 bajtów

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

Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie:

    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
źródło
1

Python 3, 311 bajtów

*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
źródło
Usuń niepotrzebne spacje w" " for c in " "
mbomb007
0

Python 3, 271 255 bajtów

Linia bazowa, prawie nie zmieniona, służyła do tworzenia przesuniętych słów w pytaniu.

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)

Wyjaśnienie:

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
źródło
Myślę, że powinieneś to usunąć. Pozwól innym ludziom wypracować własne strategie ...
mbomb007
@ mbomb007 nie jest zbyt golfistą i użyłem go do ich stworzenia ... Myślę, że to dość uczciwe, aby opublikować to osobiście.
Tim
0

JavaScript (ES6), 200 216

Używając ciągów szablonów, nowe linie są znaczące i zliczane.

Uwaga na temat replace: dwa fragmenty string.split('x').map(w=>...)i string.replace(/[^x]+/g,w=>...)są równie poprawnymi sposobami wykonywania funkcji dla każdej części w ciągu za pomocą separatora. Używanie nowej linii jako separatora jest przydatne, gdy staje się wyrażenie zastępcze /.+/g, ponieważ kropka pasuje do każdej innej niż nowa linia. I przy użyciu ciągów szablonów nowe wiersze nie mają dodatkowych kosztów.

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
źródło
0

CJam, 107 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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
źródło
0

Galaretka , 67 bajtów

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

Wypróbuj online!

Diadadicowe ogniwo przyjmujące ciąg za lewy argument i liczbę miejsc do przesunięcia jako prawy argument.

Nick Kennedy
źródło
0

Python 2 , 194 bajtów

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

Wypróbuj online!

Chas Brown
źródło