Simular pressionamentos de tecla

33

Seu trabalho é simular algumas teclas digitadas pelo usuário.

Entrada

Uma matriz de string ou string com um delimitador de sua escolha (fora do intervalo 32-126) contendo pelo menos um 'pressionamento de tecla'.

Essa matriz conterá apenas dois tipos de sequência: pressionamentos de tecla passivos (caracteres únicos) e comandos (caracteres entre colchetes [ ]).

  • Teclas passivas
    1. Códigos de caracteres ASCII [32-126]
  • Comandos:
    1. [B] : backspace (remova o último caractere adicionado, se houver um)
    2. [C] : copie tudo o que já foi escrito
    3. [D] : exclua tudo o que foi escrito
    4. [P] : cole o que foi copiado

Saída

A sequência produzida pelas teclas.

Exemplos

['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!'

Isso é , então o código mais curto em bytes vence!

Daniel
fonte
FYI eu encontrei um bug no meu código, posso sugerir um caso de teste com um capital B para as abelhas :)
Jonathan Allan
Também deve haver um exemplo de [D]onde não é o único usado, para que o código não seja apenas split('[D]')[1]ou algo assim.
mbomb007
@ mbomb007, acrescentei casos de teste (# 8, # 9)
Daniel
E acho que o mbomb007 estava pedindo um caso de teste com várias exclusões.
Martin Ender
@MartinEnder, oh, eu pensei que ele queria um onde há comandos que não sejam #[D]
Daniel

Respostas:

7

05AB1E , 34 33 31 27 bytes

Usa a codificação CP-1252 .

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

Experimente online!

Explicação

õ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

Os pares de funções avaliados no código acima são:

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 

Salva 4 bytes usando o mod 5truque da resposta CJam de Lynn

Emigna
fonte
34

Teclas Vim, 76, 64, 62 , 58

Agradecimentos a Loovjo por salvar 7 pressionamentos de tecla


Alguém disse simular pressionamentos de tecla? Bem, então, é uma coisa boa minha linguagem favorita para golfe em é tudo sobre as teclas digitadas simulando!

: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>"

A entrada vem neste formato:

h
e
l
l
o

[C]
[P]

Esta é uma resposta bastante direta. Ele apenas converte cada "comando" para o pressionamento de tecla vim equivalente a esse comando. Vamos levá-lo linha por linha.

:no s :%s/\M[

Isso economiza uma tonelada de bytes. O Vim possui uma "linha de comando" embutida, na qual você pode criar mapeamentos, alterar configurações, salvar arquivos etc. Aqui estamos criando um mapeamento. :noé curto, o :nnoremapque significa "Quando estamos no modo normal, substitua este lado esquerdo por este lado direito". Como estamos ligando :%s/ cinco vezes , isso economiza muito. O \Mtruque é bom. Isso significa que a pesquisa a seguir será "Very No Magic", o que significa que o regex [B]corresponderá ao texto literal em [B]vez de um intervalo que contém apenas um B nele. Como a maioria dos comandos substitutos tem colchetes, preenchemos o primeiro.

Então, chamamos cinco comandos substitutos. Vale a pena notar por que liguei <C-v>tantas vezes. Personagens como <esc>, <C-v>, <C-r>, etc, são caracteres não imprimíveis, e deve ser digitado na linha de comando com um <C-v>.

  • [B]: retrocesso. Este é bem fácil. Simplesmente substitua cada um [B]por Ctrl-h, o que equivale ao backspace no vim.

  • [C]: copia tudo o que já foi escrito. Isso é traduzido para <esc>0y$A. Isso significa:

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

    Poderíamos quase simplesmente fazer Yno lugar do 0y$que significa "arrancar toda a linha", mas isso também pega uma nova linha que não queremos.

  • [D]: exclua tudo o que foi escrito. Isto é <esc>"_S. Como antes, <esc>sai do modo de inserção para que possamos executar comandos. Existem algumas coisas que são mais convenientes aqui. Então nós fazemos

      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]: cole o que foi copiado. Este também é muito direto. É exatamente o <C-r>"que significa Insert the contents of register '"'. "passa a ser o registro principal para o qual 'y' puxa.

Agora que traduzimos todos os comandos, precisamos unir todas as linhas removendo todos os caracteres da nova linha. Graças ao nosso mapeamento, isso é apenas

s<bs>\n

O <bs>é um backspace (ASCII 0x08) e precisamos dele por causa do [preenchimento.

Até agora, já traduzimos a entrada no código vim e precisamos executá-lo. Então nós:

S           " Delete this whole line and enter insert mode
 <C-r>"     " Insert the keystrokes of register '"' as if they were typed by the user
DJMcMayhem
fonte
Onde está o efeito do modo Inserir <C-r>documentado?
Neil
1
@ Neil Em geral, você pode encontrar uma chave para um modo específico em :h mode_keystroke. Nesse caso, seria:h i_ctrl-r
DJMcMayhem
@Loovjo Oh, desculpe, eu esqueci de mencionar. A entrada deve estar em várias linhas, para que eu não precise me preocupar com vírgulas ou com o /gsinalizador. Vou adicionar esses detalhes.
DJMcMayhem
2
Além disso, o que 0ii<esc>D@"fazer?
Loovjo 10/10
1
Mapeamentos, não é? :) obrigado pela explicação detalhada, eu sempre aprendo algo novo!
Christian Rondeau
9

CJam , 33 bytes

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

Experimente online!

Explicação

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.

Os 1>3bmapas da "função hash"

  • cadeias de caracteres únicos para 0 (= 0 mod 5),
  • [B]para 291 (= 1 mod 5),
  • [D]para 297 (= 2 mod 5),
  • [P]a 333 (= 3 mod 5),
  • [C]para 294 (= 4 mod 5).

Este valor (mod 5) é usado como um índice em uma lista de trechos de código CJam:

  • Para cadeias de caracteres únicos, digamos h, o snippet "h"é retornado, o que envia uma cadeia de caracteres únicos para a pilha.
  • Para [B], o trecho ;é retornado, que exibe um elemento.
  • Para [D], o snippet ];é retornado, o que limpa a pilha.
  • Para [P], o trecho L~é retornado, que acrescenta variável Là pilha.
  • Para [C], o snippet ]:L~é retornado, que armazena a pilha atual na variável L.

