Esta imagen se hizo superponiendo 7 rectángulos de diferentes colores uno encima del otro:
Los rectángulos negro y granate no están obstruidos , es decir, no hay otros rectángulos encima.
Escriba un programa que tome una imagen como esta y elimine cualquier rectángulo sin obstrucciones, generando la imagen resultante.
Ejemplo
Si ejecutó su programa en la imagen de arriba y lo siguió ejecutando en la salida, podría progresar así.
Run 1 - Black eliminado (podría haber sido granate):
Run 2 - Maroon eliminado (única opción):
Ejecución 3 - Amarillo eliminado (única opción):
Ejecutar 4 - Azul eliminado (podría haber sido verde):
Ejecutar 5 - Verde eliminado (única opción):
Run 6 - Brown eliminado (única opción):
Ejecución 7 - Rojo eliminado (única opción):
Cualquier ejecución adicional debe producir la misma imagen en blanco.
Esperemos que Stack Exchange no haya comprimido ninguna de estas imágenes.
La imagen siempre tendrá un fondo blanco y cada rectángulo tendrá un color RGB único que no sea blanco.
Puede suponer que la imagen siempre se puede interpretar como un conjunto de rectángulos superpuestos. Específicamente, puede suponer que, para un color en particular, el píxel con ese color más cercano a la parte superior de la imagen es parte del borde superior del rectángulo de ese color. Lo mismo vale para los bordes inferior, izquierdo y derecho.
Entonces, por ejemplo, en esta imagen, el borde superior del rectángulo rojo estaría justo debajo del borde inferior del rectángulo amarillo, ya que el rectángulo naranja cubría el viejo borde superior rojo:
En esta imagen, el rectángulo rojo podría eliminarse primero (junto con negro / granate / naranja / gris):
Cuando el orden de los rectángulos inferiores es ambiguo, puede darles cualquier orden.
Por ejemplo, la imagen izquierda aquí podría convertirse en el medio o la derecha:
La salida no debería tener superposiciones paradójicas (por lo que debería ser posible hacerlo con el algoritmo del pintor ). Entonces, en esta imagen ( gracias user23013 ), tendría que ser verde debajo del rectángulo naranja:
Detalles adicionales
- La imagen y los rectángulos pueden tener cualquier dimensión.
- Los rectángulos pueden tocar el borde de la imagen.
- Puede haber hasta 256 rectángulos 3 - 1.
- Si la entrada es completamente blanca, la salida también debería serlo.
- Puede usar bibliotecas de imágenes.
- La entrada debe ser el nombre del archivo de imagen o los datos de imagen sin procesar. Puede provenir de stdin o la línea de comando.
- El resultado puede escribirse en el mismo archivo de imagen u otro, arrojarse sin formato a stdout, o simplemente mostrarse.
- Se permite cualquier formato de archivo de imagen truecolor sin pérdida común .
El envío con la menor cantidad de bytes gana.
fuente
Respuestas:
CJam, 241 bytes
(con nuevas líneas eliminadas)
Utiliza el formato de archivo ppm. Ejemplo de uso (usando ImageMagick):
Bueno, es demasiado largo y demasiado lento ... Corre alrededor de un minuto para el ejemplo.
Cambié el tamaño de los casos de prueba (y agregué algunos otros) para facilitar las pruebas.
Parece que la información del espacio de color se pierde, por lo que los colores son ligeramente diferentes.
fuente
Pitón,
690651610606594569 bytesEl script lee el nombre de la imagen de stdin.
Detecta los bordes de cada rectángulo, ordénelos por el número de colores diferentes que contienen (los rectángulos sin obstáculos contienen solo 1 color y luego aparecen al final de la lista)
Esta lista se usa para volver a dibujar una imagen. El orden de redibujado se decide eligiendo la permutación de la lista que generaría una imagen de salida que tenga la menor diferencia de píxeles con la entrada.
fuente
Java - 1483 bytes
No soy un gran jugador de código, que quede claro; así que la verbosidad no es del todo culpa de Java ;-) Sin embargo, esto parecía un desafío realmente divertido. Lo he resuelto de una manera que, creo, es un poco aburrida y detallada, pero bueno. Funciona, es (relativamente) rápido y, especialmente, ¡fue divertido!
La idea es la siguiente: verifique cada píxel desde el inicio en la esquina superior izquierda hasta la esquina inferior derecha. ¿Es un píxel blanco? Ignorar. ¿Es de color? Genial, hagamos un seguimiento e intentemos determinar sus límites (arriba a la izquierda, arriba a la derecha, abajo a la izquierda, abajo a la derecha).
Una vez hecho esto, verifique el área de cada rectángulo. ¿Contiene un color diferente al color del rectángulo? Luego, averigüe qué rectángulo pertenece a ese color y actualice el índice z de ese rectángulo superpuesto en 1.
Y, por último, dibuje todos los rectángulos teniendo en cuenta los índices z. Funciona realmente como un índice z que conoces de CSS y otras cosas en 3D. Los rectángulos con el índice z más bajo se dibujan primero, el índice z más alto al final.
El código completo, que es un poco, y eso es un eufemismo ;-), escrito más claramente, se puede encontrar aquí: http://pastebin.com/UjxUUXRp
Además, ahora que veo la sumisión de dieter, podría haber hecho algunas partes más fáciles. No es realmente necesario encontrar el rectángulo cuyo color se superpone a otro rectángulo. De hecho, podría contar la cantidad de colores 'invasores'.
fuente