El objetivo de este desafío es encontrar la dirección y el área encerrada por un bucle.
Entrada:
Una cuadrícula rectangular que consta completamente de estos caracteres: ^v<>
(Opcionalmente, también se le pueden dar las dimensiones de la cuadrícula antes de la cuadrícula en decimal con un prefijo, sufijo y carácter separador de su elección).
Un bucle en la cuadrícula es un conjunto de los caracteres antes mencionados, de modo que uno señala al siguiente, apunta al siguiente y finalmente apunta al primer carácter. Por ejemplo:
<>>v> >>v
^^<>v ^ >v
>^<<< ^<<<
>^<v>
La cuadrícula izquierda es la entrada de muestra; La cuadrícula derecha es el bucle aislado.
La cuadrícula de entrada no contendrá ningún bucle o un bucle; no tiene que preocuparse por ningún caso en el que la cuadrícula contenga más de un bucle.
Salida:
Si la cuadrícula no contiene bucle, salida X
.
Si la cuadrícula contiene dos flechas que apuntan entre sí, salida 0
.
Si la cuadrícula contiene un bucle en sentido antihorario, cuente los caracteres encerrados por el bucle, incluido el borde. Salida de ese número.
Si la cuadrícula contiene un bucle en el sentido de las agujas del reloj, siga el mismo proceso para el bucle en el sentido contrario a las agujas del reloj, pero genere el negativo de ese número. Por ejemplo, la cuadrícula de entrada anterior tendría una salida de -11
: 10 provienen del propio bucle y 1 del carácter encerrado por el bucle.
Este es el código de golf . El código más corto gana.
Casos de prueba:
<<^
^>v
^v<
Salida X
.
<<<<
><<<
>>^>
Salida 0
.
<>^^<
>>>v>
<^^>v
<^>>v
>^<<<
Salida -15
.
v<<<<
>v>>^
v<^<<
>>>>^
Salida 20
.
Respuestas:
C #, 604 bytes
Programa completo, acepta entradas (diseño delimitado por líneas, sin dimensiones) desde STDIN, salidas a STDOUT.
El programa funciona leyendo primero en el diseño, no hace falta decirlo, y luego iterando sobre cada celda. Luego ejecutamos una 'serpiente' desde cada celda, que sigue las flechas hasta que se sale del borde, o se topa con sí misma. Si se encuentra en sí mismo, entonces sabemos que hemos encontrado un bucle (o una de esas "> <" cosas), y también sabe cuánto de la serpiente está en el bucle.
Una vez que sabemos que tenemos un bucle, sabemos qué celdas están en el bucle y creamos un mapa de cada celda (+1, por razones) ya sea para sí mismo
-1
(significa que está en el bucle) oW
(todo el ancho) si está en el borde (o el +1 (que está en el índiceW
) para simplificar aún más las cosas).Mientras hacemos esto, también encontramos la dirección que tiene el 'último' elemento del bucle (es decir, el último elemento del bucle en la última fila que tiene elementos del bucle). Este elemento debe ser un "<" o un "^", y esto nos dice el reloj (CW / CCW) del bucle (traducido a -1 / + 1).
Luego realizamos un pase de conjunto disjunto, que asigna todos los elementos que están fuera del bucle al
W
conjunto. Luego restamos cuántos de estos hayW
para obtener el número contenido en y en el bucle. Si este número es menor que 3, lo reemplazamos por 0. Multiplicamos esto por el reloj, lo establecemos como resultado y de alguna manera escapamos de los bucles for, donde se genera el resultado.Sin embargo, si la mayoría de lo anterior nunca sucede (porque ninguna serpiente se encuentra nunca), entonces el resultado permanece como "X", y eso se genera.
fuente