RLE Brainfuck
(relacionada con BF-RLE )
El hipotético dialecto RLE ( Run-Length Encoding ) de Brainfuck acepta los símbolos para los 8 comandos y también acepta dígitos. Los dígitos se utilizan para representar el número de repeticiones sucesivas de un comando, lo que permite la codificación de longitud de ejecución del código fuente.
8>
es igual a >>>>>>>>
.
La longitud siempre está en el lado izquierdo del comando.
Su tarea es escribir el programa / función más corto que traduzca la cadena de entrada (fragmento RLE Brainfuck) en un programa Brainfuck normal.
Por ejemplo:
Entrada:
10+[>+>3+>7+>10+4<-]3>2+.>+.7+2.3+.2<2+.>15+.>.3+.6-.8-.2<+.<.
Ouptut:
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++++.>.+++.------.--------.<<+.<.
Ganará el código más corto en recuento de bytes en cada idioma.
Respuestas:
Python 2 ,
6261 bytesPruébalo en línea!
La sustitución de expresiones regulares se expande
3<2+-
en la cadena:que luego se
eval
ed. (Observe cómo cuando\1
está vacío, obtenemos1**1 = 1
). El primero+
es un operador unario que se une al primer número, y los otros+
s son concatenación de cadenas. Esto supera a lo más obviopor 14 bytes. Por lo general
"\2"
no lo haría siempre trabajo, pero por suerte\
y"
no son comandos brainfuck.xnor guardó un byte, proporcionando el
1*\1*1
truco. Anteriormente tenía\1L
en la expresión regular, y se defineL=1
como un argumento lambda, que también es bastante bueno:3L
es un largo int literal yL
es una variable.fuente
L
manejar la cadena vacía. Sin embargo, hay un camino más cortor'+1*\1*1*"\2"'
.import re
debajo de la lambda?f=\
en el encabezado, ¡ahora el lambda tiene un nombre!)Pyth , 2 bytes
Pruébalo aquí!
Cómo funciona
fuente
Lua,
656463 BytesExcelente ! ¡Por una vez, Lua vence a Python!Editar: guardado un byte gracias a @Jarhmander, gracias a él por el truco útil para forzar un solo resultado
Pruébalo en línea!
Explicaciones
fuente
,""
y encerrando entre paréntesis todo el argumento de impresión. Las expresiones entre paréntesis se ajustan a un valor en Lua (ver lua.org/manual/5.3/manual.html#3.4 ).Scala ,
7369 bytesPruébalo en línea!
fuente
Perl 5 , 18 bytes
Código de 17 bytes + 1 para
-p
.Pruébalo en línea!
fuente
vim,
2925232216 bytes<C-V>
es 0x16,<ESC>
es 0x1b.Funciona reemplazando cada no dígito con un comando que agrega ese carácter al búfer. Los recuentos se dejan solos y modifican esos comandos. En este punto, el búfer es un programa vimscript que produce el programa Brainfuck deseado, por lo que lo colocamos en un registro y lo ejecutamos.
Pruébalo en línea!
Editar: Reducciones de tamaño gracias a sugerencias: H.PWiz: 5, TheFamilyFroot: 5, DJMcMayhem: 1
fuente
&
o\0
) en su lugar sin paréntesis. Además, un consejo de mí, no TheFamilyFroot es que se puede utilizarD
en lugar dedd
por-1
byte.RLE Brainfuck, 204 bytes
Según tengo entendido, las especificaciones para el entorno de brainfuck no están súper bien definidas. Este programa asume que las celdas en la cinta permiten enteros positivos y negativos arbitrariamente grandes, sin desbordamiento. Este código también transcribirá comentarios que no sean de comando, pero expandirá la codificación de la longitud de ejecución de los comentarios (por ejemplo, "ver 3b" → "ver bbb"). El programa resultante debería ejecutarse igual, así que no estoy demasiado preocupado.
Estoy bastante seguro de que todavía podría jugar unos pocos bytes de esto, pero estoy cansado de trabajar con él.
Aquí está el intérprete personalizado + pruebas que he estado usando para probarlo. Si pasa la entrada en el cuadro Entrada estándar, debería ejecutarse contra esa entrada en lugar de ejecutar las pruebas.
Mi área de trabajo desordenada y sin golf:
fuente
10+
? El OP aclaró en un comentario que el recuento siempre será mayor que 0, por lo que es posible que pueda recortar algunos bytes si es el primero.while max
bucle siempre se ejecuta al menos una vez, y estoy subiendo incondicionalmente el búfer donde almaceno el valor del dígito en ese bucle, necesito iniciar ese búfer en -1. Me pregunto si podría guardar algunos bytes al dejar ese búfer lógicamente envalue+1
atApilado , 24 bytes
Pruébalo en línea!
Explicación
fuente
TeX, 124 bytes
(escribió en dos líneas para ser visible, pero el código se puede escribir en una línea)
Esto define una macro
\b
que toma la entrada en el formulario\b<input>;
e imprime la salida deseada para el documento.fuente
Retina ,
2823 bytesgracias a @Leo por -5 bytes
Pruébalo en línea!
fuente
\b
en la segunda expresión regular para que solo coincida con una1
por ejecución de1
s?Pyon , 66 bytes
Pruébalo en línea!
Pyon es más o menos Python, pero es más corto porque
re
se importa automáticamente cuando lo usa, ya
se establece automáticamente en un argumento o la entrada-4 bytes gracias al Sr. Xcoder
fuente
g[0]
ag[:-1]
(falla para el caso de prueba dado o cualquier número superior a 9).lambda
que realmente desperdicia bytes? Golfed y corregido por 66 bytesPitón 2 ,
1009389 bytes-7 con agradecimiento a Mr.Xcoder
Pruébalo en línea!
fuente
Haskell , 60 bytes
Pruébalo en línea!
fuente
R ,
12110690 bytesPruébalo en línea!
Se guardaron 15 bytes al darse cuenta de que
rep()
se convertirá en numérico. Ahorré otros 16 gracias a Giuseppe, principalmente por el uso depmax
reemplazar cadenas vacías con1
fuente
ifelse(x>"",x,1)
es un byte más corto, y\\D
es equivalente[^\\d]
y lo mejor de todo, no es necesarioperl=T
, por lo que este es un dulce 99 bytes . ¡Realmente no pensé que esto podría ser menos de 100 bytes!pmax
pmax
dar una gran mejora agradable - ¡gracias!"1"
con1
lopmax
que obligará acharacter
la comparación.PowerShell ,
6662 bytesPruébalo en línea!
Descompostura
¡Que desastre!
A partir de
$args
, que es una matriz de un solo elemento que contiene la cadena RLE, estoy forzando una cadena real envolviéndola entre comillas.Luego divídalo por límite de palabra (
\b
en expresiones regulares). Eso me dará una serie de cadenas, donde cada elemento es un número o los tokens BF que vienen después del número. Entonces, en el ejemplo, los primeros 4 elementos de esta matriz dividida son10
,+]>+>
,3
,+>
(todos son cadena).Luego, canalizo eso en
ForEach-Object
(%
) para tratar con cada elemento .El centro es un conocido golfismo de PowerShell, con un giro; Es esencialmente un operador ternario de bricolaje, en el que crea una matriz de 2 elementos y luego lo indexa utilizando la expresión booleana que desea probar, por lo que un resultado falso le da el elemento 0 y un resultado verdadero le da el elemento 1.
En este caso, en realidad creo una matriz de un solo elemento con la coma unaria
,
, porque no quiero salida en el caso verdadero.Primero echemos un vistazo al indexador, aunque se ejecute más tarde.
La idea de esto es que
$_
(el elemento actual) podría ser un número válido o alguna otra cadena. Si es un número, quiero$n
ser el valor de ese número menos 1 (como un número, no una cadena). Si no es así, quiero$n
ser falso.PowerShell generalmente intenta forzar el valor de la mano derecha al tipo del lado izquierdo, pero puede depender de la operación. Además,
"10"+5
le daría una nueva cadena"105"
, mientras que10+"5"
le dará un entero (15
).Pero las cadenas no se pueden restar, por lo que PowerShell puede inferir el valor numérico automáticamente con una cadena en el lado izquierdo de la resta, por lo tanto
"10"-5
da5
.Entonces, empiezo con
$_-1
, lo que me dará el número que quiero cuando en$_
realidad es un número, pero cuando no lo es, no obtengo nada. En la superficie, "nada" es falsey, pero el problema es que detiene la ejecución de esa tarea, así que$n
lo que conservará su valor anterior; no es lo que quiero!Si lo envuelvo en una subexpresión, cuando falla, obtengo mi valor falsey:
$($_-1)
.Todo eso se asigna
$n
y dado que esa asignación está envuelta entre paréntesis, el valor que se asignó a$n
también se pasa a la canalización.Como lo estoy usando en el indexador y quiero que,
1
si la conversión se realizó correctamente, utilizo dosnot
expresiones booleanas!!
para convertir este valor en booleano. Una conversión de números exitosa termina siendo cierta, mientras que la nada falsa nos da ese dulce, dulce0
que permite devolver el único elemento en ese falso conjunto ternario.Volviendo a esa matriz, el elemento es este:
$("$($_[0])"*$n*$_)
$(,$_[0]*$n+$_)
"$($_[0])"
- esta es una forma molestamente larga de obtener el primer carácter del elemento actual (digamos, obteniendo+
de+[>+
), pero como una cadena y no como un[char]
objeto. Necesito que sea una cadena porque puedo multiplicar una cadena por un número para duplicarla, pero no puedo hacerlo con un carácter.En realidad, logré guardar 4 caracteres usando una
[char]
matriz en lugar de una cadena (usando otra coma unitaria,
), por lo que pude eliminar las comillas y la subexpresión adicional. I puedo multiplicar una matriz para duplicar sus elementos. Y dado que el resultado completo de esta iteración termina siendo una matriz de todos modos y debe ser-join
editado, el uso de una matriz aquí no conlleva ningún costo adicional.Luego, multiplico esa matriz de
cadenaspor$n
, para duplicarla$n
veces. Recuerde que$n
podría ser$null
o podría ser el valor de los dígitos anteriores menos uno.Luego
+$_
agrega el elemento actual al final del primer carácter duplicado de ese elemento. Por eso$n
es menos uno.De esta manera,
10+[>+
termina$n
igual a 9, luego hacemos 9+
y agregamos eso de nuevo a la+[>+
cadena para obtener el 10 requerido, más los otros elementos individuales a lo largo del recorrido.El elemento está envuelto en una subexpresión
$()
porque cuando$n
es así$null
, la expresión completa falla, por lo que la creación de la matriz falla, por lo que el indexador nunca se ejecuta, por lo que$n
nunca se asigna.La razón por la que este truco utilizado ternario es debido a una de sus peculiaridades: a diferencia de un operador ternario reales, las expresiones que definen los elementos no se evalúan si son o no son "seleccionados", y la primera para el caso.
Como necesito asignar y luego usar
$n
en iteraciones separadas, esto es útil. El valor del elemento de matriz ternario se evalúa con el$n
valor de la iteración anterior , luego el indexador vuelve a asignar$n
para la iteración actual.Entonces, los
ForEach-Object
bucles terminan generando todo lo que se supone que debe hacer (un montón de errores que ignoramos), pero como una serie de nuevas cadenas.De modo que todo está entre paréntesis y luego precedido por unario
-join
para dar la cadena de salida.fuente
QuadR , 17 bytes
Pruébalo en línea!
Gracias a Adám por proporcionar la versión correcta del código.
Cómo funciona:
fuente
'\d+.'⎕R{¯1((⍎↓)⍴↑)⍵.Match}
Protón , 50 bytes
Pruébalo en línea!
fuente
Java 8, 148 bytes
Malditasexpresiones regulares de Java son tan inútiles a veces ... La última vez fue lafalta de usar el grupo de captura"$1"
para algo, ahora esto ... Quiero reemplazar3c
conccc
o000c
conccc
una sola línea, pero desafortunadamente Java no tiene forma de hacerlo sin un lazo. Ah bueno.Explicación:
Pruébalo aquí.
fuente
Haskell , 84 bytes
Pruébalo en línea!
Explicación:
span(`elem`['0'..'9'])s
divide la cadena dadas
en un prefijo de dígitos y el resto. La coincidencia en el resultado del patrón(n:m,x:r)
garantiza que el prefijo de dígitos no esté vacío y une el carácter después de los dígitosx
y el resto ar
.x<$[1..read$n:m]
lee la cadena de dígitosn:m
como número y la repitex
muchas veces. El resultado se concatena con el tratamiento recursivo de la cadena restanter
.fuente
R , 151 bytes
Superado por el usuario 2390246 ! Esto es básicamente un enfoque basura en comparación con ese, pero continuaré mejorando.
Pruébalo en línea!
También genera un montón de advertencias.
A continuación, ver si usar un
grep
es más eficiente quesubstr
fuente
JavaScript (ES6), 46 bytes
Explicación bastante directa:
fuente
Ruby , 35 bytes
Pruébalo en línea!
fuente
Cálculo Lambda sin tipo , 452 bytes
La entrada y la salida comprenden listas plegadas a la derecha de códigos de caracteres codificados por la iglesia , por ejemplo, el código de caracteres de una nueva línea es 10, por lo que la codificación de la iglesia sería
λf.λx.f(f(f(f(f(f(f(f(f(f x)))))))))
. La conversión de "ABCD" a una lista pareceλf.λx.f 65 (f 66 (f 67 (f 68 x)))
pero con los números codificados por la iglesia.Aplicar una cadena codificada al programa y reducirla por completo debería proporcionarle una cadena de salida codificada con el RLE aplicado.
fuente
qλq
notación? Nunca he visto eso antes.Funky , 42 bytes
Pruébalo en línea!
fuente
C ++,
239235 bytes-4 bytes gracias a Zacharý
fuente
g=(g?g:1)
ag+=!g
? Si eso no funciona, ¿no puedes quitar los paréntesisg?g:1
Dart, 78 bytes (con expresiones regulares), 102 bytes (sin expresiones regulares)
Con Regex:
Sin expresión regular:
Ambos deben ser invocados como
(<code here>)("input string")
.Regex one es bastante estándar, pero el regex-less es bastante especial.
Regex-less abusa de los parámetros opcionales para asignar variables locales en la función de "retorno único", de lo contrario, necesitaría hacer un bloque y tener la palabra clave return. Para cada unidad de código, si la unidad de código está entre 0 y 9, se acumula
n
y se devuelve una cadena vacía. De lo contrario, el carácter se multiplica por el valor den
(caso especial si n == 0, en ese caso siempre emitirá 1 carácter) yn
se establece en 0.(n=0*(c=n))+c
establece el argumento del código char en el valor den
, multiplican
/c
con 0 , almacena 0 enn
, luego agregac
. Esto restablece nuestron
sin estar en un contexto de declaración.fuente
Python3, 96 bytes
Intenté otra implementación en Python, pero no supero /codegolf//a/146923/56846 :(
fuente