テキストをキープレスに変換する


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. 不必要なシフトはありません。各2つのシフト(sS)コマンドの間に、Pコマンド

    したがって、印刷するには~~、コマンドSPpPpは有効ですが、SPpsSPpはありません

  4. 範囲外への移動不可:移動コマンドは、右マニピュレーターを初期位置の右に13スペースまたは4スペース(または任意のスポットを上または左)に移動しようとするべきではありません。

その他の注意事項:

  • 無効化されたキーを押す(コマンドシーケンスのような DDPp)を押すと、キーが押されなくなり、許可されます。
  • Shift+ Tabを押しても効果はありませんが、Shift+ SpaceShift+ Enterを押しても効果はありません。Shiftます。
  • スペースバーの任意の場所を押すと、 Enterキーの、同じ効果があります。
  • 出力の空白キーは意味がありませんが、美しい方法でフォーマットするために使用できます。

速度に問題はありますか?マニピュレータを各キャラクター間のホームポジションに戻すことはできますか(もちろん、不必要なシフトが含まれていない限り)。
エンジニアトースト

問題ない。余計な動きがない方が面白いかもしれませんが、最高の出力を要求するのは好きではありません。
anatolyg 2018年


2
タスクを実際に定義していません...入力できる文字は何ですか?実際のタスク何ですか(タイトルに基づいて明らかであることを推測しますが、それでも指定する必要があります)
HyperNeutrino

3
なぜ気になるのPp?私の知る限り見ることができるように、これらは常に単一のアクションともないPか、p自分自身で表示されます。
orlp

回答:


5

パイソン2338の 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に、各文字を出力します


最短パスが不要な場合の短いバージョン:

パイソン2294の 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)に移動します
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オペコード、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.