Estive recentemente jogando ' The Weaver ' e acho que isso representa um desafio interessante para o código-golfe .
Premissa:
O Weaver é um jogo no qual você recebe um número de fitas vindas de 2 direções a 90 graus de distância e seu objetivo é trocá-las em determinadas interseções para obter a saída desejada.
Assim: Isso é uma troca: Isso não é:
Entrada:
3 matrizes:
- Fitas superiores (da esquerda para a direita)
- Fitas esquerdas (de cima para baixo)
- As coordenadas das interseções para trocar
Resultado:
2 matrizes:
- Fitas inferiores (da esquerda para a direita)
- Fitas direitas (de cima para baixo)
Exemplos:
Vou usar a imagem acima como o primeiro exemplo:
Entrada: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]
O que acontece:
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
Onde •
representa uma troca.
Resultado: [r, b, r], [y, y, b]
Entrada: [a, b, c], [d, e, f], [(0, 0), (2, 1)]
O que acontece:
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
Resultado: [d, f, c], [a, e, b]
Entrada: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]
O que acontece:
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
Resultado: [c, b], [b, a, a]
Notas:
- Os exemplos mostram as coordenadas fornecidas como
(row, column)
se você pudesse tomá-las como(column, row)
. - A linha superior e a coluna esquerda podem ter fitas da mesma cor
- A placa pode ser retangular
- Todas as coordenadas serão não-negativas (
>=0
) (ou estritamente positivas (>=1
) se você escolher a indexação 1) - Ignore todos os swaps que estão fora do quadro
- Você pode optar por trabalhar com letras (
[a-zA-Z]
), números inteiros ([0-9]
) ou ambos - As fitas na sua saída devem corresponder exatamente às fitas na entrada (
a -> a
) - Você pode presumir que a lista de trocas é classificada da maneira que desejar, desde que seja consistente (se o fizer, especifique como deve ser classificada)
- Você pode assumir as coordenadas de troca como 0 ou 1 indexado
- As brechas padrão são proibidas
Mais exemplos:
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]
O último exemplo refere-se a este caso (se isso facilita a visualização):
Isso é código-golfe, e a resposta mais curta em bytes para cada idioma vence.
fonte
Respostas:
Python 3 , 74 bytes
Experimente online!
Requer
l
a classificação em ordem lexicográfica.a
eb
são listas de caracteres que representam (faixa esquerda, faixa superior).Retorna modificando a lista
a
eb
.fonte
Geléia ,
373530 bytesExperimente online!
Programa diádico, use a lista de indexação 0 de índices de troca como argumento esquerdo (classificado em ordem lexicográfica reversa) e (faixa esquerda, faixa superior) como argumento direito. Retorna (fita direita, fita inferior).
A geléia é uma linguagem tácita. Não há (quase) nenhuma variável com a qual trabalhar; portanto, fazer qualquer coisa envolve mais de duas variáveis ao mesmo tempo, é uma bagunça.
O primeiro link toma
[l,t]
como argumento à esquerda,[x,y]
(indexação 0) como argumento à direita, e retorna[l,t]
coml[x]
er[y]
trocado.Então basicamente "
U1¦
abaixoṙ"z0
".O segundo link simplesmente filtra os índices OoB (
<Ạ¥Ðf L€
), acrescenta o segundo argumento (⁹ṭ
), reverse (Ṛ
) e reduz o excessoç
(semelhante ao de Haskellfoldl
)fonte
Python 2 , 193 bytes
Experimente online!
Leva coordenadas de troca indexadas 1
fonte
APL (Dyalog Classic) ,
3130 bytesExperimente online!
O argumento da esquerda é um par de vetores de caracteres - fitas esquerdas e fitas superiores. O argumento certo é um vetor de pares de coordenadas - localizações de swap. Retorna um par de fitas direitas e inferiores. (Observe que, diferentemente dos exemplos, eu uso a ordem superior esquerda e inferior direita das fitas para ser consistente com a ordem do eixo linha-col nas coordenadas.)
Swaps deve ser resolvido para que uma troca para o canto superior esquerdo da outra vem
antesapós ele. Se dois swaps estiverem no canto inferior esquerdo / superior direito um do outro, a ordem deles não importará.EDIT: salva um byte (
⌽
) exigindo ordem inversa de swaps na entradafonte
Javascript,
877662 bytesExperimente online!
O mesmo algoritmo trivial que a resposta do Python 3. Usa matrizes como tuplas de coordenadas. Requer que as cores da fita sejam designadas por valores reais. Requer que as coordenadas sejam parcialmente ordenadas, de modo que
x1,y1
seja anterior ax2,y2
sex1 < x2 && y1 = y2
oux1 = x2 && y1 < y2
. Retorna modificando matrizes de entrada.fonte
;return[r,c]
e chamá-lo de um retorno por modificaçãoif(r[i]&&c[j])
economizaria mais alguns bytes.x1=1,x2=2,y1=2,y2=1
. Porquex1<x2
,(x1,y1)
vem antes(x2,y2)
; mas porquey2<y1
,(x2,y2)
vem antes(x1,y1)
. Eu acho que "x1 < x2
ey1 < y2
" é suficiente.Ruby ,
5654 bytesExperimente online!
Uma porta da resposta Python 3 do user202729 com alguns truques de rubi
As coordenadas devem ser classificadas lexicograficamente
fonte