Convertir texto a pulsaciones de teclas

10

Soy un robot. Compré este teclado debido a su diseño rectangular fácil:

~`   !1   @2   #3   $4   %5   ^6   &7   *8   (9   )0   _-   +=
tab  Qq   Ww   Ee   Rr   Tt   Yy   Uu   Ii   Oo   Pp   {[   }]    \|
     Aa   Ss   Dd   Ff   Gg   Hh   Jj   Kk   Ll   :;   "'   [-enter-]
          Zz   Xx   Cc   Vv   Bb   Nn   Mm   <,   >.   ?/
                         [========= space =========]

Para imprimir texto humano, necesito convertirlo en comandos que mis manipuladores puedan interpretar. Mi manipulador izquierdo se cierne sobre la Shiftllave. Mi manipulador derecho, al principio, se cierne sobre la ~tecla. Los comandos que entienden mis manipuladores son:

S      : press the shift key
s      : release the shift key
L      : move the right manipulator left by 1
R      : move the right manipulator right by 1
U      : move the right manipulator up by 1
D      : move the right manipulator down by 1
P      : press the key under the right manipulator
p      : release the key by the right manipulator

Escriba código para convertir cualquier mensaje ASCII en una lista de comandos. La entrada puede contener cualquier número de los 95 caracteres ASCII imprimibles; posiblemente también TAB y caracteres de nueva línea. La salida debe ser la lista de los comandos para los manipuladores.

Entonces, por ejemplo, para escribir Hello World!, los comandos son

SRRRRRRDDPp
sLLLUPp
RRRRRRDPp
Pp
UPp
LLLLDDDPp
SLLLUUUPp
sRRRRRRRPp
LLLLLPp
RRRRRDPp
LLLLLLPp
SLLUUPp

Restablezco los manipuladores al estado inicial antes de imprimir cada mensaje.

Hay algunos riesgos mecánicos que deben evitarse mediante una programación adecuada:

  1. No se LRUDpermite mover ( ) cuando se activa la impresión ( P)
  2. Sin atascos de manipuladores: cuando un manipulador está activado ( So P), el siguiente comando para este manipulador debe ser la desactivación ( so p), y viceversa
  3. Sin cambios innecesarios: entre cada dos comandos shift ( s, S), debe haber un Pcomando

    Entonces, para imprimir ~~, los comandos SPpPpson válidos, mientras que SPpsSPpno lo son

  4. No moverse fuera de los límites: ningún comando de movimiento debe tratar de mover el manipulador derecho más de 13 espacios a la derecha o 4 a la parte inferior de la posición inicial (o cualquier punto en la parte superior o izquierda)

Notas adicionales:

  • Al presionar una tecla deshabilitada (secuencia de comandos como DDPp) no se presionan teclas y está permitido.
  • Presionar Shift+ Tabno tiene ningún efecto, pero Shift+ Spacey Shift+ Entertienen el mismo efecto que sin Shift.
  • Al presionar cualquier punto de la barra espaciadora, la Entertecla tiene el mismo efecto.
  • Las teclas de espacio en blanco en la salida no tienen significado, pero se pueden usar para formatearlo de una manera hermosa.
anatolyg
fuente
¿Es la velocidad un problema? ¿Podríamos devolver a los manipuladores a su posición inicial entre cada personaje (siempre que no incluya cambios innecesarios, por supuesto)?
Engineer Toast
No hay problema. Tal vez podría ser más interesante sin movimiento adicional, pero no me gusta exigir la mejor salida posible.
anatolyg
1
Relacionado uno , relacionado dos .
AdmBorkBork
2
En realidad no ha definido la tarea ... ¿Qué carácter puede contener la entrada? Lo que está la tarea real (Voy a adivinar que es lo obvio basado en el título, pero se debe especificar no obstante)
HyperNeutrino
3
¿Por qué molestarse con Pp? Por lo que yo puedo ver esos son siempre una sola acción y ninguno Po ppuede aparecer por sí sola.
orlp

Respuestas:

5

Python 2 , 338 337 335 331 325 bytes

x=y=s=0
for c in input():p='`1234567890-=`	qwertyuiop[]|`asdfghjkl;\'\n```zxcvbnm,./``````` ~!@#$%^&*()_+~~QWERTYUIOP{}\\~ASDFGHJKL:"\n~~~ZXCVBNM<>?~~~~~~~ '.find(c);S=[p>61,s][c in' \n'];p%=62;Y=p/14;X=[max(x,12),min(max(x,5),10),p%14]['\n '.find(c)];print'sS'[S]*(s^S)+'LR'[X>x]*abs(X-x)+'UD'[Y>y]*abs(Y-y)+'Pp';x,y,s=X,Y,S

Pruébalo en línea!


Se mueve directamente de cada personaje al siguiente.

