แปลงข้อความเป็นปุ่มกด


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 ใด ๆ เป็นรายการคำสั่ง อินพุตสามารถมีอักขระ ASCII ที่พิมพ์ได้จำนวน 95 ตัว อาจเป็น TAB และอักขระขึ้นบรรทัดใหม่ เอาต์พุตควรเป็นรายการของคำสั่งไปยังผู้ควบคุม

ตัวอย่างเช่นในการพิมพ์Hello World!คำสั่งคือ

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

ฉันรีเซ็ตตัวควบคุมเป็นสถานะเริ่มต้นก่อนพิมพ์แต่ละข้อความ

มีอันตรายทางกลบางประการที่ควรหลีกเลี่ยงโดยการโปรแกรมที่เหมาะสม:

  1. ไม่LRUDอนุญาตให้มีการเคลื่อนไหว ( ) เมื่อทำการพิมพ์ ( P)
  2. ไม่มีการติดขัดของ manipulators: เมื่อมีการใช้งานเครื่องมือจัดการ ( SหรือP) คำสั่งถัดไปสำหรับเครื่องมือนี้ควรปลด ( sหรือp) และในทางกลับกัน
  3. ไม่มีการขยับที่ไม่จำเป็น: ระหว่างคำสั่งshift ( s, S) แต่ละคำสั่งควรมีPคำสั่ง

    ดังนั้นในการพิมพ์~~คำสั่งSPpPpนั้นใช้ได้ในขณะที่SPpsSPpไม่อยู่

  4. ไม่มีการย้ายออกจากขอบเขต: ไม่มีคำสั่งการเคลื่อนไหวควรพยายามย้ายหุ่นยนต์ที่ถูกต้องมากกว่า 13 ช่องว่างไปทางขวาหรือ 4 ไปที่ด้านล่างของตำแหน่งเริ่มต้น (หรือจุดใด ๆ ไปด้านบนหรือซ้าย)

หมายเหตุเพิ่มเติม:

  • การกดคีย์ที่ปิดใช้งาน (ลำดับคำสั่งเช่นDDPp) จะทำให้ไม่มีการกดคีย์และอนุญาตให้ใช้
  • กดShift+ Tabไม่มีผล แต่Shift+ SpaceและShift+ มีผลเช่นเดียวกันโดยไม่EnterShift
  • กดบนจุดใดก็ได้บนแถบพื้นที่และEnterปุ่มจะมีผลเหมือนกัน
  • คีย์ช่องว่างในเอาต์พุตไม่มีความหมาย แต่สามารถใช้เพื่อจัดรูปแบบในลักษณะที่สวยงาม

ความเร็วเป็นปัญหาหรือไม่? เราสามารถคืนเครื่องมือปรับแต่งกลับไปที่ตำแหน่งเดิมระหว่างตัวละครแต่ละตัวได้หรือไม่
Engineer Toast

ไม่มีปัญหา. บางทีมันอาจจะน่าสนใจกว่านี้หากไม่มีการเคลื่อนไหวเพิ่มเติม แต่ฉันไม่ต้องการการแสดงผลที่ดีที่สุด
Anatolyg

1
หนึ่งที่เกี่ยวข้อง , ที่เกี่ยวข้องกับทั้งสอง
AdmBorkBork

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'พิมพ์สวิตช์ case, จำนวนของการเคลื่อนไหวพิกัด 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

@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 opcode, 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!
anatolyg

1
Take input from keyboard เพื่อนหุ่นยนต์ของเราเป็นใครที่ขอความช่วยเหลือในการใช้แป้นพิมพ์เพื่อใช้ประโยชน์จากโปรแกรมนี้
Shaun H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.