Chuyển đổi văn bản sang phím bấm


10

Tôi là người máy. Tôi đã mua bàn phím này vì cách bố trí hình chữ nhật dễ dàng:

~`   !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 =========]

Để in văn bản của con người, tôi cần chuyển đổi nó thành các lệnh mà người thao tác của tôi có thể diễn giải. Trình điều khiển bên trái của tôi dao động trên Shiftphím. Thao tác bên phải của tôi, lúc đầu, di chuyển trên ~phím. Các lệnh mà người thao tác của tôi hiểu là:

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

Viết mã để chuyển đổi bất kỳ thông điệp ASCII nào sang danh sách các lệnh. Đầu vào có thể chứa bất kỳ số nào trong số 95 ký tự ASCII có thể in được; cũng có thể là TAB và các ký tự dòng mới. Đầu ra phải là danh sách các lệnh cho các trình thao tác.

Vì vậy, ví dụ, để gõ Hello World!, các lệnh là

SRRRRRRDDPp
sLLLUPp
RRRRRRDPp
Pp
UPp
LLLLDDDPp
SLLLUUUPp
sRRRRRRRPp
LLLLLPp
RRRRRDPp
LLLLLLPp
SLLUUPp

Tôi đặt lại các thao tác về trạng thái ban đầu trước khi in từng tin nhắn.

Có một số mối nguy cơ học cần tránh bằng cách lập trình đúng:

  1. Không di chuyển ( LRUD) được phép khi in ( P) được tham gia
  2. Không gây nhiễu cho các trình thao tác: khi một trình thao tác được tham gia ( Shoặc P), lệnh tiếp theo cho trình thao tác này sẽ được giải phóng ( shoặc p) và ngược lại
  3. Không có sự dịch chuyển không cần thiết: giữa mỗi hai lệnh shift ( s, S), cần có một Plệnh

    Vì vậy, để in ~~, các lệnh SPpPplà hợp lệ, trong khi SPpsSPpkhông

  4. Không di chuyển ra khỏi giới hạn: không có lệnh di chuyển nào nên cố gắng di chuyển bộ điều khiển bên phải nhiều hơn 13 khoảng trắng sang phải hoặc 4 xuống dưới cùng của vị trí ban đầu (hoặc bất kỳ vị trí nào ở trên cùng hoặc bên trái)

Ghi chú bổ sung:

  • Nhấn một phím bị vô hiệu hóa (chuỗi lệnh như DDPp) sẽ không có phím nào được nhấn và được phép.
  • Nhấn Shift+ Tabkhông có tác dụng, nhưng Shift+ SpaceShift+ Entercó tác dụng tương tự như không có Shift.
  • Nhấn vào bất kỳ vị trí nào trên thanh không gian và Enterphím có cùng tác dụng.
  • Các khóa khoảng trắng trong đầu ra không có ý nghĩa, nhưng có thể được sử dụng để định dạng nó một cách đẹp mắt.

Là tốc độ một vấn đề? Chúng ta có thể trả lại các tay thao tác về vị trí nhà của họ giữa mỗi nhân vật không (tất nhiên miễn là nó không bao gồm dịch chuyển không cần thiết)?
Kỹ sư Toast

Không vấn đề gì. Có thể nó sẽ thú vị hơn nếu không có thêm chuyển động, nhưng tôi không muốn yêu cầu đầu ra tốt nhất có thể.
anatolyg


2
Bạn chưa thực sự xác định nhiệm vụ ... Nhân vật nào có thể nhập vào? Nhiệm vụ thực tế gì (tôi sẽ đoán nó rõ ràng dựa trên tiêu đề, nhưng dù sao bạn cũng nên xác định rõ)
HyperNeutrino

3
Tại sao phải bận tâm với Pp? Theo như tôi có thể thấy đó luôn là một hành động duy nhất và không Phoặc pcó thể tự xuất hiện.
orlp

Câu trả lời:


5

Python 2 , 338 337 335 331 325 byte

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

Hãy thử trực tuyến!


Di chuyển trực tiếp từ mỗi nhân vật sang người tiếp theo.

Giải trình:

  • S=[c in K,s][c in' \n'], kiểm tra xem ký tự tiếp theo nên viết hoa hay viết thường. Nếu clà một không gian hoặc dòng mới, trường hợp vẫn giữ nguyên.

  • X=[max(x,12),min(max(x,5),10),p%15]['\n '.find(c)]. Nếu clà một khoảng trắng hoặc dòng mới, tọa độ x gần nhất với dòng điện được chọn (vì các phím trải qua nhiều cột)

  • print'sS'[S]*(s!=S)+'LR'[X>x]*abs(X-x)+'UD'[Y>y]*abs(Y-y)+'Pp', in chuyển đổi trường hợp, số lần di chuyển tọa độ x, số lần di chuyển tọa độ y và cuối cùng Pp, cho mỗi ký tự


Phiên bản ngắn hơn, nếu không cần đường dẫn ngắn nhất:

Python 2 , 294 293 291 287 281 byte

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

Hãy thử trực tuyến!


Có thực sự cần thiết để sử dụng con đường ngắn nhất đến space/ enter?
Arnauld

@Arnauld, tôi không mời, nó không được chỉ định nhưng ví dụ sẽ chuyển đến không gian gần nhất (sau o)
TFeld

2

JavaScript (ES6), 263 byte

Đưa đầu vào như một mảng các ký tự.

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)

Hãy thử trực tuyến!


1

.COM opcode, 108 104 byte

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                        

Lấy đầu vào từ bàn phím tắt CapsLock

Mặc dù chơi golf kém

        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

Một ý tưởng tuyệt vời để làm điều đó mà không cần LUT!
anatolyg

1
Take input from keyboard Làm thế nào là người bạn robot của chúng tôi, người đang yêu cầu trợ giúp sử dụng bàn phím của mình, để sử dụng chương trình này?
Shaun H
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.