模拟按键


33

您的工作是模拟用户键入的几次击键。

输入项

您选择的分隔符(在32-126范围之外)的字符串数组或字符串,其中至少包含一个“击键”。

该数组仅包含两种类型的字符串:被动击键(单个字符)和命令(括号内的字符[ ])。

  • 被动击键
    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表示蜜蜂的测试用例:)
Jonathan Allan

还应该有一个示例,[D]其中它不是唯一使用的示例,因此代码将不仅仅如此split('[D]')[1]
mbomb007 '16

@ mbomb007,我添加了测试用例(#8,#9)
Daniel

而且我认为mbomb007正在要求删除多个测试用例。
马丁·恩德

@MartinEnder,哦,我想他想要的命令是除[D]
丹尼尔

Answers:


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击键

感谢Loovjo节省了7次击键


有人说过模拟按键吗?那么,这是一件好事,我最喜欢的语言,以高尔夫为所有关于模拟键盘按键!

: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/ 五个不同的时间,因此可以节省很多时间。这\M是一个很好的技巧。这意味着下面的搜索将是“ Very No Magic”,这意味着正则表达式[B]将匹配文字文本,[B]而不是其中仅包含B的范围。由于大多数替代命令中都有方括号,因此我们填写第一个方括号。

然后,我们调用五个替代命令。值得注意的是为什么我打了<C-v>这么多次电话。字符,如<esc><C-v><C-r>等是不可打印的字符,并且必须键入到与命令行<C-v>

  • [B]:退格键。这很简单。只需将它们替换[B]Ctrl-h,这等效于vim中的退格键。

  • [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.
    

    我们几乎可以简单地Y代替0y$它来表示“整行”,但这也抓住了我们不想要的换行符。

  • [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映射

  • 单字符字符串为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代码段列表的索引:

  • 对于单字符字符串,比如h,代码段"h"返回,该推一个单字符串到堆栈中。
  • 对于[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', '!']
Dom Hastings

嗯-是的,我错过了这种情况,删除整个字符串之前有一个副本,而我编写的代码忽略了它。我会稍后再看,感谢您通知我。
乔纳森·艾伦

好吧,我修复了它,它实际上也节省了字节!
乔纳森·艾伦

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 长两个字节:

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 '10 / 10/10

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="")多保存一个字符。如果z为真,则粘贴,否则将char添加到输出。
Grax32

@Grax粘贴时必须添加到当前输出,因此z?s+t:s+cs+=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

的Python 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,一个击键列表。

每个递归调用都会更新返回文本,r如果是[C]剪贴板,则更新返回文本,c直到s为空。

的新值rc被发现的索引到一个字典,{...}以及与拆包过去了,*。对于被动击键,s[0][1:2]将返回一个空字符串,而''将使用该键。


我可能会问为什么您将lambda定义为lambda s,r='',c=''而不是lambda s,r,c=''
L. Steer

规范是我们采用字符输入数组(在此处s),因此该函数无需其他输入即可使用。
乔纳森·艾伦

抱歉,阅读理解失败。
L. Steer

4

Haskell中,136个133 130 127字节

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依此类推。感谢@nimi节省了3个字节。


init b如果b为空列表,则@nimi 引发异常。
Laikoni '16

@nimi这很聪明,谢谢!至于匿名函数,我以某种方式牢记了匿名函数仅在它们是唯一的语句且没有其他辅助函数时才可接受。但是搜索Meta并没有得到类似的结果,所以我认为这没关系。
Laikoni '16

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-checks ..与取代charAt,但可能仍然被golfed ..

取消测试代码:

在这里尝试。

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()链替换为三级操作链)。
Ismael Miguel

@IsmaelMiguel谢谢。我不希望使用运营商
约尔格Hülsermann

我明白为什么。它看起来很丑,而且...确实伤害了眼睛。
Ismael Miguel

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 '16

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$

输入以带逗号的字符串形式给出,然后将其转换为数组。

在此处输入图片说明


1

V,49字节

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

在线尝试!

由于其中包含不可打印的字符,因此这里是一个十六进制转储:

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

这只是我vim答案的直接翻译,以便我可以与Jelly竞争。不幸的是,我还剩一个字节,但我仍在处理最后一个字节。:)

无论如何,我都为这个答案感到骄傲,因此,如果您想要一个非常详细的说明,请改为阅读该说明。


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

爪哇省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==1p<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中做到这一点


您可以保存字节:更换foreachlmap; returnset x。我可以快速浏览一下。
sergiol '17

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字符串偏移量需要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条目得到了详细的解释:)
Emigna '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.