El cifrado de cambio de teclado

21

Dada la siguiente entrada:

  • Un número entero ndonde n > 0.
  • Una cadena sdonde sno está vacía y s~=[0-9A-Z]+(solo mayúsculas alfanuméricas).

Usando un teclado QWERTY simplificado estándar (como se muestra a continuación):

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

Realice la siguiente operación:

  • Encuentra la fila original en la que se encuentra cada personaje en el teclado.
  • Reemplace la letra con el equivalente desplazado correcto nbasado en su posición original + n.
    • EG s="AB"y n=2: Ase convertiría Dy Bse convertiría M.
  • Si keyboard_row[position + n] > keyboard_row.length, vuelve al inicio.
    • EG s="0P"y n=2: 0se convertiría 2y Pse convertiría W.

Ejemplos:

f("0PLM",1)    = 1QAZ
f("ZXCVB",2)   = CVBNM
f("HELLO",3)   = LYDDW
f("0PLM",11)   = 1QSV
f("0PLM",2130) = 0PHX

Reglas


Esto es un poco más difícil de lo que parece a primera vista.

Urna de pulpo mágico
fuente
2
¿Se nos permite tomar la entrada como una matriz de caracteres en lugar de una cadena? Actualmente asumí que, pero se olvidó de preguntar ..
Kevin Cruijssen
@KevinCruijssen se encoge de hombros , no es demasiado extravagante. A menos que te ahorre un byte para romper un empate, no me quejo.
Urna mágica de pulpo

Respuestas:

11

Jalea , 13 bytes

ØQØDṭ,ṙ€¥⁸F€y

Pruébalo en línea!

Cómo funciona

ØQØDṭ,ṙ€¥⁸F€y  Main link. Left argument: n (integer). Right argument: s (string)

ØQ             Qwerty; set the return value to
               ["QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM"].
  ØD           Digits; yield "0123456789".
    ṭ          Tack, yielding ["QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM", "0123456789"].
        ¥⁸     Call the two links to the left as a dyadic chain, with right
               argument n.
      ṙ€       Rotate each string in the array n units to the left.
     ,         Yield the pair of the unmodified and the rotated string array.
          F€   Flatten each, mapping, e.g., ["QWERTYUIOP", ..., "0123456789"] to
               "QWERTYUIOPASDFGHJKLZXCVBNM0123456789".
            y  Translate s according to the mapping we've built.
Dennis
fuente
2
Jelly tiene incorporados diseños de teclado, ¿eh?
Urna mágica del pulpo
44
@MagicOctopusUrn No, solo QWERTY en este momento :-P
Erik the Outgolfer
13 bytes? ¿Qué conjunto de caracteres se supone que es ese? ¡En UTF-8 son 26 bytes!
Cefalópodo
2
@Cephalopod Jelly usa el página de códigos Jelly .
Dennis
9

Python 2 , 110 bytes

lambda s,n,y='1234567890'*99+'QWERTYUIOP'*99+'ASDFGHJKL'*99+'ZXCVBNM'*99:''.join(y[y.find(c)+n%630]for c in s)

Pruébalo en línea!

Esto utiliza una cadena lo suficientemente grande (99 copias de cada fila) y el MCM entre las longitudes de las filas (630) para encontrar la sustitución correcta evitando la corrección individual entre cada fila.

Barra
fuente
7

Java 8, 159158 bytes

n->s->{for(int i=s.length,j;i-->0;)for(String x:"1234567890;QWERTYUIOP;ASDFGHJKL;ZXCVBNM".split(";"))if((j=x.indexOf(s[i])+n)>=n)s[i]=x.charAt(j%x.length());}

-1 byte gracias a @ OlivierGrégoire que modifica la matriz de entrada en lugar de imprimir directamente.

Explicación:

Pruébalo en línea.