Explicación:

  • S=[c in K,s][c in' \n'], comprueba si el siguiente carácter debe estar en mayúsculas o minúsculas. Si ces un espacio o una nueva línea, el caso sigue siendo el mismo.

  • X=[max(x,12),min(max(x,5),10),p%15]['\n '.find(c)]. Si ces un espacio o una nueva línea, se elige la coordenada x más cercana a la actual (ya que las teclas abarcan varias columnas)

  • print'sS'[S]*(s!=S)+'LR'[X>x]*abs(X-x)+'UD'[Y>y]*abs(Y-y)+'Pp', imprime el interruptor de mayúsculas y minúsculas, el número de movimientos de coordenadas x, el número de movimientos de coordenadas y, y finalmente Pp, para cada personaje


Versión más corta, si no se requiere la ruta más corta:

Python 2 , 294 293 291 287 281 bytes

x=y=s=0
for c in input():p='`1234567890-=`	qwertyuiop[]|`asdfghjkl;\'\n```zxcvbnm,./``````` ~!@#$%^&*()_+~~QWERTYUIOP{}\\~ASDFGHJKL:"\n~~~ZXCVBNM<>?~~~~~~~ '.find(c);S=[p>61,s][c in' \n'];p%=62;X,Y=p%14,p/14;print'sS'[S]*(s^S)+'LR'[X>x]*abs(X-x)+'UD'[Y>y]*abs(Y-y)+'Pp';x,y,s=X,Y,S

Pruébalo en línea!

TFeld
fuente
¿Es realmente necesario usar la ruta más corta a space/ enter?
Arnauld
@Arnauld, no invito, no se especificó pero el ejemplo va al espacio más cercano (después o)
TFeld
2

JavaScript (ES6), 263 bytes

Toma entrada como una matriz de caracteres.

s=>s.map(c=>(y=i-(i=(j=`\`~1!2@3#4$5%6^7&8*9(0)-_=+00\t0qQwWeErRtTyYuUiIoOpP[{]}|\\00aAsSdDfFgGhHjJkKlL;:'"
${1e6}zZxXcCvVbBnNmM,<.>/?${1e13} `.indexOf(c))>>1),g=k=>'LRUD'[n=k?y/14:y%14,k^=n<0].repeat(n<0?-n:n))()+g(2)+['sS'[j-s&c!=' '&c!=`
`?s^=1:2]]+'Pp',i=s=0)

Pruébalo en línea!

Arnauld
fuente
1

.COM código operativo, 108104 bytes

0000h: B4 00 CD 16 BE 50 01 83 C6 03 3A 24 77 F9 0F B6
0010h: DC 03 5C 01 B4 02 CD 16 B4 02 68 00 01 A8 03 B2
0020h: 53 74 08 81 36 20 01 20 01 CD 21 84 DB 74 0B 4B
0030h: B2 52 E8 F4 FF B2 4C CD 21 C3 84 FF 74 0C FE CF
0040h: B2 44 E8 E4 FF B2 55 CD 21 C3 B2 50 CD 21 B2 70
0050h: CD 21 C3 0D FE 00 1B F1 00 1C F0 01 28 E3 01 29
0060h: D7 FF 35 D6 02 39 CC 03                        

Tome la entrada del teclado con el bloqueo de mayúsculas desactivado

Aunque mal golf

        org 100h
        mov ah, 0
        int 16H
        mov si, table-3
tabing: add si, 3
        cmp ah, [si]
        ja tabing
        movzx bx, ah
        add bx, [si+1]
        mov ah, 2
        int 16H
        mov ah, 2
        push 100H
        test al, 3
        mov dl, 'S'
cmd:    jz fun
        xor [cmd-1], word 0x120
        int 21H
fun:    test bl, bl
        jz bl0
        dec bx
        mov dl, 'R'
        int 21H
        call fun
        mov dl, 'L'
        int 21H
        ret
bl0:    test bh, bh
        jz bh0
        dec bh
        mov dl, 'D'
        int 21H
        call fun
        mov dl, 'U'
        int 21H
        ret
bh0:    mov dl, 'P'
        int 21H
        mov dl, 'p'
        int 21H
        ret
macro key begin, end, U, L {
        db end
        dw U*256+L-begin
}
table:
        key 0x02, 0x0D, 1, 0
        key 0x10, 0x1B, 1, 1
        key 0x1C, 0x1C, 2, 12
        key 0x1E, 0x28, 2, 1
        key 0x29, 0x29, 0, 0
        key 0x2C, 0x35, 3, 2
        key 0x39, 0x39, 4, 5
l4m2
fuente
¡Una gran idea para hacer eso sin un LUT!
anatolyg
1
Take input from keyboard ¿Cómo está nuestro amigo robot, que está pidiendo ayuda para usar su teclado, para utilizar este programa?
Shaun H