Dada una imagen que solo tiene píxeles en blanco y negro y una ubicación (x, y) que es un píxel blanco, colorea los píxeles blancos según su distancia mínima de Manhattan desde (x, y) en una ruta que solo implica atravesar otros píxeles blancos.
El tono de los píxeles coloreados debe ser proporcional a su distancia desde (x, y), por lo que el píxel en (x, y) tendrá un tono de 0 ° (rojo puro) y los píxeles más alejados de (x, y) tendrá un tono de 360 ° (también rojo), y los otros tonos se mezclarán de manera transparente y lineal en el medio. La saturación y el valor deben ser ambos 100%.
Si un píxel blanco no está conectado a (x, y) a través de otros píxeles blancos, entonces debe permanecer blanco.
Detalles
- La entrada consistirá en el nombre del archivo de la imagen o los datos de la imagen en bruto, más los enteros x e y.
- La imagen de salida puede guardarse en un archivo o canalizarse sin formato a stdout en cualquier formato de archivo de imagen común, o simplemente mostrarse.
- El valor x es 0 en los píxeles más a la izquierda y aumenta a la derecha. El valor y es 0 en los píxeles superiores y aumenta al descender. (x, y) siempre estará en los límites de la imagen.
- Se permiten tanto programas completos como funciones.
El código más corto en bytes gana.
Ejemplos
Todas estas imágenes se han reducido para ahorrar espacio. Haz clic para verlos a tamaño completo.
Imagen de entrada:
(x,y) = (165,155)
y (x,y) = (0,0)
Imagen de entrada y salida con (x,y) = (0,0)
:
Imagen de entrada y salida con (x,y) = (600,350)
:
Imagen de entrada y salida con (x,y) = (0,0)
:
Imagen de entrada y salida con (x,y) = (0,0)
:
Opcional -30% de bonificación: use la distancia euclidiana. Una sugerencia para su algoritmo es la siguiente (esquema general):
- Tener un píxel de inicio.
- Relleno de inundación desde ese píxel.
- Por cada píxel alcanzado en el relleno de inundación,
- Pase del píxel inicial a ese píxel en pasos de media unidad, en línea recta.
- En cada paso, aplique
int()
a las coordenadas x e y. Si el píxel en estas coordenadas es negro, deténgase. De lo contrario, continúe. (Este es un método de línea de visión). - Cualquier píxel alcanzado que bordee un píxel blanco y / o un píxel previamente etiquetado con una distancia significativamente mayor (es decir, +10) se convierte en un píxel inicial.
En un sentido más meta, este algoritmo se extiende a cada píxel accesible en línea recta desde los píxeles iniciales / ya coloreados, luego "pulgadas" alrededor de los bordes. El bit de "distancia significativamente mayor" está destinado a acelerar el algoritmo. Honestamente, realmente no importa cómo implemente la distancia euclidiana, solo tiene que parecerse a esto.
Así es como se ve el primer ejemplo con la distancia euclidiana, usando el algoritmo anterior:
Imagen de entrada y (x,y) = (165,155)
¡Muchas gracias a Calvin'sHobbies y trichoplax por ayudarnos a escribir este desafío! ¡Que te diviertas!
fuente
Respuestas:
Matlab,
255 245231 bytesEsto espera el nombre de la imagen primero, luego
y
y luegox
.Implementé el relleno de inundación (o 'dijkstra para 4 vecindarios' si lo desea) aproximadamente creando primero una máscara donde el píxel inicial se establece en 1 y con un acumulador de distancia (ambos del tamaño de la imagen) y luego repitiendo lo siguiente pasos:
k
k
Esto nos deja con las distancias de Manhattan de cada píxel al píxel inicial en el acumulador de distancia. Luego creamos una nueva imagen yendo a través del rango de colores dado y asignamos el "primer" tono al valor cero y el "último" tono a la distancia máxima.
Ejemplos
Como beneficio adicional, aquí hay una bonita imagen de cómo se calcula la distancia. más brillante = más lejos.
fuente
Blitz 2D / 3D , 3068 * 0.7 = 2147.6
Esta es la implementación de referencia para el algoritmo euclidiano, golfizado.
En realidad, detesto lo ilegible que se compara esto con el original. (Lo cual es, por cierto, 5305 bytes.) En realidad, podría cortar bastantes bytes más usando nombres de variables de un carácter para todo, pero esto ya es bastante ridículo. Y no está ganando en el corto plazo. :PAGS
fuente
C ++ / SFML:
127112351226 bytes-36 bytes gracias a user202729 -9 bytes gracias a Zacharý
El
sf::Image
parámetro también es la salida (se modificará). Puedes usarlo así:El primer parámetro es la entrada (y salida) de la imagen, el segundo y el tercer parámetro son el parámetro
x
yy
donde necesita comenzarfuente
setPixel(j, i,hsv2
yFI(xm,ym) (std::find_if
realmente necesario?G(d,a,b,c)
ycase d:
. Además, el espacio entrecase d:
y tambiénreturn C(a,b,c)
es innecesario.(b>m?b:m)
no requiere paréntesis, y(t/60)%6
=>t/60%6
por orden de operaciones.xm
yym
nombres de variable más cortosG(d,a,b,c)
ycase
,FI
,ti
, yhsv2rgb
cada uno puede ser reemplazado con un nombre más corto.C ++,
979969898859848bytesRGBARGB (salida en archivo: d)No es exactamente un "ungolf" directo, pero este fue un prototipo C que me burlé primero:
Muchos conceptos siguen siendo similares, pero ciertamente hay una miríada de pequeños cambios. Para compilar eso como C, debe usar C11 (C99 probablemente funcionará, pero solo lo probé estrictamente en C11).
Disfruté bastante este desafío, gracias por darme la idea de probar algo nuevo :).
Editar: Golf'd un poco mejor.
Edit2: fusioné dos estructuras para que mi estructura de píxeles y mi cola sean iguales, un poco más de abuso de macro y usos redistribuidos de 255, de modo que se pueda definir como -1 al definir una serie de caracteres sin firmar y, por último, eliminar una llamada de función.
Edit3: reutilizó algunas variables más, ajustes de precedencia de operadores y salida convertida a RGB guardando el canal alfa
Edit4: creo que ya terminé con esto, algunos cambios aritméticos de puntero y ligeros ajustes de flujo de control.
fuente
Python 3 y matplotlib, 251 bytes
La entrada es una matriz numpy MxNx3 tal como la devuelve la
imshow()
función matplotlib . La entrada modifica la entrada, por lo que debe copiarse de antemano. Muestra la imagen automáticamente si matplotlib está en modo "interactivo"; de lo contrario, seshow()
debe agregar una llamada a otros 7 bytes.La salida se crea mostrando primero la imagen original y luego mostrando la imagen del arco iris sobre ella. Matplotlib trata convenientemente inf y nan como transparentes para que la imagen en blanco y negro se vea a través.
fuente