El formato PBM (Portable BitMap) es un formato de mapa de bits ASCII en blanco y negro muy simple.
Aquí hay un ejemplo para la letra 'J' (copiado y pegado del enlace de wikipedia):
P1 # Este es un mapa de bits de ejemplo de la letra "J" 6 10 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
¡Es hora de construir una pequeña herramienta para generar archivos en este pequeño e ingenioso formato!
Su objetivo es escribir el programa más corto (en cualquier idioma) que cumpla con las siguientes reglas:
- Su programa toma una cadena de stdin (por ejemplo
CODEGOLF.STACKEXCHANGE.COM!
) - Genera un archivo PBM con una representación de mapa de bits (legible) de la cadena.
- Cada personaje se construye como una cuadrícula de 8x8.
- Debe admitir los caracteres [AZ] (todo en mayúsculas), espacio, un punto ('.') Y un signo de exclamación ('!').
- ¡No se permiten bibliotecas externas (ciertamente no hay bibliotecas relacionadas con PBM)!
- El conjunto de caracteres utilizado no debe ser simplemente externo a su programa. Parte del desafío es almacenar los personajes de manera eficiente ...
Las pruebas de validez del formato PBM se pueden hacer con el GIMP (u otros). ¡Muestra muestras de entrada y salida!
La solución más corta recibirá los puntos de respuesta el 31/01/2012.
Diviértete jugando al golf!
PD: He agregado una recompensa (en términos de porcentaje, una gran parte de mi reputación de codegolf) para (con suerte) atraer a más competidores.
code-golf
string
graphical-output
ChristopheD
fuente
fuente
letters
en otras palabras). No muy diferente del ejemplo vinculado a.Respuestas:
GolfScript, 133 bytes
Esto se basa en mi solución Perl de 164 bytes y utiliza la misma fuente de 4 por 5 píxeles llena de nibbles. Nuevamente, primero daré la versión legible:
Aquí
FONT DATA HERE
representa 71 bytes de datos de fuente empaquetados binarios. La codificación es ligeramente diferente que en la versión de Perl: en lugar de dividir la cadena empaquetada en el espacio en blanco, primero la expando y luego la divido en el mordisco3
(elegido porque simplemente no ocurre en ninguna parte de la fuente).Dado que los datos de la fuente en el script real contienen caracteres no imprimibles, lo doy como un volcado hexadecimal a continuación. Use
xxd -r
para volver a convertir el volcado hexadecimal en código ejecutable de GolfScript:A diferencia de la secuencia de comandos Perl, este código imprime los caracteres fuera del conjunto
A
-Z
,!
,.
,space
como pequeños garabatos de aspecto gracioso. Reemplazar los garabatos con espacios en blanco costaría 2 caracteres adicionales; eliminarlos por completo costaría 4.Este es mi primer programa GolfScript, por lo que no me sorprendería si queda algo de espacio para la optimización. Así es como funciona:
{91,65>"!. "+?}%:s
asigna los caracteres de entrada válidos (A
-Z
,!
,.
,space
) a los números 0 - 28 y asigna el resultado as
. Cualquier carácter fuera del conjunto válido se asigna a -1, que es lo que produce los garabatos cuando se imprime."P4"\,8*8
empuja los valores "P4", 8 veces la longitud de la entrada y 8 en la pila. Cuando se imprime al final, estos formarán el encabezado PBM.{16base}%[3]/
toma la cadena de datos de fuente anterior, divide cada byte en dos nibbles y divide el resultado en bloques delimitados por el valor3
.{:p;{[p=0]0=}s%}%
luego recorre estos bloques, primero asigna cada bloque a la variablep
y luego recorre la cadena de entrada reasignadas
, reemplazando cada carácter con el valor en el desplazamiento correspondiente enp
. La construcción de aspecto divertido[p=0]0=
hace lo mismo quep=
, excepto que devuelve 0 para cualquier compensación más allá del final dep
; Realmente no me gusta, pero no he podido encontrar una forma más corta de manejar eso.Finalmente,
]n*
toma todo en la pila (los tres valores de encabezado y la matriz de datos de imagen) y los une con nuevas líneas para imprimir.fuente
Perl, 164 bytes, sin compresión zlib / gzip
Después de dormir sobre el problema, logré encontrar una solución mucho más corta que la primera. El truco consiste en aprovechar una laguna menor en las reglas: los personajes deben caber en 8 por 8 píxeles cada uno, pero nada dice que tengan que llenar todo ese espacio. Así que dibujé mi propia fuente de 4 por 5 píxeles, lo que me permitió empaquetar dos caracteres en 5 bytes.
El resultado se ve así:
(escalado x 4)
(tamaño original)
Antes de dar el código real con los datos de fuente incrustados, permítanme mostrar una versión de golf:
En el código real,
PACKED FONT DATA
se reemplaza por una cadena binaria que consta de ocho filas delimitadas por espacios en blanco (cuatro filas de 14 bytes y una de 13 bytes, más tres bytes nulos individuales para las filas en blanco). Diseñé deliberadamente mi fuente para que los datos empaquetados no contengan espacios en blanco, comillas simples o barras inclinadas invertidas, para que puedan codificarseqw'...'
.Como la cadena de fuente empaquetada contiene caracteres no imprimibles, proporcioné el script real como un volcado hexadecimal. Use
xxd -r
para volverlo a convertir en código ejecutable de Perl:Así es como funciona:
La primera línea (en la versión de golf) lee una sola línea de entrada, la divide en una serie de caracteres (omitiendo convenientemente las nuevas líneas finales) y asigna las letras
A
aZ
los caracteres!
y.
a los códigos de caracteres 0 a 28, que normalmente corresponden a caracteres de control no imprimibles en ASCII / Unicode. (Un efecto secundario menor de esto es que las pestañas en la entrada se imprimen comoJ
s.) El carácter de espacio se deja sin asignar, ya que el bucle de salida convierte cualquier código superior a 28 en espacios en blanco de todos modos.La segunda línea solo imprime el encabezado PBM. Utiliza la función Perl 5.10
say
, por lo que debe ejecutar este scriptperl -M5.010
para que funcione.El bucle de salida toma una lista delimitada por espacios en blanco de filas de imágenes empaquetadas y asigna cada una de ellas a
$p
su vez. (Diseñé la fuente para que los datos empaquetados no contuvieran ningún espacio en blanco o'
caracteres). Luego, recorre los caracteres de entrada@a
, usando elvec
comando de Perl para extraer el mordisco de 4 bits correspondiente al código de caracteres mapeado de la fila de la imagen, lo agrega a un byte de 8 bits y lo imprime.Antigua respuesta, 268 bytes:
Este es un primer intento rápido y sucio. Robé la fuente de PleaseStand y la comprimí junto con mi código fuente. Como la secuencia de comandos resultante no se puede imprimir, aquí hay un hexdump; use
xxd -r
para convertirlo en código ejecutable de Perl:El código Perl descomprimido consta del siguiente preámbulo:
seguido de ocho repeticiones del siguiente código:
con
BITMAP DATA HERE
reemplazado por 29 bytes que codifican una fila de la fuente.fuente
Código de máquina 8086
190 bytes (122 bytes que usan BIOS)
Aquí está el archivo .COM codificado Base64 WinXP / MSDos:
(Use algo como esto ) para decodificar el texto y guardar como "pbm.com". Luego, en el símbolo del sistema, escriba:
He probado esto en mi máquina WinXP usando el símbolo del sistema estándar y DosBox V0.74.
ACTUALIZAR
Esta versión es de 190 bytes y utiliza la pequeña fuente de Ilmari Karonen (¡aquí no hay acceso a la BIOS!):
fuente
puts
en Ruby hay una biblioteca externa. Sí, utiliza las fuentes de BIOS, a las que se accede a través de una desreferencia de puntero (no hay ningunaload
operación para obtener las fuentes en la RAM). Doblar las reglas demasiado lejos tal vez. Me habría salido con la suya si no hubiera sido por esos niños molestos ;-)Script de shell (código + datos = 295 caracteres)
Espero que tail, gzip y dd no cuenten como "bibliotecas externas". Corre como
echo -n 'YOUR TEXT HERE' | ./text.sh > out.pbm
. La fuente que usé es Small Fonts tamaño 7.5, aunque tuve que recortar el descendiente de la Q.Salida de ejemplo
Código (137 caracteres)
Guión completo
(se usa
xxd -r
para recrear el archivo original)Explicación
od
es el programa de utilidad estándar "volcado octal". La-tu1
opción le dice que produzca un volcado decimal de bytes individuales en su lugar (una solución suficiente para la falta de asc de bash (), ord (), .charCodeAt (), etc.)P4
es el número mágico para un archivo PBM de formato binario, que incluye ocho píxeles en cada byte (en comparaciónP1
con el archivo PBM de formato ASCII). Verá cómo esto resulta útil.dd
. (tail -2 $0
extrae las dos últimas líneas del script; los datos comprimidos incluyen un byte de salto de línea 0x0a). Ocurre que ocho píxeles es el ancho de un solo carácter. Los bytes nulos que llenan los espacios entre los caracteres admitidos son fácilmente comprimibles porque son todos iguales.wc -c
imprime el nombre de archivo de entrada "8" después de su recuento de bytes.fuente
Python 2,
248247 bytesUtiliza una fuente 3x5, empaquetada en una cadena imprimible, 3 bytes por carácter. La fuente es claramente legible, aunque la n es minúscula y la v podría confundirse con au si no se ve en contexto.
Tamaño real:
Zoom x3:
La salida es un PBM tipo P1, según el ejemplo en el desafío. Fue un reto divertido.
fuente
Ruby 1.9, 346 bytes (código 122 + datos de 224 bytes)
Aquí está el resultado:
(Está bien, ¿no?)
La fuente fue generada por
figlet -f banner -w 1000 $LETTERS
y este script .Corre con
echo -n 'CODEGOLF.STACKEXCHANGE.COM!' | ruby script.rb > image.pbm
.El script genera todas las filas y simplemente las imprime.
Aquí hay un hexdump (uso
xxd -r
):Se necesitan 93 bytes de código cuando se usa goruby:
Usando ZLib, recorte el tamaño de los datos a 142 bytes en lugar de 224, pero agrega 43 bytes en el código, por lo que 307 bytes:
Lo que da un total de 268 cuando se usa goruby:
fuente
Java
862826:Aquí hay un enfoque diferente. Creo que 'awt' no cuenta como lib externo.
Y sin golfos:
Robot es la forma algo curiosa de Java para llamar a getPixel. Creo una etiqueta con el alfabeto y mido dónde está un píxel para cada letra.
En el método de pintura,
int py = (y < 3) ? y : y +1;
y(8*a+x+17+x/4, py+81)
es la forma complicada, ajustar la posición en la fuente. Huuuh! de lo contrario, necesitaría 9 líneas, y cada cuarta letra, hay un píxel adicional horizontalmente. La prueba y el error me llevaron a esta solución.Luego se escribe el encabezado del PBM y cada línea del mensaje. El mensaje se pasa como título del marco.
Eso es. No es el código más corto, pero no fue necesaria la pintura manual de fuentes.
Tal vez podría ser más corto en BeanShell o Scala.
Y ahora, ¿cómo se ve?
Múltiples zooms aplicados:
Sin zoom:
No es que el número de caracteres sea el número de caracteres de la solución Perl barajada.
(Golf un poco más. Hecho Robot estático, que evita una declaración de excepción).
fuente
eog
(Eye of Gnome) y una captura de pantalla. Cargaré unajpg
versión sin escala; tal vez su navegador utiliza una interpolación vecina más cercana :).C ++ DEMASIADO GRANDE PARA GANAR
Escribí un programa de dibujo PPM con todas las funciones en C ++, con mi propia fuente de mapa de bits. Incluso eliminar todas las funciones no necesarias sigue siendo enorme en comparación con las respuestas aquí debido a la definición de la fuente.
De todos modos, aquí está la salida de HELLO WORLD:
Y el codigo:
ppmdraw.h
ppmdraw.cpp
main.cpp
Makefile
Si está interesado, la biblioteca completa PPMDraw está aquí :
fuente
SmileBASIC, 231 bytes
Cada personaje contiene solo 2 patrones de fila diferentes, elegidos de una "paleta" de 8 combinaciones. Los datos para cada símbolo se almacenan en 1 byte, con la paleta almacenada por separado.
fuente