Marching Squares es un algoritmo de gráficos de computadora, que se utiliza para recuperar isocontornos 2D de una cuadrícula de muestras (ver también, su hermano mayor Marching Cubes para configuraciones 3D). La idea es procesar cada celda de la cuadrícula de forma independiente y determinar los contornos que pasan por esa celda en función de los valores en sus esquinas.
El primer paso en este proceso es determinar qué bordes están conectados por contornos, en función de si las esquinas están por encima o por debajo del valor del contorno. Para simplificar, solo consideraremos los contornos a lo largo del valor 0
, de modo que nos interese saber si las esquinas son positivas o negativas. Hay casos para distinguir:24 = 16
Fuente de la imagen: Wikipedia
La identificación del blanco y el negro realmente no importa aquí, pero para ser claros, digamos que el blanco es positivo y el negro es negativo. Ignoraremos los casos en que una de las esquinas es exactamente 0
.
Los puntos de silla (casos 5 y 10) proporcionan un poco de dificultad adicional: no está claro qué diagonales se deben usar solo mirando las esquinas. Esto se puede resolver encontrando el promedio de las cuatro esquinas (es decir, una aproximación del valor del centro) y eligiendo las diagonales de manera que los contornos separen el centro de las esquinas con el signo opuesto. Si el promedio es exactamente 0
, se puede elegir cualquier caso.
Normalmente, estos 16 casos simplemente se almacenan en una tabla de búsqueda. Esto es excelente para la eficiencia, pero, por supuesto, preferiríamos que el código sea corto por aquí. Por lo tanto, su tarea es realizar este paso de búsqueda e imprimir una representación ASCII del caso en el menor código posible.
El reto
Te dan los valores de las cuatro esquinas (enteros distintos de cero) en un orden fijo de tu elección. Luego debe generar el diseño correcto de los contornos, resolviendo correctamente los casos de punto de silla de montar.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
La entrada puede tomarse en cualquier cadena conveniente o formato de lista.
Los 16 casos se representarán en el arte ASCII utilizando uno de los siguientes bloques 5x5:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
No debe imprimir ningún espacio en blanco inicial o final, pero puede imprimir una nueva línea opcional.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Los casos de prueba suponen que la entrada se da en orden superior izquierda , superior derecha , inferior izquierda , inferior derecha . Los casos de prueba se presentan en 9 grupos, uno correspondiente a cada una de las 9 representaciones dadas anteriormente (en el mismo orden, comenzando desde la celda vacía, terminando con los dos puntos de silla).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Además, los siguientes casos de prueba pueden devolver cualquiera de los puntos de silla (su elección):
[1, -4, -2, 5]
[-1, 4, 2, -5]