Dado un conjunto de contornos 2D no superpuestos cerrados (separados por al menos un espacio, incluso en diagonales) con flechas orientadas consistentemente en el mismo sentido horario o antihorario (cada contorno tiene su propia dirección) y un número positivo n
, mueva las flechas n
pasos a lo largo de los contornos en la dirección respectiva. Las flechas están representadas > v < ^
respectivamente por las direcciones derecha, abajo, izquierda y arriba. Allí los otros caracteres son -
(horizontal), |
(vertical) y +
(esquina). Cuando una flecha está en una esquina, mantiene su dirección actual y la cambia solo después de tomar el turno.
Siempre habrá un segmento recto (o un espacio) entre dos esquinas (como +-+
para la horizontal y similar para la vertical); en otras palabras, las U
curvas cerradas están prohibidas. Los segmentos entre las esquinas son verticales u horizontales y la curva en una esquina es siempre de 90 grados.
Entrada:
- un entero positivo -
n
- número de pasos - una representación ASCII de los contornos: puede ser una cadena de varias líneas, una lista de cadenas, una lista de caracteres, etc.
Salida:
Los mismos contornos con todas las flechas cambiaron los n
pasos en la dirección general de cada contorno.
Casos de prueba:
1)
Entrada:
n
= 1
+----->->
| |
| v---+
| |
+---<-------+
Salida:
+------>+
| v
| +>--+
| |
+--<--------+
2)
Entrada:
n
= 2
+-----+ +---+
| | | |
+-->--+ | v
| |
+--->---+ |
| |
+------<<---+
Salida:
+-----+ +---+
| | | |
+---->+ | |
| |
+----->-+ v
| |
+----<<-----+
3)
Entrada:
n
= 3
+---+ +---+ +-------+
| | | v | |
^ | | | +-<-+ |
| | ^ | | v
| +---+ +-->----+ |
| |
| +-------+ +---+ |
| | | v | |
+---+ +---+ +---+
Salida:
+>--+ ^---+ +-------+
| | | | ^ |
| | | | +---+ |
| | | | | |
| +---+ v----->-+ |
| |
| +-------+ +---+ v
| | | | | |
+---+ +-<-+ +---+
4)
Entrada:
n
= 1
+--+
| |
| +---+
| |
+----+ |
| |
+-+
Salida:
+--+
| |
| +---+
| |
+----+ |
| |
+-+
5)
Entrada
n
= 4
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
Salida:
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
6)
Entrada:
n
= 1
^->
^ v
<<v
Salida:
^>+
^ v
<<v
Escriba una función o un programa para resolver la tarea anterior. El código más corto en bytes en cada idioma gana. No se desanime por los idiomas de golf. La explicación del algoritmo y el código es muy apreciada.
There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Respuestas:
JavaScript (ES6),
210 ... 182180 bytesToma entrada comom
(m)(n)
, donde es una lista de listas de caracteres. Devuelve el resultado en el mismo formato.Pruébalo en línea!
¿Cómo?
Puede seguir este enlace para ver una versión formateada de la fuente.
Envoltura
La función recursiva solo se usa como una envoltura que invoca el código principal para mover todas las flechas en 1 paso y sigue llamándose con hasta .g n−1 n=0
Método de actualización
No podemos mover con seguridad cada flecha una a la vez porque correríamos el riesgo de sobrescribir las flechas no actualizadas con las actualizadas. En cambio, primero eliminamos todas las flechas y calculamos sus nuevas posiciones. Aplicamos las nuevas posiciones en una segunda vez.
Esto se hace reutilizando como una cadena para almacenar las actualizaciones de posición como código JS.n
Por ejemplo, en el primer caso de prueba, se establece en:n
(Tenga en cuenta que el número inicial, que es el valor original de , es inofensivo).n
Las nuevas posiciones se aplican simplemente haciendo
eval(n)
.Direcciones
Cada flecha se convierte en una dirección (nombrada en el código), utilizando la siguiente brújula:d
$
Los valores correspondientes de y se calculan de esta manera:dx dy
Esquinas
Si el siguiente personaje en la dirección identificada es un espacio o está fuera de los límites, significa que estamos ubicados en una esquina y tenemos que dar un giro de 90 ° o 270 °. Esta es la razón por la cual la función auxiliar está probando hasta 3 direcciones distintas: , y .h d dxor1 dxor3
Si estamos ubicados en una esquina, sobrescribimos la celda cond
+
. De lo contrario, lo sobrescribimos con uno-
o|
, dependiendo de la paridad de .Nota : el parámetro deh h
$
"$"
"$"
"$"
Versión animada
Mostrar fragmento de código
fuente
K (NGN / K) ,
183 161157 bytesPruébalo en línea!
{
}/
cuando se llama con un int left arg n, esto aplicará la función en{
}
n veces a la derecha argA:"^>v<"
flechasD,:-D:(-1 0;!2)
∆y, ∆x para las 4 direcciones cardinaless:(#x;#*x)
forma de la entrada: altura, anchoc:~^x
countours - matriz booleana que muestra dónde están los no espaciosr:" -+|"c*+/'3'0,c,0
recrear la matriz de caracteres con un conteo pero sin flechas, contando self + upper + lower para cada celdac
y reemplazando 1->-
, 2->+
, 3->|
t:A?,/x
tipos de flechas: 0 1 2 3 para^>v<
, todas las demás celdas se representan como0N
(nulo)p:+s\&~^t
coordenadas de las flechas$[#p
;;:r]
si no hay flechas, regreser
q:+p+/:D@4!(t^0N)+/:0 1 3
las 3 nuevas posiciones posibles para cada flecha: si sigue avanzando, si gira a la izquierda y si gira a la derechaq:q@'*'&'~^x ./:/:q
para cada flecha, elija la primera opción que aterrice en el país@[,/r;s/+q;:;A@D?q-p]
aplanarr
y poner sobre él las flechas en sus nuevas posiciones y con sus nuevas direccioness#
remodelar a la forma originalfuente
Carbón , 105 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Incluye 22 bytes utilizados para evitar requerir un formato de entrada engorroso. Explicación:
Ingrese convenientemente los contornos y la cantidad de pasos.
Los caracteres de dirección se usan varias veces, por lo que la cadena se almacena en caché aquí. El índice de un carácter de dirección en esta cadena se conoce como su dirección.
Imprima los contornos originales sin mover el cursor.
Recorre los personajes en el contorno.
Si los caracteres actuales son un carácter de dirección ...
... luego guarde la dirección y la posición en una lista ...
... y reemplace el carácter con el carácter de línea apropiado.
De lo contrario, muestre el carácter y pase al siguiente carácter.
Recorrer las posiciones guardadas.
Salta a la posición guardada.
Extraer la dirección guardada.
Pase el número apropiado de pasos.
Encuentre la dirección del siguiente paso, que es cualquier dirección que no sea inversa ni vacía.
Da un paso en esa dirección. (Los índices de dirección de carbón para el
Move
comando son dos veces el valor de mi dirección).Imprima el carácter de dirección apropiado.
fuente
APL (Dyalog Unicode) , SBCS de 111 bytes
Pruébalo en línea!
similar a mi k respuesta
fuente