텍스트를 키 누름으로 변환


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. 불필요한 이동은 각각 두 시프트 (간 s, S) 동작하는이 없어야 P명령

    따라서 인쇄하려면 ~~명령 SPpPp이 유효하지만 유효 SPpsSPp하지 않습니다.

  4. 범위를 벗어나는 이동 없음 : 이동 명령이 없어야 오른쪽 조작기를 13 개 이상의 공간에서 오른쪽으로 또는 4 개의 위치에서 초기 위치의 맨 아래 (또는 스팟을 위 또는 왼쪽으로 이동)

추가 사항 :

  • 비활성화 된 키 (같은 명령 순서 DDPp)를 누르면 아무 키도 누르지 않고 허용됩니다.
  • Shift+ Tab를 눌러도 효과는 없지만 Shift+ SpaceShift+ Enter는 효과가없는 것과 같습니다 Shift.
  • 스페이스 바와 Enter키 의 아무 지점이나 누르면 동일한 효과가 있습니다.
  • 출력의 공백 키는 의미가 없지만 아름다운 방식으로 형식을 지정하는 데 사용할 수 있습니다.

속도가 문제입니까? 조작자가 각 캐릭터 사이의 홈 위치로 돌아갈 수 있습니까 (물론 불필요한 이동이 포함되지 않는 한)?
엔지니어 토스트

문제 없어요. 추가 움직임없이 더 재미있을 수도 있지만 가능한 최고의 출력을 요구하는 것을 좋아하지 않습니다.
아나 톨릭


2
실제로 작업을 정의하지 않았습니다. 입력 할 수있는 문자는 무엇입니까? 실제 과제 무엇입니까? (제목을 기준으로 분명한 것으로 추측되지만 그럼에도 불구하고 지정해야합니다)
HyperNeutrino

3
왜 귀찮게 Pp? 내가 볼 수있는 한, 그것들은 항상 하나의 행동이며 그 자체로 P또는 전혀 p나타날 수 없습니다 .
orlp

답변:


5

파이썬 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각 문자에 대해 인쇄


가장 짧은 경로가 필요하지 않은 경우 더 짧은 버전 :

파이썬 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

@Arnauld는 I 게스트, 그것은 지정되지 않았습니다되지하지만 예 (후 가까운 공간으로 이동 o)
TFeld

2

자바 스크립트 (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 키보드를 사용하여 도움을 요청하는 로봇 친구는이 프로그램을 어떻게 사용합니까?
Shaun H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.