Metni tuşa basma işlemine dönüştürme


10

Ben robotum. Bu klavyeyi kolay dikdörtgen yerleşimi nedeniyle aldım :

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

İnsan metnini yazdırmak için, onu manipülatörlerimin yorumlayabileceği komutlara dönüştürmem gerekiyor. Sol manipülatörüm Shiftanahtarın üzerine geliyor. Sağ manipülatörüm, başlangıçta ~anahtarın üzerine gelir. Manipülatörlerimin anladığı komutlar:

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

Herhangi bir ASCII mesajını komut listesine dönüştürmek için kod yazın. Giriş, herhangi bir sayıda yazdırılabilir 95 ASCII karakteri içerebilir; muhtemelen TAB ve yeni satır karakterleri. Çıktı, manipülatörlere verilen komutların listesi olmalıdır.

Örneğin, yazmak için Hello World!, komutlar

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

Her mesajı yazdırmadan önce manipülatörleri başlangıç ​​durumuna sıfırladım.

Doğru programlama ile kaçınılması gereken bazı mekanik tehlikeler vardır:

  1. LRUDYazdırma ( P) devreye alındığında hareket etmeye ( ) izin verilmiyor
  2. Manipülatörlerde sıkışma yok: bir manipülatör devreye girdiğinde ( Sveya P), bu manipülatörün bir sonraki komutu devreden çıkarılmalı ( sveya p) ve tersi olmalıdır
  3. Gereksiz kaydırma yok: her iki shift ( s, S) komutu arasında bir Pkomut olmalı

    Yani, yazdırmak için ~~komutlar, SPpPpolurken, geçerli SPpsSPpdeğildir

  4. Sınırların dışına çıkmamak yok: hiçbir hareket komutu sağ manipülatörü 13 pozisyondan daha fazla sağa veya 4 başlangıç ​​pozisyonunun altına (veya üste veya sola herhangi bir nokta) hareket ettirmeye çalışmamalıdır.

Ek Notlar:

  • Devre dışı bırakılmış bir tuşa (komut sırası gibi DDPp) basılması hiçbir tuşa basılmamasına neden olur ve buna izin verilir.
  • Shift+ Tuşlarına basmanın bir Tabetkisi yoktur, ancak Shift+ Spaceve Shift+ tuşlarının Enterda olmadan aynı etkisi vardır Shift.
  • Boşluk çubuğundaki ve Entertuşundaki herhangi bir noktaya basmak aynı etkiye sahiptir.
  • Çıktıdaki boşluk tuşlarının bir anlamı yoktur, ancak güzel bir şekilde biçimlendirmek için kullanılabilir.

Hız bir sorun mu? Her bir karakter arasındaki manipülatörleri başlangıçtaki konumlarına geri döndürebilir miyiz (elbette gereksiz kaydırma içermediği sürece)?
Mühendis Tost

Sorun değil. Ekstra hareket olmadan daha ilginç olabilir, ancak mümkün olan en iyi çıktıyı istemekten hoşlanmıyorum.
anatolyg


2
Görevi gerçekten tanımlamadınız ... Girilen hangi karakteri içerebilir? Ne olduğunu asıl görevi (bunu tahmin gidiyorum başlığına göre bariz, ama yine de belirtmek gerekir)
HyperNeutrino

3
Neden rahatsız oluyorsun Pp? Bildiğim kadarıyla gördüğünüz gibi bu her zaman tek eylem ve ne olduğu Pveya pkendi görünebilir.
orlp

Yanıtlar:


5

Python 2 , 338 337 335 331 325 bayt

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

Çevrimiçi deneyin!


Doğrudan her karakterden diğerine geçer.

Açıklama:

  • S=[c in K,s][c in' \n'], bir sonraki karakterin Büyük veya küçük harf olup olmadığını kontrol eder. Eğer cbir boşluk veya satır ise, vaka aynı kalır.

  • X=[max(x,12),min(max(x,5),10),p%15]['\n '.find(c)]. Eğer cbir boşluk veya satır olduğu, en yakın (anahtarlar birden çok sütun yayılan gibi) seçilmiştir akımına x koordinatı

  • print'sS'[S]*(s!=S)+'LR'[X>x]*abs(X-x)+'UD'[Y>y]*abs(Y-y)+'Pp', büyük / küçük harf değişimi anahtarını, x-koordinat hareketlerinin sayısını, y-koordinat hareketlerinin sayısını ve son Ppolarak her karakter için yazdırır


En kısa yol gerekli değilse daha kısa sürüm:

Python 2 , 294 293 291 287 281 bayt

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

Çevrimiçi deneyin!


space/ İçin en kısa yolu kullanmak gerçekten gerekli entermi?
Arnauld

@Arnauld, konuk değilim, belirtilmedi ancak örnek en yakın alana gidiyor (sonra o)
TFeld

2

JavaScript (ES6), 263 bayt

Girişi bir karakter dizisi olarak alır.

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)

Çevrimiçi deneyin!


1

.COM işlem kodu, 108 104 bayt

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 kapalıyken klavyeden girdi alın

Olsa da kötü golf

        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

Bir LUT olmadan bunu yapmak için harika bir fikir!
anatolyg

1
Take input from keyboard Bu programı kullanmak için klavyesini kullanma konusunda yardım isteyen robot arkadaşımız nasıl?
Shaun H
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.