Su trabajo es simular un par de pulsaciones de teclas que escribe un usuario.
Entrada
Un conjunto de cadenas o cadenas con un delimitador de su elección (fuera del rango 32-126) que contiene al menos una 'pulsación de tecla'.
Esta matriz solo contendrá dos tipos de cadenas: pulsaciones de teclas pasivas (caracteres únicos) y comandos (caracteres entre paréntesis [ ]
).
- Pulsaciones de teclas pasivas
- Códigos de caracteres ASCII
[32-126]
- Códigos de caracteres ASCII
- Comandos:
[B]
: retroceso (eliminar el último carácter agregado si hay uno)[C]
: copie todo lo que ya se ha escrito[D]
: borra todo lo que se ha escrito[P]
: pegar lo que se ha copiado
Salida
La cadena producida por las pulsaciones de teclas.
Ejemplos
['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!'
Este es el código de golf , por lo que gana el código más corto en bytes.
[D]
dónde no es el único utilizado, por lo que el código no será solosplit('[D]')[1]
o algo así.[D]
Respuestas:
05AB1E ,
34333127 bytesUtiliza la codificación CP-1252 .
Pruébalo en línea!
Explicación
Los pares de funciones evaluadas en el código anterior son:
Guardado 4 bytes usando el
mod 5
truco de la respuesta CJam de Lynnfuente
Vim,
76, 64, 62, 58 pulsaciones de teclasGracias a Loovjo por guardar 7 pulsaciones de teclas
¿Alguien dijo simular pulsaciones de teclas? Pues bien, es una buena cosa mi idioma preferido al golf en es todo acerca de las pulsaciones de teclas que simulan!
La entrada viene en este formato:
Esta es una respuesta bastante directa. Simplemente traduce cada "comando" al equivalente de pulsación de tecla vim de ese comando. Tomémoslo línea por línea.
Esto ahorra una tonelada de bytes. Vim tiene una "línea de comando" incorporada donde puede crear asignaciones, cambiar configuraciones, guardar archivos, etc. Aquí estamos creando una asignación.
:no
es la abreviatura de lo:nnoremap
que significa "Cuando estamos en modo normal, sustituya este lado izquierdo por este lado derecho". Como estamos llamando:%s/
cinco veces diferentes , esto ahorra mucho. El\M
es un buen truco. Significa que la siguiente búsqueda será "Very No Magic", lo que significa que la expresión regular[B]
coincidirá con el texto literal en[B]
lugar de un rango que contenga solo una B en él. Como la mayoría de los comandos sustitutos tienen corchetes, completamos el primero.Luego, llamamos a cinco comandos sustitutos. Vale la pena señalar por qué llamé
<C-v>
tantas veces. Los personajes como<esc>
,<C-v>
,<C-r>
, etc, son caracteres no imprimibles, y se deben escribir en la línea de comandos con una<C-v>
.[B]: retroceso. Esta es bastante fácil. Simplemente sustituya cada uno
[B]
conCtrl-h
, que es equivalente a retroceso en vim.[C]: copie todo lo que ya se ha escrito. Esto se traduce a
<esc>0y$A
. Esto significa:Casi podríamos hacer
Y
en lugar de lo0y$
que significa "tirar de toda la línea", pero esto también toma una nueva línea que no queremos.[D]: borra todo lo que se ha escrito. Esto es
<esc>"_S
. Como antes,<esc>
sale del modo de inserción para que podamos ejecutar comandos. Hay algunas cosas que son más convenientes aquí. Entonces hacemos[P]: pegar lo que se ha copiado. Este también es muy sencillo. Es solo lo
<C-r>"
que significaInsert the contents of register '"'
."
resulta ser el registro principal al que 'y' tira.Ahora que hemos traducido todos los comandos, debemos unir todas las líneas eliminando todos los caracteres de nueva línea. Gracias a nuestro mapeo, esto es solo
El
<bs>
es un retroceso, (ASCII 0x08) y lo necesitamos debido a[
que lo completamos.Por ahora, hemos traducido la entrada al código vim, y solo necesitamos ejecutarla. Así que nosotros:
fuente
<C-r>
documentado?:h mode_keystroke
. En este caso, sería:h i_ctrl-r
/g
bandera. Agregaré esos detalles.0ii<esc>D@"
?CJam , 33 bytes
Pruébalo en línea!
Explicación
Los
1>3b
mapas de "función hash"[B]
a 291 (= 1 mod 5),[D]
a 297 (= 2 mod 5),[P]
a 333 (= 3 mod 5),[C]
a 294 (= 4 mod 5).Este valor (mod 5) se utiliza como índice en una lista de fragmentos de código CJam:
h
,"h"
se devuelve el fragmento , que empuja una cadena de un solo carácter a la pila.[B]
,;
se devuelve el fragmento , que muestra un elemento.[D]
,];
se devuelve el fragmento , lo que borra la pila.[P]
,L~
se devuelve el fragmento , que agrega variableL
a la pila.[C]
,]:L~
se devuelve el fragmento , que almacena la pila actual en la variableL
.Estos fragmentos se concatenan y ejecutan; CJam imprime implícitamente la pila final.
L
es inicialmente la lista vacía, por lo que el búfer de copia está inicialmente "vacío".fuente
Python 2,
969593 bytesfuente
or"E"
a la definición dex
para guardar un espacio?x
no vale la pena. Elx=="C"
solo puede sero=="[C]"
.Jalea ,
50 5148 bytesTryItOnline
o todos los casos de prueba
¿Cómo?
Por ejemplo
- con mayúscula
'B'
como caso de prueba, ya que antes de arreglar un error, habría regresado"I likeees!"
fuente
['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!']
.JavaScript (ES6),
84807776 bytesGuardado 3 bytes gracias a @Neil, 1 más gracias a @ edc65
.map
es dos bytes más largo:Fragmento de prueba
Mostrar fragmento de código
fuente
reduce
versión utilizando(s,[c,z])
..map
versión.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 menos. Curiosamente indefinido <cualquier char es falsox=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")
salva un personaje más. Si z es verdadero, pegue, de lo contrario agregue char a la salida.z?s+t:s+c
que es 1 byte más ques+=z?t:c
Perl,
5350 bytesIncluye +1 para
-p
Proporcione información sobre STDIN terminada por líneas nuevas (la última línea nueva puede omitirse, por lo que cuenta como una cadena separada por líneas nuevas):
da
keystrokes.pl
:Casi capté la respuesta de Jelly pero el demonio escapó a 48 bytes ...
fuente
Python
120 119116 bytesIdeona
Una función recursiva con entrada,
s
una lista de las pulsaciones de teclas.Cada llamada recursiva actualiza el texto de retorno
r
y, en el caso de a[C]
, el portapapeles,c
hasta ques
esté vacío.Los nuevos valores de
r
yc
son encontrados por la indexación en un diccionario,{...}
y pasaron con el desembalaje,*
. Para las pulsaciones de teclas pasivas,s[0][1:2]
se devolverá una cadena vacía y''
se utilizará la tecla en su lugar.fuente
lambda s,r='',c=''
lugar delambda s,r,c=''
?s
) por lo que la función necesita funcionar sin otra entrada.Haskell,
136133 130127bytesPruébalo en Ideone.
Explicación:
k
realiza una recursión de cola sobre una lista de comandos.b
es el búfer en el que se construye la cadena,c
guarda la parte copiada.Editar: para guardar algunos bytes, los comandos
[B][C][D][P]
ya no coinciden exactamente, sino que se comparan: ¿menos que'C'
? ->B
y así sucesivamente. Gracias a @nimi por guardar 3 bytes.fuente
init b
lanza una excepción sib
es la lista vacía.Mathematica, 100 bytes
Función anónima. Toma una lista de cadenas como entrada y devuelve una cadena como salida. Ignora cualquier mensaje generado.
fuente
Java 7,
207203 bytesEsto definitivamente se puede jugar un poco más,
pero esta es mi respuesta inicial. Se editará después de encontrar algo para eliminar esasreemplazado porequals
verificaciones ...charAt
, pero probablemente todavía se puede jugar golf ...Ungolfed y código de prueba:
Pruébalo aquí.
Salida:
fuente
PHP, 131 bytes
17 bytes guardados por el operador ternario @IsmaelMiguel
fuente
<?$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);
. (reemplazó toda suif()
cadena con una cadena de operaciones torrenciales).PHP, 108 bytes
Utiliza un enfoque basado en cadenas en lugar de uno basado en una matriz.
Usar como:
edit: ahorró 8 bytes al modificar el orden de los?: sy hacerlos negativos para evitar tener que usar tantos corchetes;
fuente
$s=$argv[++$i]
en lugar denull!==$s=$argv[++$i]
usar PHP> 7, podría escribir$s=$argv[++$i]??0
para omitir el aviso'0'
ya que'0'
es falso. Hay tantos otros avisos que omitir ese en particular parece una pérdida de tiempo.SpecBAS - 216 bytes
La entrada se da como una cadena con comas, que luego se convierte en una matriz.
fuente
V , 49 bytes
Pruébalo en línea!
Como esto contiene caracteres no imprimibles, aquí hay un hexdump:
Esta es solo una traducción directa de mi respuesta vim para poder competir con Jelly. Desafortunadamente, todavía estoy un byte terminado, pero todavía estoy trabajando en el último. :)
De todos modos, estoy más orgulloso de esa respuesta, así que si quieres una explicación muy detallada, lee esa en su lugar.
fuente
En realidad, 56 bytes
Pruébalo en línea!
Explicación:
fuente
Java, 181
Versión más legible:
fuente
if(s.length()>1){...}else
p==1
ap<2
MATL , 46 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
TCL, 186 bytes
Bien formateado:
Solo quería demostrar que podía hacer esto en TCL
fuente
foreach
porlmap
;return
porset x
. Esto es lo que puedo decir de un vistazo rápido.Scala, 158 bytes
Sin golf:
Resuelve este problema como un pliegue con el resultado y el portapapeles como acumulador. Lamentablemente, scala no tiene un operador condicional ternario, sino que lo usa
if else
como una expresión.fuente
PHP 7.1,
9592 bytesNota: requiere PHP 7.1 para las compensaciones de cadena negativas.
Sin compensaciones de cadena negativas (101 bytes):
Corre así:
Explicación
Ajustes
fuente