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


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клавише пробела и клавиши имеет тот же эффект.
  • Ключи пробела в выводе не имеют смысла, но могут быть использованы для красивого форматирования.

Является ли скорость проблемой? Можем ли мы вернуть манипуляторы в их исходное положение между каждым персонажем (если, конечно, это не включает ненужные перемещения)?
— Инженер Тост

Нет проблем. Может быть, это может быть интереснее без лишних движений, но мне не нравится требовать наилучшего результата.
— Анатолий


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

Отличная идея сделать это без LUT!
— Анатолий

1
Take input from keyboard Как наш друг-робот, который просит помощи с помощью клавиатуры, использует эту программу?
— Шон Х
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.