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.