Converti il ​​testo in tasti premuti


10

Sono un robot. Ho comprato questa tastiera per il suo semplice layout rettangolare:

~`   !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 =========]

Per stampare un testo umano, devo convertirlo in comandi che i miei manipolatori possono interpretare. Il mio manipolatore sinistro passa sopra la Shiftchiave. Il mio manipolatore destro, all'inizio, passa sopra la ~chiave. I comandi che i miei manipolatori comprendono sono:

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

Scrivi il codice per convertire qualsiasi messaggio ASCII in un elenco di comandi. L'input può contenere qualsiasi numero dei 95 caratteri ASCII stampabili; possibilmente anche personaggi TAB e newline. L'output dovrebbe essere l'elenco dei comandi per i manipolatori.

Quindi, per esempio, per digitare Hello World!, i comandi sono

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

Ho ripristinato i manipolatori allo stato iniziale prima di stampare ogni messaggio.

Esistono alcuni pericoli meccanici che dovrebbero essere evitati mediante un'adeguata programmazione:

  1. Non è LRUDconsentito lo spostamento ( ) quando Pè attivata la stampa ( )
  2. Nessun inceppamento dei manipolatori: quando un manipolatore è impegnato ( So P), il comando successivo per questo manipolatore dovrebbe essere disimpegnarsi ( so p) e viceversa
  3. Nessun spostamento non necessario: tra ogni due comandi shift ( s, S), dovrebbe esserci un Pcomando

    Quindi, per stampare ~~, i comandi SPpPpsono validi, mentre SPpsSPpnon lo sono

  4. Non andare fuori dai limiti: nessun comando di movimento dovrebbe cercare di spostare il manipolatore destro di più di 13 spazi a destra o 4 in fondo alla posizione iniziale (o qualsiasi punto in alto o a sinistra)

Note aggiuntive:

  • Premendo un tasto disabilitato (sequenza comandi simile DDPp) non si ottiene alcun tasto ed è consentito.
  • Premere Shift+ Tabnon ha alcun effetto, ma Shift+ Spacee Shift+ Enterhanno lo stesso effetto di senza Shift.
  • Premendo in qualsiasi punto della barra spaziatrice il Entertasto ha lo stesso effetto.
  • Le chiavi degli spazi bianchi nell'output non hanno alcun significato, ma possono essere utilizzate per formattarlo in modo meraviglioso.

La velocità è un problema? Potremmo riportare i manipolatori nella loro posizione iniziale tra ciascun personaggio (purché non includa il cambio non necessario, ovviamente)?
— Ingegnere Toast,

Nessun problema. Forse potrebbe essere più interessante senza movimento extra, ma non mi piace richiedere il miglior risultato possibile.
— Anatolyg


2
In realtà non hai definito l'attività ... Quale personaggio può contenere l'input? Qual è il compito effettivo (suppongo sia ovvio in base al titolo, ma dovresti specificare comunque)
— HyperNeutrino

3
Perché preoccuparsi di Pp? Per quanto posso vedere quelli sono sempre una singola azione e nessuno dei due Po ppossono apparire da solo.
— orlp

Risposte:


5

Python 2 , 338 337 335 331 331 325 byte

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

Provalo online!


Passa direttamente da ciascun personaggio al successivo.

Spiegazione:

  • S=[c in K,s][c in' \n'], controlla se il carattere successivo deve essere maiuscolo o minuscolo. Se cè uno spazio o una nuova riga, il caso rimane lo stesso.

  • X=[max(x,12),min(max(x,5),10),p%15]['\n '.find(c)]. Se cè uno spazio o una nuova riga, viene scelta la coordinata x più vicina alla corrente (poiché i tasti si estendono su più colonne)

  • print'sS'[S]*(s!=S)+'LR'[X>x]*abs(X-x)+'UD'[Y>y]*abs(Y-y)+'Pp', stampa l'interruttore maiuscolo, il numero di mosse delle coordinate x, il numero di mosse delle coordinate y e Pp, infine , per ogni personaggio


Versione più breve, se non è richiesto il percorso più breve:

Python 2 , 294 293 291 287 281 byte

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

Provalo online!


È davvero necessario utilizzare il percorso più breve per space/ enter?
— Arnauld,

@Arnauld, io non sono ospite, non è stato specificato ma l'esempio va allo spazio più vicino (dopo o)
— TFeld

2

JavaScript (ES6), 263 byte

Accetta input come una matrice di caratteri.

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)

Provalo online!


1

.COM opcode, 108 104 byte

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                        

Prendi input dalla tastiera con CapsLock disattivato

Mal golfizzato però

        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

Un'ottima idea per farlo senza LUT!
— Anatolyg

1
Take input from keyboard In che modo il nostro amico robot, che sta chiedendo aiuto utilizzando la sua tastiera, può utilizzare questo programma?
— Shaun H,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.