En cualquier lenguaje de programación o scripting x , escriba un programa que tome un código fuente válido de brainfuck de stdin y envíe, a stdout, el código fuente de un programa, escrito en lenguaje x , que generaría exactamente lo mismo que haría el programa brainfuck.
Su programa debe funcionar para cualquier programa válido de brainfuck, incluido el archivo vacío.
Su puntaje sería igual al recuento de bytes de su código fuente, más el recuento de bytes de su salida dada la siguiente entrada:
+++++ [-]
+++++ +++++ [
> +++++ ++
> ++ +++ ++++ +
> +++
<<< -
]
> ++ . H
> + . e
++ +++ ++. l
. l
+++ . o
> ++ . space
< +++++ +++ . w
----- --- . o
+++ . r
---- - - . l
----- --- . d
> + . exclamation mark
------lol; useless code :-)--------------------------[.............................................][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]<-<<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><
Por ejemplo, para una entrada de [-]
, la salida de *p=0;
es mucho más favorable quewhile(*p) *p--;
Si utiliza caracteres no ASCII, el recuento de bytes debe calcularse utilizando la codificación UTF-8.
La puntuación más baja gana. Sin embargo, las soluciones creativas que intentan minimizar el resultado serán alentadas por los votos positivos.
byte count of source + (byte count of output)^2
, ¿eso animaría a las personas a centrarse más en simplificar el resultado?Respuestas:
Perl - 177 (fuente) + 172 (salida) = 349
Contando el shebang como 2 bytes, uno para cada opción. Primero, cada uno de los ocho comandos se traduce al rango
p-w
, mientras que al mismo tiempo elimina todos los demás caracteres. Esta cadena se codifica en longitud de ejecución y se emite con un decodificador / intérprete mínimo. Algunas cosas están optimizadas: la cadena><
obviamente no hace nada, y un bucle for que sigue directamente después de otro puede eliminarse por completo, ya que nunca se ingresará.Salida para el programa de prueba:
Una muestra de ejecución:
Perl - 232 (fuente) + 21 (salida) = 253
Este se basa en la observación de FIQ de que si el programa original no contiene una declaración de entrada, la salida será estática y, por lo tanto, puede reducirse a una sola
print
declaración. Si te gusta este, asegúrate de darle a su respuesta un +1.Entonces, lo que podemos hacer es canalizar
stdout
a una variable,eval
el código que obtendríamos, y envolver el resultado en aprint
.... aunque eso no siempre funcionará. Siempre que el código a traducir hubiera resultado en un bucle infinito, (por ejemplo
+[.]
), esto no se puede reducir a una solaprint
declaración, por razones obvias. Entonces, en su lugar, iniciamos eleval
proceso en un hijo con un breve tiempo de espera, y si no termina de ejecutarse dentro de ese tiempo, mostraremos el programa traducido como antes.Estructurado y comentado:
Salida para el programa de muestra:
Salida para
,[.]
:Salida para
+[.]
(después de 9 segundos):fuente
wv.*?(?=w)
esta mal. Creo que solo eliminará el código hasta el siguiente]
, pero lo necesita para encontrar la coincidencia]
; debes cuidar de anidar ...wv[^v]*(?=w)
, que es significativamente más corto que la alternativa.Brainfuck, 5 + 540 = 545 bytes
5 bytes de código, 540 de la salida del archivo de prueba dado (suponiendo que obtuve el recuento correcto de mi pegado de ese código).
Suponiendo que EOF es 0.
fuente
bfi
( github.com/susam/bfi ). Simplemente compílelo e instálelo, y ejecútelo así: ¿bfi input.bf
dóndeinput.bf
se interpretará el archivo brainfuck?PHP, 553 + 27 = 580 bytes
(553 bytes con todos los espacios en blanco, es decir, nuevas líneas y espacios, eliminados)
Soy muy malo en jugar golf en PHP, por lo que este enfoque puede optimizarse en gran medida. Sobre todo quería mostrar mi enfoque de la solución en algo que no sea BF.
El informe de errores debe estar desactivado, de lo contrario, PHP lo odiará. Uso: tire esto como una página y ejecútelo con script.php? C = CODE (si el script resultante requiere entrada, lo ejecuta como out.php? I = INPUT). Recuerde url escapar de la entrada!
Lo que esto hace es básicamente esto: si el script BF contiene ",", se incrusta prácticamente como el script resultante con un $ b = 1 adjunto; en la cima. Si NO contiene ",", lo optimiza a "echo '<BF output>'". Convenientemente, el script de prueba en el OP NO requiere ninguna entrada. El addlashes () está ahí para escapar 'y \.
fuente
C ++, 695 + 510 = 1205 bytes
Código:
Salida:
Código original:
fuente
Python - 514 + 352 = 866
Código:
Salida:
fuente
io
659 + 553 = 1212
Cosas como
File standardInput readBufferOfLength(1)
realmente matar el conteo de bytes, pero no puedo evitarlo. No hice optimizaciones para símbolos repetidos o falta de entrada en el programa BF, pero continuaré trabajando en ello, también trabajando en uno haciendo uso de las capacidades de metaprogramación de io.Pruebas
Rendimientos
fuente
Brainfuck , 109 + 407 = 516
Pruébalo en línea!
Solo elimina operaciones que no son BF y no mira otras optimizaciones.
fuente
Lua - 328 + 2256 = 2584
(Oh, me acabo de dar cuenta de que también necesitas agregar la longitud del resultado, puntaje pobre, parece)
Tomado de esta respuesta mía.
fuente
Lua - 319 + 21 = 340
Este es probablemente el código más corto de todos, pero no acepta entradas, por lo que es un poco engañoso. Tengo una idea para otra versión con entrada, vea el final de este comentario.
Lua - 376 + 366 = 742
Esta versión es para demostrar que Lua puede hacerlo mejor que 2584: D
Ambas versiones agregan 30000 bytes de datos. Mi segunda versión se basa en entrada / salida: todo después de un '.' o ',' será eliminado. Mi segunda versión no permite bucles infinitos ([.,], [], Etc.)
Mi idea es conseguir:
De su entrada, con un ', +' adicional.
fuente