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!