Fondo
El arte ASCII es la práctica de crear imágenes usando texto ASCII para formar formas.
El alias es el efecto creado por los grandes "píxeles" del arte ASCII, que son del tamaño de los caracteres. La imagen se vuelve bloqueada y difícil de ver. El suavizado elimina este efecto al crear un degradado y al suavizar los bordes duros del arte ASCII.
El reto
Su desafío es escribir el programa más corto posible que tomará una pieza de arte ASCII y generará una versión que haya sido suavizada.
¿Qué tipo de anti-aliasing?
Todo el arte ASCII consistirá en dos tipos de símbolos: espacios y no espacios en blanco. Para cada carácter que no sea un espacio en blanco, su programa debe determinar si está en una posición en la que necesita ser suavizado. Si es así, debe reemplazarlo con el carácter correcto. Si no es así, el personaje permanece igual.
¿Cómo sabes si un personaje necesita ser suavizado? La respuesta depende de los caracteres que están inmediatamente arriba, abajo, a la izquierda y a la derecha del personaje ( no las diagonales ). Aquí hay una tabla de cuándo se requiere anti-aliasing, donde?
y x
puede representar cualquier carácter que no sea un espacio en blanco.
x? -> d?
? ?
?x -> ?b
? ?
? ?
?x -> ?F
? ?
x? -> Y?
x -> ; Note: This character has been changed from _ to ;
? ?
? ?
x -> V
?x -> ?>
x? -> <?
x -> @
Entrada (y ejemplo de arte ASCII pre-anti-aliasing)
Primero, habrá dos líneas de entrada (a STDIN), un número H seguido de un número W. Luego habrá líneas H de exactamente W caracteres cada una (excluyendo la nueva línea). Estas siguientes líneas serán el arte ASCII que necesita ser suavizado. Aquí hay un ejemplo de entrada (no hermoso, pero una prueba):
7
9
888888
888888
999 98 7
666666
666666
6666
6
Salida (y ejemplo de arte anti-alias)
Su programa debe enviar a STDOUT el arte ASCII (de las mismas dimensiones), que ha sido suavizado. Aquí está la salida para la entrada anterior. Observe cómo los caracteres de borde se tratan como espacios en blanco que bordean.
d8888>
d8888F
<99 98 @
Y6666b
Y6666>
Y66F
V
Esto podría no verse tan bien (debido al espacio entre líneas en el bloque de código), se ve mejor con un arte ASCII más grande, y la calidad depende de la fuente exacta utilizada.
Otro ejemplo
Entrada
12
18
xx xxx xxx
xxxx xxx xxx
xxxxxx xxx xxx
xxx xxx xxx xxx
xxxx xxx xxx xxx
xxxxxx xxx xxx
xxxx xxx xxx
x xx xxx xxx x
xx xxx xxx xx
xxx xxx xxx xxx
xxxx xxx xxx xx
xxxxx xxx xxx x
Salida
db <xb <xb
dxxb Yxb Yxb
dxxxxb Yxb Yxb
dxx xxb xxb xxb
Yxxb xxF xxF xxF
YxxxxF dxF dxF
YxxF dxF dxF
; YF dxF dxF ;
xb dxF dxF dx
xxb <xF <xF <xx
xxxb Yxb Yxb Yx
Yxxx> Yx> Yx> V
Reglas, restricciones y notas
Su programa debe escribirse solo en caracteres ASCII imprimibles, para que podamos hacer arte de los programas. Aparte de eso, se aplican las reglas estándar de código de golf.
fuente
_
se ha convertido;
porque funciona mejor.Respuestas:
Ruby,
180168 caracteresOtra implementación de Ruby que toma un enfoque zip. Puede ver el segundo ejemplo ejecutándose en línea .
Editar: El uso
readlines
guarda 12 caracteres.fuente
Rubí
275265263261258254244243214212207Muestra 1: http://ideone.com/PfNMA
Muestra 2: http://ideone.com/sWijD
fuente
0..h-1
se puede escribir como0...h
. 3)G=[];h.times{G<<gets}
se puede escribir comoG=readlines
, de manera similar a su código C #. 4) Después del paso 3. la variable h se vuelve inútil, los valores de h y w se usan solo una vez, por lo queh=gets.to_i;w=gets.to_i;H=(0..h-1);W=(0..w-1)
se pueden escribir comoH=0...gets.to_i;W=0...gets.to_i
. 5) En este casoand
se puede escribir como&&
, que no necesita los espacios alrededor. 6) Tienes un extra; y contó la nueva línea al final del archivo, que no es necesaria. Esto significa 214 caracteres: ideone.com/CiW0lH=0..gets.to_i
cuando escribí el código, pero no pareció funcionar (obviamente debe haber sido por otras razones).map
lugar deeach
2) enz=->...
lugar dedef z...end
.map
cambio en lugar deeach
. Sin embargo, para la sintaxis lambda, creo que eso requeriría que los usos dez
sean de la forma enz.call(args)
lugar dez(args)
, agregando así un poco al recuento de caracteres. Por favor, avíseme si me falta algo.[]
uso de lambda .Javascript, 410 caracteres:
sin golf:
Original,
440 caracteres:Nota: he asumido que las dos primeras líneas de entrada son realmente irrelevantes y el tamaño de las siguientes líneas es correcto. ¡También creo que podría cortar algunos caracteres más cuando tenga la oportunidad!
fuente
m={22:"b",28:"d",13:"Y",7:"F",20:";",5:"V",6:">",12:"<",4:"@"}
subíndice A continuación, convertir de M conparseInt()
:m[parseInt(y[d](''),2)]
. Esto reduce el tamaño a 373 caracteres.Python, 259 caracteres
El programa lee la entrada en una sola cadena
I
(con espacios que separan las líneas), comprime una lista de 5 tuplas que contienen el carácter y sus cuatro caracteres circundantes, luego busca el carácter resultante usando la indexación de cadena.fuente
PHP -
359330282268257 caracteresfuente
\r\n
. Actualicé mi código para trabajar con EOL de estilo Unix\n
.Pitón,
246241WC y prueba en la muestra 2, diferencie con la salida de la solución Ruby en la parte superior:
fuente
C #
591563fuente