Ception de mensajería

13

Ception de mensajería

El programa debe aceptar cualquier cadena como entrada y generar una imagen de píxeles que muestre la cadena de entrada en Courier. Todas las letras que contienen un 'agujero' (como abdegopqABDPQRetc.) rodeado de píxeles negros también deben rellenarse de negro.

Entrada

El programa debe poder aceptar cualquier cadena ASCII como entrada. La entrada puede ser de la forma que desee, siempre que el código del programa en sí no tenga que cambiar para aceptar una entrada diferente. (Excepto, por ejemplo, el nombre de archivo del archivo que se va a leer). No hay lagunas estándar. Puede suponer que cada entrada contiene al menos una letra imprimible.

Salida

La salida debe ser un gráfico de píxeles en blanco y negro (sin gris) que muestre la cadena escrita en Courier (en negro, fondo blanco), con los 'agujeros' especificados rellenos. El tamaño de fuente de toda la cadena debe ser constante (eso significa que no hay una escala diferente para cada letra diferente) de modo que las letras de tamaño completo (por ejemplo, ABCDEFGHIJKLMNOPRSTUVWXYZpero j y Q son más grandes) deben tener al menos 10 píxeles de altura. (No tiene que escribirlo en un archivo, cualquier tipo de visualización está bien siempre que se genere como pixelgraphics, por ejemplo, lienzo en JavaScript). Publique este gráfico con su respuesta.

Se permite el acceso a las bibliotecas courier.ttf / font.

El programa también debe contar el número de píxeles negros y escribirlo en la consola o cualquier método de salida preferido al final.

Puntuación

La puntuación se evalúa de la siguiente manera: el código completo del programa debe usarse como cadena de entrada para su programa. El número de píxeles negros será su puntaje. El código del programa que contiene letras no imprimibles o no ASCII no está permitido. (Además de las lagunas estándar). Cuanto menor sea el puntaje, mejor.

falla
fuente
La salida se especifica como b / w, por lo que no se permiten píxeles grises. Y gracias por preguntar sobre la codificación, esto se limitará a ASCII debido a la fuente.
flawr
1
Hay al menos dos problemas graves que necesitan aclaración. En primer lugar, no está claro si el programa tiene acceso a Courier.ttf y a las bibliotecas de fuentes que pueden usarlo. En segundo lugar, ¿tiene la intención seria de prohibir los programas que no contienen caracteres que no sean ASCII?
Peter Taylor
Sí, el acceso a Courier.ttf y las bibliotecas de fuentes está permitido; de lo contrario, no tendría sentido, gracias. No pude encontrar ningún idioma principal que se base en caracteres que no sean ASCII. ¿Conoces algún idioma que necesite caracteres que no sean ASCII?
flawr
1
@flawr APL. Y en Mathematica podría acortar algunas cosas usando caracteres Unicode.
Martin Ender
¿Se permite ImageMagick ?
Trauma digital

Respuestas:

12

Mathematica, 4864 píxeles

l = ImageData[Binarize[Rasterize[Style[j, FontSize -> 15]], .71]]
i = {{1, 1}}
While[Length[i] > 1 - 1,
 {r, c} = j = i[[1]]; l[[r, c]] = 2; i = i[[2 ;; -1]];
 If[FreeQ[i, {r, c} = J = j + #] && l[[r, c]] == 1, 
    i = i~Join~{J}] & /@
  {{1, 1 - 1}, {1 - 1, 1}, {-1, 1 - 1}, {1 - 1, -1}}
 ]
Image[l = l /. 1 -> 1 - 1 /. 2 -> 1]
Count[l, 1 - 1, {2}]

Aquí está la foto:

ingrese la descripción de la imagen aquí

En Mathematica cuando escribes un "programa" simplemente escribes un fragmento. Entonces esto espera la entrada almacenada enj y lo último que devuelve es la imagen y el recuento. Esto también arroja un montón de errores, porque no reviso los límites l, pero de todos modos produce el resultado deseado.

donde se %refiere a dicho último resultado.

Gracias a Geobits por la idea del algoritmo. Estoy llenando la imagen desde la esquina superior izquierda con una intensidad no válida, luego reemplazo todos los píxeles blancos restantes con píxeles negros y los inválidos con píxeles blancos.

Tenga en cuenta que la FreeQverificación no es realmente necesaria para que el programa funcione correctamente, sino para que finalice en un período de tiempo razonable. Si lo dejara fuera, en realidad obtendría unos 300 píxeles menos.

Martin Ender
fuente
¡El conteo debe ser parte del programa mismo! Aparte de eso, es una buena solución, ¿calculó qué letras (como nombres de variables) usan la menor cantidad de píxeles?
flawr
@flawr sí :) (ahora para todos ellos) (arreglando el conteo en un segundo)
Martin Ender