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


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.