Перетворення тексту в клавіші


10

Я робот. Я придбав цю клавіатуру через її легку прямокутну розкладку:

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

Щоб надрукувати людський текст, мені потрібно перетворити його на команди, які мої маніпулятори можуть інтерпретувати. Мій лівий маніпулятор наводить курсор на Shiftклавішу. Мій правильний маніпулятор на початку наводить на ~клавішу. Команди, які розуміють мої маніпулятори, це:

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

Написати код, щоб перетворити будь-яке повідомлення ASCII в список команд. Вхід може містити будь-яке число з 95 друкованих символів ASCII; можливо також TAB та символи нового рядка. На виході повинен бути список команд для маніпуляторів.

Так, наприклад, щоб набрати Hello World!, команди є

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

Я скидаю маніпулятори до початкового стану перед друком кожного повідомлення.

Є деякі механічні небезпеки, яких слід уникати правильним програмуванням:

  1. Не дозволяється переміщення ( LRUD), коли друк ( P) задіяний
  2. Ніякого заклинання маніпуляторів: коли маніпулятор задіяний ( Sабо P), наступною командою для цього маніпулятора має бути відключення ( sабо p), і навпаки
  3. Немає зайвого зсуву: між кожною з двох команд shift ( s, S) повинна бути Pкоманда

    Отже, для друку ~~команди SPpPpє дійсними, тоді SPpsSPpяк ні

  4. Жодного переміщення за межі: жодна команда руху не повинна намагатися перемістити правий маніпулятор більше ніж на 13 пробілів вправо або на 4 в нижній частині вихідного положення (або будь-яке місце вгору або вліво)

Додаткові нотатки:

  • Натискання відключеної клавіші (подібна командна послідовність DDPp) призводить до того, що не натискається жодна клавіша, і це дозволено.
  • Натискання Shift+ Tabне робить ефекту, але Shift+ Spaceі Shift+ Enterмають такий же ефект, як і без Shift.
  • Натискання на будь-яке місце на панелі пробілу та Enterклавіша має той самий ефект.
  • Пробіли клавіш білого простору не мають значення, але їх можна використовувати для гарного форматування.

Чи проблема з швидкістю? Чи можемо ми повернути маніпуляторів до їхнього домашнього положення між кожним символом (якщо, звичайно, це не включає непотрібне переміщення)?
Інженер Тост

Нема проблем. Можливо, це може бути цікавіше без зайвих рухів, але мені не подобається вимагати найкращого результату.
анатоліг


2
Ви фактично не визначили завдання ... Який символ може містити введення? Що є актуальним завданням (я збираюся припустити , що це очевидно , на основі назви, але ви повинні вказати , тим не менше)
HyperNeutrino

3
Навіщо турбуватися Pp? Наскільки я можу бачити тих , хто завжди одну дію , і ні Pабо pможе з'явитися саме по собі.
orlp

Відповіді:


5

Python 2 , 338 337 335 331 325 байт

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

Спробуйте в Інтернеті!


Переходить безпосередньо від кожного символу до наступного.

Пояснення:

  • S=[c in K,s][c in' \n'], перевіряє, чи має бути наступним символом верхній або нижній регістр. Якщо cце пробіл чи новий рядок, випадок залишається тим самим.

  • X=[max(x,12),min(max(x,5),10),p%15]['\n '.find(c)]. Якщо cце пробіл чи новий рядок, вибирається найближча x-координата до поточного (оскільки клавіші охоплюють кілька стовпців)

  • print'sS'[S]*(s!=S)+'LR'[X>x]*abs(X-x)+'UD'[Y>y]*abs(Y-y)+'Pp', друкує вимикач регістру, кількість хід координат x, кількість y-координатних ходів і, нарешті Pp, для кожного символу


Коротша версія, якщо не потрібен найкоротший шлях:

Python 2 , 294 293 291 287 281 байт

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

Спробуйте в Інтернеті!


Чи справді потрібно використовувати найкоротший шлях до space/ enter?
Арнольд

@Arnauld, я не запрошував, це не було вказано, але приклад іде до найближчого простору (після o)
TFeld

2

JavaScript (ES6), 263 байти

Вводить дані як масив символів.

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)

Спробуйте в Інтернеті!


1

.COM-код, 108 104 байт

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                        

Візьміть дані з клавіатури з вимкненим CapsLock

Хоч гольф хоч

        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

Чудова ідея зробити це без ЛЮТИ!
anatolyg

1
Take input from keyboard Як наш друг-робот, який просить допомогти за допомогою своєї клавіатури, використовувати цю програму?
Шаун Н
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.