n->s->{  // Method with integer and character-array parameters, and no return-type
  for(int i=s.length,j;i-->0;)
         //  Loop over the input character-array with index
    for(String x:"1234567890;QWERTYUIOP;ASDFGHJKL;ZXCVBNM".split(";"))
         //   Inner loop over the qwerty-lines
      if((j=x.indexOf(s[i])+n)>=n)
         //    If the current qwerty-line contains the character
         //     Set `j` to the index of this character on that line + input `n`
        s[i]=x.charAt(j%x.length());}
         //     Replace the character at index `i`
         //     with the new character (at index `j` modulo length_of_qwerty_line)
Kevin Cruijssen
fuente
1
158 bytes , a costa de la entrada-salida de char[].
Olivier Grégoire
5

Retina , 49 bytes

"$&"+T`9o`dQW\ERTYUI\OPQASDFG\HJK\LAZXC\VBNMZ
0A`

Pruébalo en línea! Toma entrada ny sen líneas separadas. Explicación:

"$&"+

Repite nveces.

T`9o`dQW\ERTYUI\OPQASDFG\HJK\LAZXC\VBNMZ

Desplaza todos los caracteres una tecla a la derecha.

0A`

Eliminar n.

Neil
fuente
5

JavaScript (ES6), 101 99 bytes

Toma entrada en la sintaxis de curry (s)(n). Funciona con matrices de personajes.

s=>n=>s.map(c=>(S='1QAZ2WSX3EDC4RFV5TGB6YHN7UJM8IK_9OL_0P')[(p=S.search(c)+n*4)%(-~'9986'[p%4]*4)])

Casos de prueba

¿Cómo?

Buscamos la posición p de cada carácter de la entrada dentro de una cadena S donde las filas del teclado están intercaladas: los primeros 4 caracteres son '1QAZ' (primera columna del teclado), los siguientes 4 caracteres son '2WSX' (segunda columna del teclado) y así sucesivamente. Las posiciones no utilizadas se rellenan con guiones bajos y las últimas simplemente se descartan.

col # | 0    | 1    | 2    | 3    | 4    | 5    | 6    | 7    | 8    | 9
------+------+------+------+------+------+------+------+------+------+---
row # | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 01
------+------+------+------+------+------+------+------+------+------+---
char. | 1QAZ | 2WSX | 3EDC | 4RFV | 5TGB | 6YHN | 7UJM | 8IK_ | 9OL_ | 0P

Esto nos permite identificar fácilmente la fila con p mod 4 y elimina la necesidad de separadores explícitos entre las filas.

Avanzamos por 4n posiciones, aplicamos el módulo correcto para esta fila (40, 40, 36 y 28, respectivamente) y recoger el carácter de sustitución encontrado en esta nueva posición en S .

Arnauld
fuente
3

C,  152  149 bytes

¡Gracias a @gastropner por guardar tres bytes!

j,l;f(S,n){for(char*s=S,*k;*s;++s)for(k="1234567890\0QWERTYUIOP\0ASDFGHJKL\0ZXCVBNM\0";l=strlen(k);k+=l+1)for(j=l;j--;)k[j]-*s||putchar(k[(j+n)%l]);}

Pruébalo en línea!

Desenrollado:

j,l;
f(S,n)
{
    for (char*s=S, *k; *s; ++s)
        for (k="1234567890\0QWERTYUIOP\0ASDFGHJKL\0ZXCVBNM\0"; l=strlen(k); k+=l+1)
            for (j=l; j--;)
                k[j]-*s || putchar(k[(j+n)%l]);
}
Steadybox
fuente
O estoy alucinando, o se puede cambiar el ciclo interno, for(j=l;j--;)pero no sé por qué sin ningún otro cambio. Aún así, debería llevarte a 149.
Gastropner
@gastropner Ah, sí, el orden de búsqueda no importa, por lo que funciona. ¡Gracias!
Steadybox
2

Rojo , 152 bytes

