Imagine a un pirómano caminando por la ciudad y recogiendo a sus víctimas de acuerdo con un patrón muy específico (o, alternativamente, imagine una abeja volando por el jardín y recogiendo sus flores para polenizar de acuerdo con un patrón muy específico ). Digamos que la ciudad es una matriz N × N , donde N es un número entero mayor o igual a 2 . El incendiario comienza desde la esquina superior izquierda y establece sucesivamente los puntos M de la casa frente a ellos (donde M es el número de la casa en la que se encuentran actualmente), mientras cambia la dirección en la que se mueve después de cada incendio, en el orden Este ⟶ Sur ⟶ Oeste ⟶ Norte ⟶ Este ⟶ Sur ... y así sucesivamente. La canción de cunadel incendiario es el valor de M que los hace salir de la ciudad (es decir, la última casa que visitan antes de detener la abominación). Esto es mucho más fácil de entender con un ejemplo. Tome la siguiente matriz por ejemplo:
3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Comenzamos en la esquina superior izquierda, por lo que M = 3 (
X
marca las posiciones actuales y anteriores del pirómano):X 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Según el orden conocido, primero va al este M (3) puntos y aterriza en un 2, por lo que M cambia en consecuencia:
X 2 3 X 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Luego va hacia el sur 2 puntos y M es ahora 1 :
X 2 3 X 7 3 1 4 1 6 2 5 3 X 1 4 4 3 2 4 1 1 1 1 1
- Ahora se mueve 1 lugar hacia el oeste y M se convierte en 3 :
X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
- ¡Después de que se mueve 3 puntos al norte, sale de la ciudad! Por lo tanto, 3 es la canción de cuna de este pirómano:
X X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
Dada una matriz N × N (opcionalmente, también puede tomar N como entrada), encuentre la canción de cuna del pirómano. He escrito un programa con el que puedes generar más casos de prueba y visualizar el camino del pirómano: ¡ Pruébalo en línea!
- Es posible suponer que el incendiario hace tener una canción de cuna (que es, en realidad puede salir de la matriz).
- La matriz solo contendrá enteros positivos menores o iguales a 9 (dígitos), por simplicidad. Las soluciones que manejan cualquier número entero positivo son completamente bienvenidas.
- Tenga en cuenta que el pirómano puede aterrizar en un lugar que ya ha quemado, en caso de que la sensación de que se mude sea diferente de la primera vez. En tal escenario, simplemente tome el valor de ese elemento y muévalo nuevamente como de costumbre.
- Puede competir en cualquier lenguaje de programación y puede tomar entradas y proporcionar salidas a través de cualquier método estándar , mientras toma nota de que estas lagunas están prohibidas por defecto. Este es el código de golf , por lo que gana el envío más corto (en bytes) para cada idioma .
Casos de prueba
------------- 9 2 3 1 7 2 8 7 6 Canción de cuna: 9 ------------- 2 1 2 1 3 1 1 2 1 2 2 1 1 1 1 3 Canción de cuna: 2 ------------- 3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1 Canción de cuna: 3 ------------- 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 Canción de cuna: 2 ------------- 3 2 1 2 1 1 1 2 3 2 3 2 1 1 2 1 1 1 3 1 2 3 1 1 1 1 1 1 4 5 2 3 1 1 1 1 2 1 2 1 2 2 1 2 2 3 2 1 2 Canción de cuna: 3 -------------
Las matrices en un formato diferente:
[[9, 2, 3], [1, 7, 2], [8, 7, 6]] [[2, 1, 2, 1], [3, 1, 1, 2], [1, 2, 2, 1], [1, 1, 1, 3]] [[3, 2, 3, 2, 7], [3, 1, 4, 1, 6], [2, 5, 3, 1, 1], [4, 4, 3, 2, 4], [ 1, 1, 1, 1, 1]] [[1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2]] [[3, 2, 1, 2, 1, 1, 1], [2, 3, 2, 3, 2, 1, 1], [2, 1, 1, 1, 3, 1, 2], [ 3, 1, 1, 1, 1, 1, 1], [4, 5, 2, 3, 1, 1, 1], [1, 2, 1, 2, 1, 2, 2], [1, 2, 2, 3, 2, 1, 2]]
El quinto caso de prueba es muy interesante de visualizar .
fuente
Respuestas:
MATL , 32 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Cómo funciona
La matriz de entrada se rellena con un marco de cinco ceros, por ejemplo
se convierte
El marco de ceros se usa para detectar cuándo la abeja
incendiariaha salido de la matriz. La extensión con cinco ceros asegura que un desplazamiento modular de longitud hasta9
en cualquier dirección desde cualquiera de las entradas distintas de cero aterrizará correctamente en un cero sin ajustarse a alguna entrada distinta de cero.En las coordenadas de la matriz, la abeja comienza en la entrada
(6,6)
de la matriz extendida. Lee esa entrada y actualiza las coordenadas según sea necesario, aplicando un desplazamiento (modular) de la longitud de lectura en la dirección correspondiente. Esto se repite en un bucle hasta que el valor de lectura sea0
. La entrada que se leyó antes de esa (es decir, la última entrada distinta de cero) es la salida.Las coordenadas se almacenan realmente como un número complejo, por lo que, por ejemplo, se
(6,6)
convierte en6+6j
. De esta manera, las cuatro direcciones cíclicas pueden realizarse como potencias de la unidad imaginaria. La potencia correspondiente (j
,1
,-j
o-1
) se multiplica por la entrada de lectura para obtener el complejo desplazamiento que se utiliza para la actualización de las coordenadas.Los valores leídos sucesivamente se mantienen en la pila. Cuando se sale del bucle, la pila contiene todos los valores de lectura distintos de cero en orden, luego el último valor de lectura que es
0
, luego las últimas coordenadas complejas. Entonces, el tercer elemento superior es la salida requerida.fuente
JavaScript (ES6),
7068 bytesPruébalo en línea!
Comentado
Dado que el signo del módulo en JS es el del dividendo, la dirección se actualiza de esta manera:
fuente
Carbón ,
2518 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Imprima la cadena de entrada, pero no mueva la posición de impresión.
Gire el pivote hacia la izquierda, de modo que la dirección de impresión esté ahora hacia arriba.
Repita mientras haya un carácter debajo de la posición de impresión.
Guarde el personaje en una variable.
Lanza el personaje a un número e imprime tantas líneas nuevas. Como la dirección de impresión ahora está hacia arriba, esto termina imprimiendo horizontalmente. El resultado es que hemos movido la posición de impresión en la dirección deseada por la cantidad dada por el número debajo de la posición de impresión.
Gire el pivote para que las nuevas líneas nuevas muevan la posición de impresión en la siguiente dirección en el sentido de las agujas del reloj para la próxima pasada del bucle.
Desafortunadamente, todavía tenemos la entrada abarrotando nuestro lienzo, y aún más desafortunadamente, si limpiamos el lienzo también borramos nuestra variable. Entonces, esto es un poco truco: una lista de la cadena vacía y la variable se repite. En la primera pasada del bucle, la variable del bucle está vacía, por lo que el lienzo y la variable del bucle y la variable del resultado se borran. ¡Pero el ciclo no ha terminado! En el segundo paso del ciclo, aún podemos acceder a nuestra variable cuidadosamente preservada en nuestra lista de ciclos. Simplemente queda por imprimirlo.Borre el lienzo e imprima la variable guardada. (Gracias a @ ASCII-only por la solución a Charcoal).
fuente
Python 2 ,
8584 bytesPruébalo en línea!
Consejo del sombrero para Sr. Xcoder por 1 byte.
fuente
Carbón ,
504946343326 bytesPruébalo en línea
El enlace es a la versión detallada del código
La entrada debe ser N en su propia línea, luego las líneas de la matriz en líneas separadas después de eso.
Cualquier forma de eliminar bytes es bienvenida y deseada, ya que no soy un buen golfista en el carbón.
-12 bytes gracias a @Neil! -1 byte gracias a @ ASCII-only! -7 bytes gracias a @ ASCII-only (cambió un error que hizo que las
Clear
variables de reinicio)fuente
Rojo , 145 bytes
Pruébalo en línea!
Más legible:
fuente
Perl 6 , 62 bytes
Pruébalo en línea!
Toma la matriz como lista plana y ancho.
fuente
Limpio , 141 bytes
Pruébalo en línea!
Define la función
? :: {#{#Int}} -> Int
, toma una matriz sin caja de matrices enteras sin caja y devuelve el resultado.fuente
Java 8, 121 bytes
Pruébalo en línea.
Alternativa con el mismo número de bytes de 121 bytes :
Utiliza try-finally en lugar de verificar si
x,y
-coordinate todavía está dentro de los límites.Pruébalo en línea.
Explicación:
fuente
Perl 5 , 92 bytes
Pruébalo en línea!
¿Cómo?
El conjunto de mapas anidados y la unión producen esto:
que luego se evalúa para determinar si el ciclo termina. Debido a que el booleano se evalúa de izquierda a derecha, el valor de
$n
realmente cambia (hasta) cuatro veces durante la evaluación. Debido a que la lógica booleana cortocircuita en Perl, el valor de$n
es la canción de cuna cuando se sale del bucle.fuente
Python 3 ,
8584 bytesxcoder: -1 (nunca recuerdo el truco + ~)
Pruébalo en línea!
En lugar de moverse en diferentes direcciones (E, S, W, N), esta solución siempre se mueve hacia el este y gira la cuadrícula en sentido antihorario después de cada movimiento. Después de rotar, lo que fue la última columna ahora es la primera fila, por lo que si el índice de la fila es menor que cero, significa que nos salimos del tablero.
fuente
-d-1
=>+~d
Retina , 161 bytes
Pruébalo en línea!
fuente