将文本转换为按键


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. 操纵器的无干扰:当一个操纵器被接合(SP),对于该机械手的下一个命令应该被脱开(sp),并且反之亦然
  3. 没有不必要的移位:在每两个shift(sS)命令之间,应该有一个P命令

    因此,要打印~~,命令SPpPp有效,而SPpsSPp无效

  4. 不能超出范围:任何移动命令都不应尝试将右机械手向初始位置的右方向移动13个以上或向底部移动4个以上(或在顶部或左侧的任何位置)

补充笔记:

  • 按下禁用的键(命令序列如DDPp)将导致没有按键被按下并且被允许。
  • Shift+ Tab无效,但是Shift+ SpaceShift+ Enter与没有相同Shift
  • 在空格键上按任意位置,该Enter键具有相同的效果。
  • 输出中的空格键没有任何意义,但是可以用一种漂亮的方式格式化它。

速度有问题吗?我们能否将操纵器返回到每个字符之间的原始位置(当然,只要不包括不必要的移动)?
土司工程师

没问题。也许不增加运动就可能更有趣,但是我不喜欢要求最好的输出。
anatolyg '18年


2
您实际上尚未定义任务...输入的字符可以包含什么?实际的任务什么(基于标题,我想这很明显,但是您仍然应该指定)
HyperNeutrino

3
为什么要打扰Pp?至于我可以看到那些总是一个动作既不Pp可自行出现。
orlp

Answers:


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'Pp为每个字符打印大小写开关,x坐标移动数,y坐标移动数,最后是


较短的版本(如果不需要最短的路径):

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
TF

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操作码,108104字节

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的好主意!
anatolyg

1
Take input from keyboard 我们的机器人朋友如何使用键盘寻求帮助,他如何使用此程序?
肖恩H
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.