キーストロークをシミュレートする


33

あなたの仕事は、ユーザーが入力するいくつかのキーストロークをシミュレートすることです。

入力

少なくとも1つの「キーストローク」を含む、選択した区切り文字(範囲32〜126以外)を持つ文字列配列または文字列。

この配列には、パッシブキーストローク(単一の文字)とコマンド(括弧内の文字)の2種類の文字列のみが含まれます[ ]

  • パッシブキーストローク
    1. ASCII文字コード [32-126]
  • コマンド:
    1. [B] :バックスペース(最後に追加された文字がある場合は削除します)
    2. [C] :すでに書き込まれたものをすべてコピーします
    3. [D] :書き込まれた内容をすべて削除します
    4. [P] :コピーされたものを貼り付ける

出力

キーストロークによって生成される文字列。

['H', 'e', 'l', 'l', 'o'] -> 'Hello'
['H', 'e', 'l', 'l', 'o', ' ', '[C]', '[P]'] -> 'Hello Hello '
['[D]', 'D', '[B]'] -> ''
['H', '[C]', 'i', '[P]', '[C]', '[P]'] -> 'HiHHiH'
['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'b', '[P]', '[P]', 's', '!'] -> I like bees!
['N', '[P]'] -> 'N'
['#', '5', '0', 'K', '0', '0', '1', '[D]', '#', 'n', 'o', 't'] -> '#not'
['H', 'o', 'w', ' ', '[D]', 'H', 'e', 'y'] -> 'Hey'
['s', 'u', 'd', '[B]', 'p', '[C]', '[D]', 'I', ' ' , 'h', 'a', 'v', 'e', ' ', '[P]', 'p', 'e', 'r', '!'] -> 'I have supper!'

これはなので、バイト単位の最短コードが勝ちです!


参考までに、コードにバグを見つけました。ミツバチに大文字のBを使用したテストケースを提案できますか?)
ジョナサンアラン

また[D]、使用されるのはそれだけではないため、コードは単なるものではありませんsplit('[D]')[1]
mbomb007

@ mbomb007、テストケース(#8、#9)を追加しました
ダニエル

そして、mbomb007は複数の削除を伴うテストケースを求めていたと思います。
マーティンエンダー

@MartinEnder、ああ、私は彼が以外のコマンドがあるものが欲しいと思った[D]
ダニエル

回答:


7

05AB1E34 33 31 27バイト

CP-1252エンコードを使用します。

õUvygiyJë"XJ¨DU\"4äyáÇ5%è.V

オンラインでお試しください!

説明

õU                                  # initialize X as the empty string
v                                   # for each y in input
 ygiyJ                              # if len(y) == 1 join y with stack
      ë                             # else
       "XJ¨DU\"                     # push this string
               4ä                   # split into 4 parts (of size [2,1,2,1])
                 yá                 # push only letters of y
                   Ç5%              # mod its ascii code by 5
                      è             # index into the string above with this
                       .V           # evaluate as 05AB1E code

上記のコードで評価される関数のペアは次のとおりです。

DU    # [C] -> duplicate and store in X
XJ    # [P] -> push X and join with stack
¨     # [B] -> remove last char of string
\     # [D] -> remove top of stack 

LynnのCJamアンサーのmod 5トリックを使用して4バイトを保存しました


34

Vimは、76、64、62、58回のキーストローク

7つのキーストロークを保存してくれたLoovjoに感謝


誰かがキーストロークをシミュレートすると言いましたかさて、それはゴルフに私の好きな言語がすべてで良いことだについてのキーストロークをシミュレート!

:no s :%s/\M[
sB]/<C-v><C-h>
sC]/<C-v><esc>0y$A
sD]/<C-v><esc>"_S
sP]/<C-v><C-r>"
s<bs>\n
S<C-r>"

入力の形式は次のとおりです。

h
e
l
l
o

[C]
[P]

これは非常に簡単な答えです。各「コマンド」を、そのコマンドに相当するvimキーストロークに変換するだけです。行ごとに見てみましょう。

