Преобразование текста в нажатия клавиш

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; возможно также символы табуляции и перевода строки. На выходе должен быть список команд для манипуляторов.

Так, например, чтобы набрать 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клавише пробела и клавиши имеет тот же эффект.
  • Ключи пробела в выводе не имеют смысла, но могут быть использованы для красивого форматирования.
anatolyg
источник
Является ли скорость проблемой? Можем ли мы вернуть манипуляторы в их исходное положение между каждым персонажем (если, конечно, это не включает ненужные перемещения)?
Инженер Тост
Нет проблем. Может быть, это может быть интереснее без лишних движений, но мне не нравится требовать наилучшего результата.
Анатолий
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

Попробуйте онлайн!

TFeld
источник
Действительно ли необходимо использовать кратчайший путь к 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)

Попробуйте онлайн!

Arnauld
источник
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
l4m2
источник
Отличная идея сделать это без LUT!
Анатолий
1
Take input from keyboard Как наш друг-робот, который просит помощи с помощью клавиатуры, использует эту программу?
Шон Х