f: func[s n][foreach c s[foreach[t l]["1234567890"10"QWERTYUIOP"10"ASDFGHJKL"9"ZXCVBNM"7][if p: find t c[if(i:(index? p)+ n // l)= 0[i: l]prin t/(i)]]]]

Pruébalo en línea!

Sin golf:

f: func [s n][1
    foreach c s [
        foreach [t l] ["1234567890"10"QWERTYUIOP"10"ASDFGHJKL"9"ZXCVBNM"7][
            p: find t c
            if p [ 
                i: (index? p) + n // l
                if i = 0 [i: l]
                prin t/(i) ]]]]
Galen Ivanov
fuente
2

Haskell , 99 bytes

f(s,n)=[dropWhile(/=c)(cycle r)!!n|c<-s,r<-words"1234567890 QWERTYUIOP ASDFGHJKL ZXCVBNM",elem c r]

Pruébalo en línea!

Roman Czyborra
fuente
Puede usar en s#n= ...lugar de lo f(s,n)= ...cual es solo una notación de ejemplo utilizada para los ejemplos.
Laikoni
1

Perl 5 , 94 + 1 ( -p) = 95 bytes

$s=<>;for$i(1234567890,QWERTYUIOP,ASDFGHJKL,ZXCVBNM){eval"y/$i/".(substr$i,$s%length$i)."$i/"}

Pruébalo en línea!

Xcali
fuente
Maldición, no vi tu respuesta. Básicamente son lo mismo, siéntase libre de usar mis optimizaciones y eliminaré mi respuesta. Avíseme, si no, simplemente eliminaré este comentario :)
Dom Hastings
@DomHastings Son lo suficientemente diferentes. Por favor, quédate con ambos. Me gusta ver variaciones en el enfoque. Aprendo de todos ellos ...
Ton Hospel
1

Japt, 20 bytes

Corriendo por la puerta de la cena, así que más golf y una explicación a seguir.

;£=D·i9òs)æøX)gV+UbX

Intentalo

Lanudo
fuente
1

Perl, 59 58 57 56 bytes

Incluye +para-p

Dé entrada en STDIN como 2 líneas, primero la cadena, luego la repetición

(echo 0PLM; echo 2130) | perl -pe '$a="OPQWERTYUILASDF-MZXCVBNM0-90";eval"y/HI$a/J$a/;"x<>'
Ton Hospel
fuente
¡Wow, no puedo creer que hayas 29 bytes del mío! Originalmente estaba bastante contento con eso ...
Dom Hastings
0

Perl 5 , 85 bytes

Código de 84 bytes + 1 para -p.

eval join"",map"y/$_/@{[/./&&$'.$&]}/;",(1234567890,QWERTYUIOP,ASDFGHJKL,ZXCVBNM)x<>

Pruébalo en línea!

Dom Hastings
fuente
0

Limpio , 144 119 bytes

import StdEnv

\n s=[l.[(i+n)rem(size l)]\\c<-s,l<-["1234567890","QWERTYUIOP","ASDFGHJKL","ZXCVBNM"],i<-[0..]&j<-:l|j==c]

Pruébalo en línea!

Función lambda con la firma Int ![Char] -> [Char]

Οurous
fuente
0

Ruby , 101 bytes

->s,n{n.times{s.tr! '1234567890QWERTYUIOPASDFGHJKLZXCVBNM','2345678901WERTYUIOPQSDFGHJKLAXCVBNMZ'};s}

Pruébalo en línea!

Sinceramente, estoy un poco decepcionado de que no podría mejorar con los métodos "más inteligentes". Lo más cerca que estuve fue en la línea de

a=%w{1234567890 QWERTYUIOP ASDFGHJKL ZXCVBNM}
b=a.map{|r|r[1..-1]<<r[0]}*''
a*=''
n.times{s.tr! a,b}

para una ganancia neta de 7 caracteres.

benj2240
fuente