:no s :%s/\M[

これにより、大量のバイトを節約できます。Vimには、マッピングの作成、設定の変更、ファイルの保存などが可能な組み込みの「コマンドライン」があります。ここでは、マッピングを作成しています。:no略です:nnoremapどの手段「我々は通常モードである場合、この右側のために、この左側に置き換えてください。」:%s/ 5つの異なる時間を呼び出しているため、これにより大幅に節約できます。これ\Mはいいトリックです。これは、次の検索が「マジックなし」になることを意味します。つまり、正規表現[B][B]、Bのみを含む範囲ではなく、リテラルテキストと一致します。代替コマンドの大部分には角かっこが含まれているため、最初のコマンドを入力します。

次に、5つの代替コマンドを呼び出します。なぜ<C-v>何度も電話したのは注目に値します。文字が好き<esc><C-v><C-r>、などの印刷不可能な文字である、としてコマンドラインに入力する必要があります<C-v>

  • [B]:バックスペース。これはとても簡単です。それぞれ[B]を単にCtrl-hvimのバックスペースに相当するに置き換えます。

  • [C]:すでに書かれているものをすべてコピーします。これはに翻訳され<esc>0y$Aます。これの意味は:

    <esc>      " Escape to normal mode
         0     " Move to the beginning of this line
          y$   " Yank to the end of the line
            A  " Re enter insert mode at the end of this line.
    

    「行全体をヤンクする」ことを意味する代わりに、ほぼ単純に行うことができますが、これは、望まない改行も取得します。Y0y$

  • [D]:書き込まれた内容をすべて削除します。これがあります<esc>"_S。前と同様に、<esc>コマンドを実行できるように挿入モードを終了します。ここにはもっと便利なことがいくつかあります。だから

      S         " Delete this whole line and enter insert mode again
    "_          " Send it to 'the black hole register'. This is just so that we don't overwrite the main register.
    
  • [P]:コピーしたものを貼り付けます。これも非常に簡単です。まさに<C-r>"その意味Insert the contents of register '"'です。"たまたま 'y'がヤンクするメインレジスタです。

すべてのコマンドを翻訳したので、改行文字をすべて削除して、すべての行を結合する必要があります。マッピングのおかげで、これはただ

s<bs>\n

<bs>バックスペース(ASCII 0x08に)であり、我々は理由を、それを必要とする[私たちがいっぱい。

ここまでで、入力をvimコードに変換しました。実行するだけです。だから:

S           " Delete this whole line and enter insert mode
 <C-r>"     " Insert the keystrokes of register '"' as if they were typed by the user

<C-r>文書化された挿入モードの効果はどこにありますか?
ニール

1
@Neil一般に、特定のモードのキーはで見つけることができます:h mode_keystroke。この場合、それは次のようになります:h i_ctrl-r
DJMcMayhem

@Loovjoああすみません、言及するのを忘れました。入力は複数行であると予想されるため、コンマや/gフラグについて心配する必要はありません。私は中にそれらの詳細を追加します。
DJMcMayhem

2
また、何をし0ii<esc>D@"ますか?
-Loovjo

1
マッピングですか?:)詳細な説明をありがとう、私はいつも何か新しいことを学びます!
クリスチャンロンドー

9

CJam、33バイト

q~{_[`';"];""L~""]:L~"]\1>3b=}%s~

オンラインでお試しください!

説明

q~                                  Read an evaluate input list.
  {                          }%     Map over each string in it:
   _                                 Duplicate the string, say S.
    [`';"];""L~""]:L~"]              Replace it the following list:
                                      [repr(S) '; "];" "L~" "]:L~"]
                       \             Bring S on top of the stack.
                        1>           Chop off the first char.
                          3b         Base-3 conversion.
                            =        Modular index into the list.
                               s~   Concatenate and run as CJam code.

「ハッシュ関数」1>3bマップ

  • 1文字の文字列を0(= 0 mod 5)に、
  • [B]291(= 1 MOD 5)、
  • [D]297(= 2 MOD 5)、
  • [P]333(= 3 MOD 5)、
  • [C]294(= 4 MOD 5)。

この値(mod 5)は、CJamコードスニペットのリストへのインデックスとして使用されます。

  • たとえば、1文字の文字列の場合h、スニペット"h"が返され、1文字の文字列がスタックにプッシュされます。
  • の場合[B];要素をポップするスニペットが返されます。
  • の場合[D]、スニペット];が返され、スタックがクリアされます。
  • の場合[P]、スタックにL~変数を追加するスニペットが返さLれます。
  • の場合[C]]:L~変数に現在のスタックを格納するスニペットが返されますL

これらのスニペットは連結されて実行されます。最終スタックはCJamによって暗黙的に印刷されます。L最初は空のリストなので、コピーバッファは最初は「空」です。


8

Python 2、96 95 93バイト

r=c=""
for o in input():c=[c,r][x=="[C]"];r=[r+c,r[:-1],r,"",r+o][ord(o[1:2]or"E")%5]
print r

スペースを節約するためor"E"の定義に移動できますxか?
xnor

@xnor私はそう信じています。
orlp

1
実際、定義するx価値はないようです。するx=="C"ことができますo=="[C]"
xnor

7

ゼリー50 51 48 バイト

Ṿ”;;µṭ“Ṗ“ø©“ḣ0“;®”
L>1a2ị$i@“BCDP0”ịÇ
Ç€“⁶Ṗ©”;FV

TryItOnline
またはすべてのテストケース

どうやって?

Ṿ”;;µṭ“Ṗ“ø©“ḣ0“;®” - Link 1, CreateCodeLookupValueList: keystroke
      “Ṗ“ø©“ḣ0“;®” - list of strings, ["Ṗ","ø©","ḣ0"";®"] - these are Jelly code for:
                         Ṗ  : pop (i.e. delete last entry)
                         ø© : niladic separation and copy to register (i.e. copy)
                         ḣ0 : head to 0 (i.e. delete all entries)
                         ;® : concatenate with value of register (i.e. paste)
    µ              - monadic chain separation
Ṿ                  - uneval - make a Jelly code version of the keystroke
                                               e.g. "I" -> "“I”"
 ”;                - string literal ";"                      |
   ;               - concatenate e.g. ";I"                   v
     ṭ             - tack, to make the list ["Ṗ","ø©",";®","“I”"] 
                             a keystroke - a command will evaluate to a string like
                             "“[C]”" but wont be accessed)

L>1a2ị$i@“BCDP0”ịÇ - Link 2, ConvertAKeystokeToJellyCodeString: keystroke
L>1                - length greater than 1? (i.e. isCommand?)
      $            - last two links as a monad
   a               - and
    2ị             - index 2 of the keystroke (0 due to and for a passive keystroke)
         “BCDP0”   - Literal string "BCP0"
       i@          - find first matching index of, with reversed arguments
                ị  - index into
                 Ç - call last link (1) as a monad (get code to replace this keystroke)

Ç€“⁶Ṗ©”;FV - Main link: list of keystrokes
Ç€         - call last link (2) as a monad (convert to Jelly code)
  “⁶Ṗ©”    - literal string "⁶Ṗ©" - setup the register with an empty string:
                 ⁶ :literal " ";
                 Ṗ : pop the space to give an empty string;
                 © : places it into the register
       ;   - concatenate (put that at the front)
        F  - flatten list (lists and strings are equivalent in Jelly)
         V - evaluate the string

例えば

The input:
    ['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'B', '[P]', '[P]', 's', '!']
Becomes the Jelly code:
    "⁶Ṗ©;“e”ø©Ṗ;“I”;“ ”;“l”;“i”;“k”;®;“ ”;“B”;®;®;“s”;“!”"
Which then evaluates to
    "I like Bees!"

-大文字'B'をテストケースとして、バグを修正する前に戻っていたため"I likeees!"


1
有効なテストケースかどうかはわかりませんが、非常に複雑な文字列を使用してみましたが、失敗するようです['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!']
ドムヘイスティングス

ああ-はい、私はこのエッジケースを見逃しました、文字列全体を削除する前にコピーがあり、私が書いたコードはそれを無視します。少し後で説明しますが、通知してくれてありがとう。
ジョナサンアラン

OKそれを修正し、実際にバイトも節約します!
ジョナサンアラン

7

JavaScript(ES6)、84 80 77 76バイト

@Neilのおかげで3バイト、@ edc65のおかげで1バイト節約

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":s+=z?t:c,t="")

.map 2バイト長い:

x=>x.map(([c,z])=>s=z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":s+=z?t:c,s=t="")&&s

テストスニペット


違いは、をreduce使用してバージョンを3バイト節約できることです(s,[c,z])
ニール

@ニールニース!これにより、.mapバージョンのバイトも節約されます。
ETHproductions

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')1バイト少ない。不思議なことに未定義<任意の文字が偽
-edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")もう1つのキャラクターを保存します。zが真である場合は貼り付け、そうでない場合は出力にcharを追加します。
Grax32

@Graxを貼り付けるときは、現在の出力に追加する必要があるためz?s+t:s+c、20バイトのs+=z?t:c
edc65

5

Perl、53 50バイト

+1を含む -p

改行で終了するSTDINに入力します(最後の改行は省​​略される場合があるため、改行で区切られた文字列としてカウントされます)

keystrokes.pl
H
e
[C]
[D]
a
b
[B]
[P]
z
^D

与える

aHez

keystrokes.pl

#!/usr/bin/perl -p
$\.=/^.$/?$&:/P/?$a:(/C/?$a=$\:chop($\x=/B/))x0}{

ゼリーの答えをほぼキャッチしましたが、悪魔は48バイトに逃げました...


4

パイソン120 119 116バイト

f=lambda s,r='',c='':f(s[1:],*{'B':(r[:-1],c),'C':(r,r),'D':('',c),'P':(r+c,c),'':(r+s[0],c)}[s[0][1:2]])if s else r

イデオネ

入力を持つ再帰関数s、キーストロークのリスト。

各再帰呼び出しは戻りテキストを更新し、raの場合は[C]クリップボードが空になるcまで更新しますs

新しい値rとはc、辞書にインデックス付けによって発見され{...}、かつ開梱と渡さ*。パッシブキーストロークでs[0][1:2]は空の文字列が返され、''代わりにキーが使用されます。


なぜラムダを定義するlambda s,r='',c=''代わりにlambda s,r,c=''でしょうか?
L.ステア

仕様では、文字の入力配列(ここs)を取得するため、関数は他の入力なしで機能する必要があります。
ジョナサンアラン

読解力の失敗をおMyび申し上げます。
L.ステア

4

Haskell、136133130127バイト

k c b(('[':m:_):i)|m<'C'=k c[q|b>"",q<-init b]i|m<'D'=k b b i|m<'P'=k c""i|1<3=k c(b++c)i
k c b(s:i)=k c(b++s)i
k c b[]=b
k""""

Ideoneでお試しください。

説明: kコマンドのリストに対して末尾再帰を実行します。b文字列が構築されるバッファでc、コピーされた部分を保存します。

k c b ("[B]":i) = k c (take(length b - 1)b) i -- remove last element of buffer
k c b ("[C]":i) = k b b i                     -- set copy to buffer
k c b ("[D]":i) = k c "" i                    -- clear the buffer
k c b ("[P]":i) = k c (b++c) i                -- append content of copy to the buffer
k c b (s:i)     = k c (b++s) i                -- append char to the buffer
k c b []        = b                           -- command list is empty, return buffer
f = k "" ""                                   -- initialise copy and buffer with empty strings

編集:いくつかのバイトを保存するために、コマンド[B][C][D][P]は完全に一致するのではなく、比較され'C'ます。-> Bなど。3バイトを節約してくれた@nimiに感謝します。


空のリストのinit b場合、@ nimi は例外をスローしますb
ライコニ

@nimiそれは賢い、ありがとう!匿名関数に関しては、匿名関数は唯一のステートメントであり、他のヘルパー関数がない場合にのみ受け入れられることを何らかの形で念頭に置いていました。しかし、メタを検索してもそのようなことは何もなかったので、大丈夫だと思います。
ライコニ

2
ここにあります。関数に評価される式のヘルパー関数を宣言できます。
-nimi

3

Mathematica、100バイト

""<>Fold[Switch[#2,"[B]",Most@#~Check~{},"[C]",a=#,"[D]",{},"[P]",#~Join~a,_,Append@##]&,a={};{},#]&

匿名関数。入力として文字列のリストを取り、出力として文字列を返します。生成されたメッセージを無視します。


2

Java 7、207 203バイト

String c(String[]a){String r="",c=r;for(String s:a){int k=s.length(),l=r.length(),z;if(k>1){z=s.charAt(1);r=z<67?l>0?r.substring(0,l-1):"":z<68?r:z<69?"":z<81?r+c:r+s;c=z==67?r:c;}r+=k<2?s:"";}return r;}

これは間違いなくもう少しゴルフすることができますが、これは私の最初の答えです。これらのequalsチェックを削除するものを見つけた後に編集します。に置き換えられますがcharAt、おそらくまだゴルフが可能です。

未ゴルフ&テストコード:

ここで試してみてください。

class M{
  static String c(final String[] a) {
    String r = "",
           c = r;
    for(String s : a){
      int k = s.length(),
          l = r.length(),
          z;
      if(k > 1){
        z = s.charAt(1);
        r = z < 67
             ? l > 0
                ? r.substring(0, l-1)
                : ""
             : z < 68
                ? r
                : z < 69
                   ? ""
                   : z < 81
                      ? r + c
                      : r + s;
        c = z == 67
             ? r
             : c;
      }
      r += k < 2
            ? s
            : "";
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "H", "e", "l", "l", "o" }));
    System.out.println(c(new String[]{ "H", "e", "l", "l", "o", " ", "[C]", "[P]" }));
    System.out.println(c(new String[]{ "[D]", "D", "[B]" }));
    System.out.println(c(new String[]{ "H", "[C]", "i", "[P]", "[C]", "[P]" }));
    System.out.println(c(new String[]{ "e", "[C]", "[B]", "I", " ", "l", "i", "k", "[P]", " ", "b", "[P]", "[P]", "s", "!" }));
    System.out.println(c(new String[]{ "N", "[P]" }));
    System.out.println(c(new String[]{ "#", "5", "0", "K", "0", "0", "1", "[D]", "#", "n", "o", "t" }));
    System.out.println(c(new String[]{ "H", "o", "w", " ", "[D]", "H", "e", "y" }));
    System.out.println(c(new String[]{ "s", "u", "d", "[B]", "p", "[C]", "[D]", "I", " ", "h", "a", "v", "e", " ", "[P]", "p", "e", "r", "!" }));
  }
}

出力:

Hello
Hello Hello 

HiHHiH
I like bees!
N
#not
Hey
I have supper!

2

PHP、131バイト

@IsmaelMiguel三項演算子による17バイトの節約

<?$c=[];foreach($_GET[a]as$v)($t=$v[1])!=P?$t!=C?$t!=B?$t!=D?$o[]=$v:$o=[]:array_pop($o):$c=$o:$o=array_merge($o,$c);echo join($o);

1
147バイト:<?$c=[];foreach($_GET[a]as$k=>$v)$v=="[P]"?$o=array_merge($o,$c):($v=="[C]"?$c=$o:($v=="[B]"?array_pop($o):$v=="[D]"?$o=[]:$o[]=$v));echo join($o);。(if()チェーン全体を一連の三元操作に置き換えました)。
イスマエルミゲル

@IsmaelMiguelありがとうございます。私は演算子を使用する望みがありませんでした
ヨルグヒュルサーマン

理由がわかります。それはとてもく見えます...そしてそれは本当に目を痛めるものです。
イスマエルミゲル

1

PHP、108バイト

for(;null!==$s=$argv[++$i];)($g=$s[1])!=B?$g!=C?$g!=D?$o.=$g!=P?$s:$c:$o='':$c=$o:$o=substr($o,0,-1);echo$o;

配列ベースのアプローチではなく、文字列ベースのアプローチを使用します。

次のように使用します:

php -r "for(;null!==$s=$argv[++$i];)($g=$s[1])!=B?$g!=C?$g!=D?$o.=$g!=P?$s:$c:$o='':$c=$o:$o=substr($o,0,-1);echo$o;" a b "[C]" "[B]" "[P]" "[C]" "[D]" j "[P]"

編集:?:sの順序をいじって8バイトを節約し、非常に多くのブラケットを使用する必要がないように負にします。


$s=$argv[++$i]代わりに、null!==$s=$argv[++$i]あなたはPHP> 7を使用する場合は書くことができ$s=$argv[++$i]??0、通知をスキップする
イェルクHülsermann

1
通知をスキップするのではなく'0'、どのよう'0'に間違っているかを確認できるようにするためにあります。スキップすることは時間の無駄のように思えるという他の多くの通知があります。
user59178

1

SpecBAS-216バイト

1 s$,t$="": INPUT a$: DIM b$(SPLIT a$,NOT ",")
2 FOR EACH l$ IN b$()
3 CASE l$
4 WHEN "[B]": s$=s$( TO LEN s$-1)
5 WHEN "[C]": t$=s$
6 WHEN "[D]": s$=""
7 WHEN "[P]": s$=s$+t$
8 OTHERWISE : s$=s$+l$
9 END CASE
10 NEXT l$: ?s$

入力はコンマを含む文字列として与えられ、その後コンマに変換されます。

enter image description here


1

V、49バイト

íÛBÝ/
íÛCÝ/0y$A
íÛDÝ/"_S
íÛPÝ/"
íî
0éiD@"

オンラインでお試しください!

これには印刷できない文字が含まれているため、hexdumpを次に示します。

0000000: eddb 42dd 2f16 080a eddb 43dd 2f16 1b30  ..B./.....C./..0
0000010: 7924 410a eddb 44dd 2f16 1b22 5f53 0aed  y$A...D./.."_S..
0000020: db50 dd2f 1612 220a edee 0a30 e969 4440  .P./.."....0.iD@
0000030: 22

これは単なる直接翻訳です 、Jellyと競争できるよう、Vimの回答を。残念ながら、私はまだ1バイトを超えていますが、最後の1つに取り組んでいます。:)

とにかくその答えをもっと誇りに思っているので、非常に詳細な説明が必要な場合は、代わりにそれを読んでください。


1

実際には、56バイト

''j"'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ''+ƒkΣR

オンラインでお試しください!

説明:

''j"'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ''+ƒkΣR
''j                                                       insert an apostrophe between every pair of commands
   "'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ         replace:
   "'[B]"'XaÆ                                               "'[B]" with "X"
             "'[C]""k;╗i"aÆ                                 "'[C]" with "k;╗i"
                           "'[P]""╜i"aÆ                     "'[P]" with "╜i"
                                       "'[D]"'éaÆ           "'[D]" with "é"
                                                 ''+      prepend an apostrophe
                                                          now the input has been converted to the equivalent Actually program ("'<character>" pushes the character, "X" removes the last character, "k;╗i" saves the current stack state to a register, and "╜i" pushes the saved stack state)
                                                    ƒ     execute the code
                                                     kΣ   concatenate the characters
                                                       R  reverse the string

1

Java、181

String v(String[]a){String r="",c=r;for(String s:a){try{int p=s.charAt(1)%5;r=p<1?r+c:p>2?"":p==1?r.length()<2?"":r.split(".$")[0]:r;c=p==2?r:c;}catch(Exception e){r+=s;}}return r;}

より読みやすいバージョン:

String v(String[]a){
    String r="",c=r;
    for(String s:a){
        try{
            int p=s.charAt(1)%5;
            r= p<1
                 ? r+c
                 : p>2
                    ? ""
                    :p==1
                        ? r.length()<2
                                     ?""
                                     :r.split(".$")[0]
                        :r;
            c=p==2?r:c;
        }catch(Exception e){
            r+=s;
        }
    }return r;
}

try catchをif(s.length()>1){...}else
-AxelH

に変更しp==1ますp<2
AxelH

1

MATL、46バイト

vXKx"@gtnq?2)XJ66=?3L)}J67=?XK}J68=?vx}K]]]]&h

オンラインでお試しください!または、すべてのテストケースを確認します

説明

v                % Push empty array
XK               % Copy to clipboard K. This initiallizes it as empty
x                % Delete
"                % Implicitly input cell array. For each
  @g             % Push current cell's contents
  t              % Duplicate elements
  n              % Number of elements
  q?             % If more then 1
    2)           % Get second char. Copy to clipboard J
    66=?         % If it ss 'B'
      3L)        % Remove last element from string built up to now
    }            % Else
      J67=?      % If it was a 'C'
        XK       % Copy string built up to now into clipboard K
      }          % Else
        J68=?    % If was a 'D'
          vx     % Delete stack. This deletes string built up to now, if any
        }        % Else: it was a 'P'
          K      % Paste from clipboard K
        ]        % End if
      ]          % End if
    ]            % End if
  ]              % End if
  &h             % Horizontally concatenate stack
                 % Implicitly end for
                 % Implicitly display

1

TCL、186バイト

proc t w {foreach "B C P N D r Q" [list {[string range $r 0 end-1]} {[set Q $r]} {$r$Q} {$r$g}] break;foreach g $w {eval "set c \$[string index ${g}N 1]";eval "set r \"$c\""};return $r}

きれいにフォーマット:

proc t w {
    foreach "B C P N D r Q" [list {[string range $r 0 end-1]} {[set Q $r]} {$r$Q} {$r$g}] break;
    foreach g $w {
        eval "set c \$[string index ${g}N 1]"
        eval "set r \"$c\""
    }
    return $r
}

TCLでこれができることを証明したかっただけです。


あなたはバイトを保存することができます置き換えるforeachことでlmapreturnによってset x。これは一目で言えることです。
sergiol

1

Scala、158バイト

(i:Seq[String])=>(("","")/:i){case((a,c),k)=>if(k.size<2)(a+k,c)else
if(k=="[B]")(a dropRight 1,c)else
if(k=="[C]")(a,a)else
if(k=="[D]")("",c)else(a+c,c)}._1

ゴルフをしていない:

(i:Seq[String]) => i.foldLeft(("", "")){
  case ((res,clipboard),key) =>
    if (k.size == 1) (res+key,clipboard)
    else if (k=="[B]") (res dropRight 1, clipboard)
    else if (k=="[C]") (res, res)
    else if (k=="[D]") ("", clipboard)else(acc+clipboard,clipboard)
}._1

結果とクリップボードをアキュムレーターとして折り畳みとしてこの問題を解決します。悲しいことに、scalaには三項条件演算子はありませんが、代わりにif else式として使用します。


1

PHP 7.1、95の 92バイト

注:負の文字列オフセットにはPHP 7.1が必要です。

for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o[-1]="":$o.=$i;echo$o;

負の文字列オフセット(101バイト)なし:

php -r 'for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o=substr($o,0,-1):$o.=$i;echo$o;' e [C] [B] I ' ' l i k [P] ' ' b [P] [P] s ! 2>/dev/null;echo

次のように実行します:

php -nr 'for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o[-1]="":$o.=$i;echo$o;' e [C] [B] I ' ' l i k [P] ' ' b [P] [P] s !;echo
> I like bees!

説明

for(
  ;
  n|$i=$argv[++$x];   # Iterates over the input until null.
)
  ($l=$i[1])?         # Check if this item is a command, if so set to $l
    $l^r?             # If the command is not B
      $l^s?           # If the command is not C
        $l^t?         # If the command is not D
          $o.=$c      # Then it's P, so paste the clipboard ($c)
        :$o=""        #      It's D, so delete output
      :$c=$o          #      It's C, so copy output to clipboard
    :$o[-1]=""        #      It's B, so remove the last output char
  :$o.=$i;            # No command, add the current item to the output.

echo$o;               # Print the output.

微調整

  • 出力処理とコマンド処理を組み合わせることで3バイトを節約しました

PHPエントリの詳細を説明して
くれてうれしいです
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.