Recientemente he estado jugando a través de ' The Weaver ' y creo que presenta un desafío interesante para el código golf .
Premisa:
The Weaver es un juego en el que se te dan varias cintas que vienen de 2 direcciones separadas 90 grados y tu objetivo es intercambiarlas en ciertas intersecciones para lograr el resultado deseado.
Así: Esto es un intercambio: Esto no es:
Entrada:
3 matrices:
- Cintas superiores (de izquierda a derecha)
- Cintas izquierdas (de arriba a abajo)
- Las coordenadas de las intersecciones para intercambiar
Salida:
2 matrices:
- Cintas inferiores (de izquierda a derecha)
- Cintas derechas (de arriba a abajo)
Ejemplos:
Usaré la imagen de arriba como primer ejemplo:
Entrada: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]
Lo que pasa:
r y b
r y b
r r r r•y y y y
r r b
y y y y y y y y
r r b
b b b b•r r•b b
r b r
r b r
Donde •
representa un intercambio.
Salida: [r, b, r], [y, y, b]
Entrada: [a, b, c], [d, e, f], [(0, 0), (2, 1)]
Lo que pasa:
a b c
a b c
d d•a a a a a a
d b c
e e e e e e e e
d b c
f f f f•b b b b
d f c
d f c
Salida: [d, f, c], [a, e, b]
Entrada: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]
Lo que pasa:
a b
a b
a a a a•b b
a a
b b•a a•a a
b a
c c•b b•a a
c b
c b
Salida: [c, b], [b, a, a]
Notas:
- Los ejemplos muestran coordenadas dadas como
(row, column)
si pudiera tomarlas como(column, row)
. - La fila superior y la columna izquierda pueden tener cintas del mismo color.
- El tablero puede ser rectangular.
- Todas las coordenadas serán no negativas (
>=0
) (o estrictamente positivas (>=1
) si elige 1 indexación) - Ignorar cualquier intercambio que esté fuera del tablero
- Puede elegir trabajar con letras (
[a-zA-Z]
), enteros ([0-9]
) o ambos - Las cintas en su salida deben coincidir exactamente con las cintas en la entrada (
a -> a
) - Puede suponer que la lista de swaps está ordenada de la manera que desee, siempre que sea coherente (si lo hace, especifique cómo se debe ordenar)
- Puede tomar las coordenadas de intercambio como 0 o 1 indexado
- Las lagunas predeterminadas están prohibidas
Más ejemplos:
Input:
[b], [r], []
Output:
[b], [r]
Input:
[b], [r], [(0, 0)]
Output:
[r], [b]
Input:
[r, p, y], [r, y, p], [(0, 0), (1, 2), (2, 1), (3, 2)]
Output:
[r, p, y], [r, y, p]
Input:
[b, y, o, r],
[r, o, b, y],
[(0, 0), (2, 0), (3, 2)]
Output:
[b, y, y, r],
[b, o, r, o]
El último ejemplo se relaciona con este caso (si eso facilita la visualización):
Este es el código de golf, por lo que gana la respuesta más corta en bytes para cada idioma.
fuente
Respuestas:
Python 3 , 74 bytes
Pruébalo en línea!
Requiere
l
ser ordenado en orden lexicográfico.a
yb
son listas de caracteres que representan (cinta izquierda, cinta superior).Devuelve modificando la lista
a
yb
.fuente
Gelatina ,
373530 bytesPruébalo en línea!
Programa dinámico, tome la lista de indexación 0 de los índices de intercambio como argumento izquierdo (ordenado en orden lexicográfico inverso) y (cinta izquierda, cinta superior) como argumento derecho. Devoluciones (cinta derecha, cinta inferior).
Jelly es un lenguaje tácito. No hay (casi) ninguna variable con la que trabajar, por lo que hacer cualquier cosa implica más de dos variables a la vez es un desastre.
El primer enlace toma
[l,t]
como argumento izquierdo,[x,y]
(indexación 0) como argumento derecho, y regresa[l,t]
conl[x]
yr[y]
intercambiado.Así que básicamente "
U1¦
debajoṙ"z0
".El segundo enlace simplemente filtra los índices OoB (
<Ạ¥Ðf L€
), agrega el segundo argumento (⁹ṭ
), reverse (Ṛ
) y reduceç
(similar al de Haskellfoldl
)fuente
Python 2 , 193 bytes
Pruébalo en línea!
Toma coordenadas de intercambio indexadas 1
fuente
APL (Dyalog Classic) ,
3130 bytesPruébalo en línea!
El argumento de la izquierda es un par de vectores de caracteres: cintas izquierdas y cintas superiores. El argumento correcto es un vector de pares de coordenadas: ubicaciones de intercambio. Devuelve un par de cintas derechas y cintas inferiores. (Tenga en cuenta que, a diferencia de los ejemplos, utilizo el orden arriba a la izquierda y abajo a la derecha para las cintas para que sea coherente con el orden del eje fila-col en las coordenadas).
Los intercambios deben ordenarse de modo que un intercambio en la esquina superior izquierda de otro ocurra
antes ydespués ella. Si hay dos intercambios en la esquina inferior izquierda / superior derecha, su orden no importa.EDITAR: guardado un byte (
⌽
) al requerir el orden inverso de los intercambios en la entradafuente
Javascript,
877662 bytesPruébalo en línea!
El mismo algoritmo trivial que la respuesta de Python 3. Utiliza matrices como tuplas de coordenadas. Requiere que los colores de la cinta sean designados por valores verdaderos. Requiere que las coordenadas se ordenen parcialmente, de modo que
x1,y1
viene antesx2,y2
six1 < x2 && y1 = y2
ox1 = x2 && y1 < y2
. Devuelve modificando las matrices de entrada.fuente
;return[r,c]
y llamarlo un retorno por modificaciónif(r[i]&&c[j])
ahorraría algunos bytes más.x1=1,x2=2,y1=2,y2=1
. Porquex1<x2
,(x1,y1)
viene antes(x2,y2)
; pero porquey2<y1
,(x2,y2)
viene antes(x1,y1)
. Creo que "x1 < x2
yy1 < y2
" es suficiente.Ruby ,
5654 bytesPruébalo en línea!
Un puerto de la respuesta Python 3 de user202729 con algunos trucos de rubí
Las coordenadas deben ser ordenadas lexicográficamente
fuente