Inspirado pelo desafio das relações de marchas da Lego por Keith Randall.
Também planejo construir um robô lego gigante que acabará destruindo os outros robôs na competição nunca mencionada. * No processo de construção do robô, usarei muitos trens de engrenagem para conectar diferentes partes do robô. Quero que você me escreva o programa mais curto que me ajudará a construir os complexos trens de engrenagem necessários para uma tarefa tão complexa. Obviamente, usarei apenas engrenagens com raios 1, 2, 3 e 5 unidades lego arbitrárias.
Cada engrenagem no trem de engrenagens tem uma coordenada inteira específica em uma grade 2D. A primeira marcha está localizada em (0,0) e a marcha final será localizada em coordenadas não-negativas. O local e o tamanho da primeira e da última marcha serão fornecidos como entrada. Seu programa deve informar quais marchas serão para onde preencher as lacunas.
Além disso, seu programa deve usar o número mínimo possível de marchas no trem de engrenagens. Menos engrenagens / trem = mais trens ** = maior e melhor robô de destruição.
A entrada consistirá em uma linha:
X,Y,B,A
X e Y são as coordenadas da marcha final. A primeira marcha está sempre localizada em (0,0). B e A são os raios das marchas final e inicial, respectivamente. Para adicionar alguma dificuldade, você precisa garantir que a engrenagem de saída gire na direção correta.Se A e B tiverem o mesmo sinal, a engrenagem de saída precisará girar na mesma direção, e um número ímpar de marchas deverá ser usado. Se eles tiverem sinais opostos, será necessário usar um número par de marchas.
A saída deve ser uma lista da localização X, localização Y e raios de cada marcha adicional, uma marcha por linha. Se houver várias soluções de engrenagem mínima, imprima apenas uma de sua escolha. A ordem das marchas na saída não importa.
Exemplos (soluções mais equivalentes podem ser possíveis):
in
4,0,1,1
out
2,0,1
in
7,7,-2,-2
out
4,3,3
OR
0,7,5
OR
the above reflected over y=x line
in
7,8,-1,2
out
7,0,5
7,6,1
OR
7,0,5
1,8,5
in
7,7,2,-2
out
4,-3,3
7,1,2
12,1,3
12,7,3
OR
any permutation of the above, or reflected over y=x line
Now you're thinking with gear trains!
Aqui estão as soluções para os exemplos acima, visualizadas:
Até onde eu sei, nenhum problema é impossível, a menos que as duas engrenagens de entrada se sobreponham ou se conectem diretamente. Você não terá que lidar com isso.
Este é o código de golfe, a resposta mais curta vence.
* Um futuro KOTH, alguém?
** CHOO CHOO !!
Respostas:
C #, 660 bytes
Experimente Online
Isso foi muito divertido !! Programa completo, aceita entrada de STDIN, saída para STDOUT. A saída é a engrenagem na ordem do fim ao início. Uso:
Executa uma simples pesquisa de largura em primeiro lugar, que resolve um problema de quatro marchas em menos de um segundo. O fator de ramificação não é realmente tão grande, então é bom para consideravelmente mais (não o testou realmente). Infelizmente, ele usa o Linq.
A
Q
string é uma tabela de todas as conexões de engrenagem permitidas (ou seja, anr=3
e se conectam a umr=1
ifdx=4
edy=0
) em um quadrante, que é rotacionado para encontrar as outras. Cada conjunto de 3 bytes é odx
,dy
e informações raio de um vínculo jurídico. A escolha de(
como deslocamento foi muito deliberada: foi divertido, pela primeira vez, escolher um caractere ASCII para propriedades agradáveis, em vez de tentar desesperadamente encontrar propriedades agradáveis para caracteres ASCII impostos.Provavelmente, posso fazer um trabalho melhor lendo a entrada, mas ainda não tive sorte, até porque o Linq é pago pela necessidade de uma lista. Também estou muito decepcionado com o código de rotação, sinto que isso poderia ser feito em consideravelmente menos bytes.
Código formatado e comentado com
Q
gerador:fonte