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
- Códigos de caracteres ASCII
[32-126]
- Códigos de caracteres ASCII
- Comandos:
[B]
: backspace (remova o último caractere adicionado, se houver um)[C]
: copie tudo o que já foi escrito[D]
: exclua tudo o que foi escrito[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 é código-golfe , então o código mais curto em bytes vence!
[D]
onde não é o único usado, para que o código não seja apenassplit('[D]')[1]
ou algo assim.[D]
Respostas:
05AB1E ,
34333127 bytesUsa a codificação CP-1252 .
Experimente online!
Explicação
Os pares de funções avaliados no código acima são:
Salva 4 bytes usando o
mod 5
truque da resposta CJam de Lynnfonte
Teclas Vim,
76, 64, 62, 58Agradecimentos 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!
A entrada vem neste formato:
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.
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:nnoremap
que significa "Quando estamos no modo normal, substitua este lado esquerdo por este lado direito". Como estamos ligando:%s/
cinco vezes , isso economiza muito. O\M
truque é 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]
porCtrl-h
, o que equivale ao backspace no vim.[C]: copia tudo o que já foi escrito. Isso é traduzido para
<esc>0y$A
. Isso significa:Poderíamos quase simplesmente fazer
Y
no lugar do0y$
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[P]: cole o que foi copiado. Este também é muito direto. É exatamente o
<C-r>"
que significaInsert 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
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:
fonte
<C-r>
documentado?:h mode_keystroke
. Nesse caso, seria:h i_ctrl-r
/g
sinalizador. Vou adicionar esses detalhes.0ii<esc>D@"
fazer?CJam , 33 bytes
Experimente online!
Explicação
Os
1>3b
mapas da "função hash"[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:
h
, o snippet"h"
é retornado, o que envia uma cadeia de caracteres únicos para a pilha.[B]
, o trecho;
é retornado, que exibe um elemento.[D]
, o snippet];
é retornado, o que limpa a pilha.[P]
, o trechoL~
é retornado, que acrescenta variávelL
à pilha.[C]
, o snippet]:L~
é retornado, que armazena a pilha atual na variávelL
.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".fonte
Python 2,
969593 bytesfonte
or"E"
para a definição dex
para economizar espaço?x
não vale a pena. Ox=="C"
pode ser apenaso=="[C]"
.Geléia ,
50 5148 bytesTryItOnline
Ou todos os casos de teste
Quão?
Por exemplo
- com uma capital
'B'
como um caso de teste, pois antes de eu corrigir um bug, ele retornaria"I likeees!"
fonte
['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!']
.JavaScript (ES6),
84807776 bytesGuardado 3 bytes graças a @Neil, mais 1 obrigado a @ edc65
.map
tem dois bytes a mais:Snippet de teste
Mostrar snippet de código
fonte
reduce
versão usando(s,[c,z])
..map
versão também.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 #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.z?s+t:s+c
que é 1 byte mais do ques+=z?t:c
Perl,
5350 bytesInclui +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):
dá
keystrokes.pl
:Quase peguei a resposta Jelly, mas o demônio escapou para 48 bytes ...
fonte
Python
120 119116 bytesIdeone
Uma função recursiva com entrada,,
s
uma lista dos pressionamentos de tecla.Cada chamada recursiva atualiza o texto de retorno
r
e, no caso de[C]
, a área de transferência,c
atés
ficar vazio.Os novos valores de
r
ec
são encontrados indexando em um dicionário{...}
e transmitidos com a descompactação*
. Para as teclas passivass[0][1:2]
, retornará uma string vazia e a tecla''
será usada.fonte
lambda s,r='',c=''
vez delambda s,r,c=''
?s
) para que a função precise trabalhar com nenhuma outra entrada.Haskell,
136133 130127 bytesExperimente em Ideone.
Explicação:
k
executa uma recursão final sobre uma lista de comandos.b
é o buffer no qual a string é construída,c
salva a parte copiada.Editar: para salvar alguns bytes, os comandos
[B][C][D][P]
não são mais correspondidos exatamente, mas comparados: menos que'C'
? ->B
e assim por diante. Obrigado a @nimi por salvar 3 bytes.fonte
init b
lança uma exceção seb
for a lista vazia.Mathematica, 100 bytes
Função anônima. Pega uma lista de cadeias como entrada e retorna uma cadeia como saída. Ignore todas as mensagens geradas.
fonte
Java 7,
207203 bytesDefinitivamente, isso pode ser um pouco mais jogado,
mas esta é minha resposta inicial. Será editado depois que eu encontrar algo para remover essessubstituídos porequals
cheques ..charAt
, mas provavelmente ainda poderão ser jogados ..Ungolfed & código de teste:
Experimente aqui.
Saída:
fonte
PHP, 131 bytes
17 bytes salvos pelo operador ternário @IsmaelMiguel
fonte
<?$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 suaif()
cadeia por uma cadeia de operações trenárias).PHP, 108 bytes
Usa uma abordagem baseada em string em vez de uma abordagem baseada em array.
Use como:
edit: economizou 8 bytes, mexendo na ordem dos?: s e tornando-os negativos para evitar ter que usar tantos colchetes;
fonte
$s=$argv[++$i]
em vez denull!==$s=$argv[++$i]
se você usa PHP> 7, você pode escrever$s=$argv[++$i]??0
para ignorar o aviso'0'
veja como'0'
é falso. Existem tantos outros avisos que pular que um em particular parece uma perda de tempo.SpecBAS - 216 bytes
A entrada é fornecida como uma string com vírgulas, que depois é transformada em array.
fonte
V , 49 bytes
Experimente online!
Como ele contém caracteres não imprimíveis, aqui está um hexdump:
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.
fonte
Na verdade, 56 bytes
Experimente online!
Explicação:
fonte
Java, 181
Versão mais legível:
fonte
if(s.length()>1){...}else
p==1
emp<2
MATL , 46 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
TCL, 186 bytes
Bem formatado:
Eu só queria provar que poderia fazer isso no TCL
fonte
foreach
porlmap
;return
porset x
. É o que posso dizer rapidamente.Scala, 158 bytes
Ungolfed:
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 else
como expressão.fonte
PHP 7.1,
9592 bytesNota: requer PHP 7.1 para deslocamentos negativos de string.
Sem deslocamentos negativos de sequência (101 bytes):
Execute assim:
Explicação
Tweaks
fonte