Esses trechos são concatenados e executados; a pilha final é impressa implicitamente pelo CJam. Lé inicialmente a lista vazia, portanto o buffer de cópia é inicialmente "vazio".

Lynn
fonte
8

Python 2, 96 95 93 bytes

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
orlp
fonte
Você pode mover or"E"para a definição de xpara economizar espaço?
Xnor
@ xnor Eu acredito que sim.
Orlp 10/10
1
Na verdade, parece que definir xnão vale a pena. O x=="C"pode ser apenas o=="[C]".
Xnor 10/10
7

Geléia , 50 51 48 bytes

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

TryItOnline
Ou todos os casos de teste

Quão?

Ṿ”;;µṭ“Ṗ“ø©“ḣ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

Por exemplo

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!"

- com uma capital 'B'como um caso de teste, pois antes de eu corrigir um bug, ele retornaria"I likeees!"

Jonathan Allan
fonte
1
Eu não tenho certeza que é um caso de teste válido, mas eu tentei com uma corda excessivamente complexa e este parece falhar: ['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!'].
Dom Hastings
Ah - sim, eu perdi esse caso extremo, há uma cópia antes de excluir toda a string e o código que escrevi a ignora. Vou olhar um pouco mais tarde, obrigado por me notificar.
Jonathan Allan
OK, eu consertei isso e ele realmente salva bytes também!
Jonathan Allan
7

JavaScript (ES6), 84 80 77 76 bytes

Guardado 3 bytes graças a @Neil, mais 1 obrigado a @ edc65

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

.map tem dois bytes a mais:

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

Snippet de teste

ETHproductions
fonte
A diferença é que você pode salvar 3 bytes na reduceversão usando (s,[c,z]).
Neil
@Neil Nice! Isso economiza um byte na .mapversão também.
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 byte a menos. Curiosamente indefinido <any char is false #
edc65 10/10
x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")salva mais um personagem. Se z for verdade, cole e adicione char à saída.
Grax32
@Grax ao colar que você tem que adicionar a saída de corrente, de modo z?s+t:s+cque é 1 byte mais do ques+=z?t:c
edc65
5

Perl, 53 50 bytes

Inclui +1 para -p

