Uno de los códigos más fáciles escritos por un lenguaje de programación es una secuencia de caracteres de impresión de programas (por ejemplo, "¡Hola, mundo!"). Sin embargo, s o m e e s o t e r i c lenguajes de programación como Brainfuck , incluso el código más simple es bastante molesto para escribir.
Su tarea es escribir un programa (no tiene que escribirlo en brainfuck), que imprime un programa Brainfuck (longitud mínima) que imprime el texto dado.
Entrada
Una secuencia de caracteres (entre 1
y 255
) viene dada por cualquier formato (variable, argumento, stdin, archivo, ...).
Salida
La salida es un código válido (sin coincidencias [
y ]
) brainfuck (suponga una celda de ajuste de 8 bits sin signo y un número ilimitado de celdas a izquierda y derecha) que imprime la cadena exacta que se proporcionó como entrada.
Por ejemplo, una salida posible para la entrada A
es ++++++++[<++++++++>-]<+.
.
Su programa no debería tardar mucho tiempo ( >2m
) en ejecutarse.
El programa BF no debería tardar mucho tiempo ( >10s
) en ejecutarse.
Tanteo
(Aviso: el método de puntuación actual puede cambiar, ya que no es fácil de calcular ...)
La longitud del programa (que genera el código BF) en sí misma no importa. Sin embargo, la codificación de códigos BF en el código del programa no está bien. Sólo rango aceptable (por ejemplo, un código de BF impresión de un solo carácter. 0x01
: +.
) De los códigos de BF podría ser modificable.
La puntuación es la suma de la longitud de los códigos BF que imprimen estas cadenas.
- Una cadena
Hello, world!
añadida con un solo0x0A
(\n
) (es decir, el programa "¡Hola, mundo!") - Solo personaje de
0x01
~0xFF
- La suma de la longitud de estos 255 códigos BF se multiplica por
1/16
, se redondea y se agrega a la puntuación.
- La suma de la longitud de estos 255 códigos BF se multiplica por
- Lista de primeros 16 cuerdas, generados por la división de una secuencia aleatoria de bytes generada en 11-11-11 por
0x00
, la eliminación de todas las cadenas de longitud cero. - Lenna.png , eliminando todos los
0x00
s. - La letra de la canción 99 botellas de cerveza , comenzando con
99 bottles~
líneas nuevas0x0A
, los párrafos están separados por dos0x0A
sy ningún carácter de línea nueva al final. - Otras cadenas que puede proporcionar.
Su programa puede incluir el cálculo de la puntuación de sí mismo.
Por supuesto, el código de puntaje más bajo será el ganador.
Lenna.png
va a dominar el puntaje, ya que es, con mucho, el mayor aporte. ¿Quizás normalizar un poco por tamaño?Respuestas:
En Java, calcula un fragmento BF corto que puede convertir cualquier número a cualquier otro número. Cada byte de salida se genera transformando el último byte de salida o un nuevo 0 en la cinta.
Los fragmentos se generan de tres maneras. Primero mediante simples repeticiones de
+
y-
(por ejemplo,++++
convierte 7 a 11), combinando fragmentos conocidos (por ejemplo, si A convierte de 5 a 50 y B convierte de 50 a 37, luego AB convierte de 5 a 37) y multiplicaciones simples (por ejemplo,[--->+++++<]
multiplica el número actual por 5/3). Las multiplicaciones simples aprovechan la envoltura para generar resultados inusuales (por ejemplo,--[------->++<]>
genera 36 a partir de 0, donde el ciclo se ejecuta 146 veces, con un total de 4 envolturas descendentes y 1 ascendente).Soy demasiado vago para calcular mi puntaje, pero utiliza aproximadamente 12.3 operaciones BF por byte
Lenna.png
.fuente
Bueno, aquí está la peor solución posible, aunque una muy bonita en Brainfuck:
El puntaje es probablemente el peor que podemos ver sin intencionalmente hacerlo malo.
Trabajando en el cálculo de la puntuación real.
fuente
+
's y a.
[-]
para limpiar la celda entre cada personaje.Python 3.x
Bueno, no voy a ganar ningún premio por el código de salida más corto, pero tal vez por el programa para generar el código ...
'¡Hola, mundo! \ N':
fuente
print("".join(["+"*ord(i)+".[-]"for i in input()]))
.[-]
con.>
No estoy seguro de lo bueno que es, pero me divertí escribiendo esto. (En Clojure ...)
Probablemente hay soluciones más eficientes y más elegantes, pero esto sigue mi patrón de pensamiento de forma algo lineal, por lo que fue más fácil.
fuente
Puntuación:
478748641439404086426 (sin datos generados aleatoriamente)(4085639 de eso son de Lenna.png. Eso es 99.98%)
No entiendo la parte con los datos aleatorios. ¿No necesito una cuenta que deba pagar para obtener los datos?
Bastante ingenuo. Aquí está el código generado para "1Aa" (49, 65, 97) con un poco de documentación:
El código de Java es un poco feo pero funciona. La instrucción generada por la relación de bytes de entrada es probablemente mejor cuanto mayor sea el valor promedio de bytes.
Si desea ejecutarlo, debe colocar Lenna.png en el mismo directorio que el archivo .class. Imprime el puntaje en la consola y escribe el código BF generado en un archivo llamado "output.txt".
Voy a hacer algunas pequeñas mejoras, pero probablemente no muchas.Hecho.fuente
BrainF ** k
Soy un programador de BF bastante malo, por lo que esta respuesta es probablemente bastante ineficiente. No estoy seguro de la puntuación, pero debería funcionar ligeramente mejor que la respuesta existente en su texto promedio. En lugar de poner a cero la celda después de cada carácter, este se "ajustará" a un nuevo carácter con resta si el carácter anterior dado es más grande.
(Tenga en cuenta que este es un código que escribí hace mucho tiempo y que he reutilizado para esta competencia. Sinceramente espero haber realizado la conversión correctamente, pero si falla alguna entrada, hágamelo saber).
Una versión que muestra el estado de la cinta en todo el código:
Código generado para
Hello, World!
:Esta es mi primera respuesta en CG.SE! Si he arruinado algo, ¡avísame!
fuente
> <>
Escribí esto en respuesta a una pregunta marcada para un duplicado, y aunque este no es el mejor golf (al menos para esta pregunta específica), pensé que sería un desperdicio si no lo compartía toda su asquerosamente galimatizante gloria. Realmente, estoy medio sorprendido de que incluso funcione. Tomaré cualquier sugerencia para jugar golf ya que ese era mi objetivo principal en su creación.
Como nota al margen, en la segunda línea los tres primeros caracteres
.21
podrían reemplazarse porv
seguidos de dos espacios si eso facilita la lectura. No me gusta ver espacios en mis programas> <> porque eso significa que hay espacio desperdiciado (literalmente). También es un remanente de uno de los muchos prototipos.La forma en que funciona es realmente simple y, francamente, me resultaría difícil pensar en una forma de implementar otro algoritmo. Imprime sin embargo, se deben imprimir muchos "+" para el primer carácter, y luego imprime más "+" o "-" según sea necesario para cada carácter adicional, separando cada sección con puntos. Lo que me parece genial del programa es que modifica su propio código fuente para que imprima "+" o "-" (reemplaza el "+" en la línea 3 con el carácter apropiado después de determinar si el carácter actual es mayor que o menos que el anterior).
Salida para
Hello, World!
:Podría puntuar esto de la forma en que estaba destinado a ser puntuado, pero estoy casi seguro de que perdería y no sé completamente cómo leer algo como lenna.png en> <>.
Si esta respuesta le interesa y desea una explicación, pregunte por todos los medios, pero por ahora la dejaré sin una solo por lo retorcida y excitante que es.
EDITAR 1: Ha pasado un tiempo, pero pude jugar golf 2 bytes con una revisión casi completa de la forma en que el programa decide si imprime un más o un menos. Es un retorno algo decepcionante para una gran revisión, pero al menos funciona.
fuente
mi solución de JavaScript es rápida y sucia :)
salida para
Hello World\n
Fuente:
fuente
Construí algo en Java. No calculé el puntaje. Los textos con 3 o menos caracteres están codificados con una multiplicación por letra, por ejemplo, "A" =
++++++++[>++++++++<-]>+.
. Los textos con más de 3 caracteres están codificados con una lista calculada que se divide en 3 áreas. La primera área es x veces 49, luego más x veces 7 y finalmente más x. Por ejemplo, "A" es 1 * 49 + 2 * 7 + 2La cadena proporcionada "### INSERT TEXT AQUÍ ###" se convierte
--->-->-->-->-->->->->->->->-->->->->->-->->->->->-->-->-->-->+[-[>+++++++<-]<+++]>---->++>++>++>+>>+>+>->+>++>+>++>->++>++>+>>->+>->+>++>++>++>+[-[>+++++++<-]<++++]>---->--->--->--->+>>-->+++>+++>++>--->+>--->+++>+>--->+>->+++>++>+++>+>--->--->--->+[-<++++]>[.>]
"¡Hola Mundo!" se convierte
--->->>>>>-->-->->>>>>-->+[-[>+++++++<-]<+++]>---->>--->-->-->-->+++>+>++>-->->-->--->+>+[-[>+++++++<-]<++++]>---->->>>>+++>->+>>+++>->>->++>+[-<++++]>[.>]
fuente
Python 3
Esta es esencialmente una versión ligeramente mejorada de la respuesta de icedvariables. (-1 Byte de Wheat Wizard, -5 de FatalError, -2 de jez)
fuente
:
. Esto probablemente también se podría hacer como una lista de comprensión para guardar bytes.print("".join(["+"*ord(i)+".[-]"for i in input()]))
join()
una expresión generadora en lugar de una comprensión de la lista:print("".join("+"*ord(i)+".[-]"for i in input()))
print("".join("+"*ord(i)+".>"for i in input()))
(esto también reduce la puntuación ya que pierde 2 bytes en la salida)