Dê entrada no STDIN terminado por novas linhas (a última nova linha pode ser deixada de fora, portanto conta como uma sequência separada por novas linhas):

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}{

Quase peguei a resposta Jelly, mas o demônio escapou para 48 bytes ...

Ton Hospel
fonte
4

Python 120 119 116 bytes

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

Ideone

Uma função recursiva com entrada,, suma lista dos pressionamentos de tecla.

Cada chamada recursiva atualiza o texto de retorno re, no caso de [C], a área de transferência, caté sficar vazio.

Os novos valores de re csão encontrados indexando em um dicionário {...}e transmitidos com a descompactação *. Para as teclas passivas s[0][1:2], retornará uma string vazia e a tecla ''será usada.

Jonathan Allan
fonte
Posso perguntar por que você define o lambda como em lambda s,r='',c=''vez de lambda s,r,c=''?
L. Steer
A especificação é que usamos uma matriz de caracteres de entrada (aqui s) para que a função precise trabalhar com nenhuma outra entrada.
Jonathan Allan
Minhas desculpas, falha na compreensão da leitura.
L. Steer
4

Haskell, 136133 130 127 bytes

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""""

Experimente em Ideone.

Explicação: k executa uma recursão final sobre uma lista de comandos. bé o buffer no qual a string é construída, csalva a parte copiada.

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

Editar: para salvar alguns bytes, os comandos [B][C][D][P]não são mais correspondidos exatamente, mas comparados: menos que 'C'? -> Be assim por diante. Obrigado a @nimi por salvar 3 bytes.

Laikoni
fonte
@nimi init blança uma exceção se bfor a lista vazia.
Laikoni 10/10
@nimi Isso é inteligente, obrigado! Quanto à função anônima, de alguma forma, eu tinha em mente que as funções anônimas só são aceitáveis ​​quando são a única declaração e não existem outras funções auxiliares. No entanto, procurar Meta não apareceu nada assim, então acho que está tudo bem.
Laikoni 10/10
2
Aqui está . É permitido declarar funções auxiliares para expressões que avaliam funções.
nimi
3

Mathematica, 100 bytes

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

Função anônima. Pega uma lista de cadeias como entrada e retorna uma cadeia como saída. Ignore todas as mensagens geradas.

LegionMammal978
fonte
2

Java 7, 207 203 bytes

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;}

Definitivamente, isso pode ser um pouco mais jogado, mas esta é minha resposta inicial. Será editado depois que eu encontrar algo para remover esses equalscheques .. substituídos por charAt, mas provavelmente ainda poderão ser jogados ..

Ungolfed & código de teste:

Experimente aqui.

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", "!" }));
  }
}

Saída:

Hello
Hello Hello 

HiHHiH
I like bees!
N
#not
Hey
I have supper!
Kevin Cruijssen
fonte
2

PHP, 131 bytes

17 bytes salvos pelo operador ternário @IsmaelMiguel

<?$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);
Jörg Hülsermann
fonte
1
147 bytes: <?$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);. (substituiu toda a sua if()cadeia por uma cadeia de operações trenárias).
Ismael Miguel
@IsmaelMiguel Thank You. Eu não tinha vontade de usar o operador
Jörg Hülsermann
Eu posso ver o porquê. Parece tão feio e ... é realmente algo que machuca os olhos.
Ismael Miguel
1

PHP, 108 bytes

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;

Usa uma abordagem baseada em string em vez de uma abordagem baseada em array.

Use como:

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]"

edit: economizou 8 bytes, mexendo na ordem dos?: s e tornando-os negativos para evitar ter que usar tantos colchetes;

user59178
fonte
$s=$argv[++$i]em vez de null!==$s=$argv[++$i]se você usa PHP> 7, você pode escrever $s=$argv[++$i]??0para ignorar o aviso
Jörg Hülsermann 10/10
1
Não existe para ignorar o aviso, mas para permitir que você '0'veja como '0'é falso. Existem tantos outros avisos que pular que um em particular parece uma perda de tempo.
user59178
1

SpecBAS - 216 bytes

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$

A entrada é fornecida como uma string com vírgulas, que depois é transformada em array.

insira a descrição da imagem aqui

Brian
fonte
1

V , 49 bytes

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

Experimente online!

Como ele contém caracteres não imprimíveis, aqui está um 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

Esta é apenas uma tradução direta da minha resposta vim para que eu pudesse competir com a Jelly. Infelizmente, ainda estou com um byte a mais, mas ainda estou trabalhando no último. :)

De qualquer maneira, estou mais orgulhoso dessa resposta; portanto, se você quiser uma explicação muito detalhada, leia essa.

DJMcMayhem
fonte
1

Na verdade, 56 bytes

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

Experimente online!

Explicação:

''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
Mego
fonte
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;}

Versão mais legível:

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;
}
dpa97
fonte
Você pode salvar alguns bytes (1 ou 2) alterando sua captura de tentativa para umif(s.length()>1){...}else
AxelH 11/16
e alterar a p==1emp<2
AxelH
1

MATL , 46 bytes

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

Experimente online! Ou verifique todos os casos de teste .

Explicação

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
Luis Mendo
fonte
1

TCL, 186 bytes

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}

Bem formatado:

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
}

Eu só queria provar que poderia fazer isso no TCL

Grax32
fonte
Você pode salvar bytes: substitua foreachpor lmap; returnpor set x. É o que posso dizer rapidamente.
sergiol 15/02
1

Scala, 158 bytes

(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

Ungolfed:

(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

Resolve esse problema como uma dobra com o resultado e a área de transferência como acumulador. Infelizmente, scala não tem um operador condicional ternário, mas usa if elsecomo expressão.

corvus_192
fonte
1

PHP 7.1, 95 92 bytes

Nota: requer PHP 7.1 para deslocamentos negativos de string.

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;

Sem deslocamentos negativos de sequência (101 bytes):

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

Execute assim:

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!

Explicação

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.

Tweaks

  • Economizou 3 bytes combinando a manipulação de saída com a manipulação de comando
aross
fonte
Bom ver uma entrada de PHP explicado em detalhes :)
Emigna