PONTUAÇÃO ATUALIZADA : Como esse desafio é mais difícil do que eu previa, ajustei a pontuação. Um programa que pode resolver uma única entrada de espelho é uma resposta válida. Programas mais sofisticados recebem um bônus em sua pontuação.
Houve vários quebra-cabeças no PPCG para encontrar um caminho a laser em uma caixa de espelhos. Neste quebra-cabeça, você precisa criar uma caixa de espelhos para combinar com vários destinos de laser.
Você recebe uma caixa e especificações onde os lasers devem entrar e sair. Seu programa precisa colocar exatamente N espelhos de dupla face na caixa para atender às especificações. Os espelhos devem estar angulados a 45 graus, mas podem ser inclinados para a frente ou para trás.
Entrada
Seu programa deve aceitar uma grade de caixa via STDIN, argumento de linha de comando ou arquivo nos seguintes exemplos de formato:
+--G--+ +abcde+
G | f/////d
| /| a// c
+-----+ f |
+-b-e-+
Os pares de letras ([a-zA-Z] podem ser usados) indicam a entrada / saída de até 52 lasers. Dentro da caixa haverá N /
espelhos. As dimensões da caixa serão 3 <= W, H <= 200. A caixa é feita de +|-
caracteres. Pode haver qualquer número de espelhos na caixa, incluindo zero.
Resultado
A saída deve corresponder à entrada, exceto que os /
caracteres podem ser movidos e / ou alterados para \
caracteres. Seu programa deve enviar uma seqüência de caixa de espelho correta para STDOUT ou um arquivo, seguindo a nova linha opcional. Se nenhum posicionamento de espelhos atender à especificação de entrada, faça a saída Impossible\n
. Exemplos de possíveis soluções:
+--G--+ +abcde+
G / | f \ \ d
| | a/ \ c
+-----+ f / //|
+-b-e-+
Exemplo de teste
Entrada:
+abcdefghijklmnopqrstuvwxyA-+
|/////////////// |
|/////////////// |
| |
+-Abcdefghijklmnopqrstuvwxya+
Exemplo de saída:
+abcdefghijklmnopqrstuvwxyA-+
|\ \|
|/ / |
|\\\\\\\\\\\\\\\\\\\\\\\\\\ |
+-Abcdefghijklmnopqrstuvwxya+
Pontuação (ATUALIZADO)
Isso é código-golfe com bônus. Você deve indicar com sua resposta quantos espelhos seu programa pode resolver (N). Sua pontuação é o tamanho do seu programa em bytes dividido por N. Isso permite que as pessoas entrem com um programa simples, mas recompensa mais programadores de ambição com um bônus.
Lacunas padrão não permitidas.
* 2^30
componente de lá tambémRespostas:
C # -
897862 bytesFoi encontrado um bug sério ao colocar espelhos em lugares que não podiam estar. Agora funciona, espero! Também jogava golfe leve, não podia deixar o loop while lá ... vergonhoso.
Programa completo, recebe entrada de STDIN, sai para STDOUT.
Foi muito divertido, ele lida bem com o problema 7 por 5 (e quando você remove um dos espelhos, tornando-o impossível), demorava cerca de 1 hora para resolver os 30 por 5.
Exemplo 7 por 5:
Versão impossível:
Algo diferente (o programa não olha para o layout do espelho original):
Solução 30 por 5:
Ele olha para cada fonte de laser, por sua vez, e cria uma rota válida para ela (se puder), e depois passa para a próxima. É uma pesquisa bem simples e aprofundada, que precisa saber para qual fonte de laser (alvo) ela está olhando, quantos espelhos ela resta para colocar, a célula atual em que está "na", a direção em que está se movendo e cada célula já foi visitado (para não colocar um espelho em algum lugar que já esteve). Os últimos 3 são usados para montar o caminho para o destino atual e redefinir quando o destino for alterado. Uma vez que todos os lasers estão conectados, ele segue em frente e preenche todas as lacunas que não precisam ser deixadas em branco (outra razão pela qual precisa saber em todos os lugares que é visitado).
Quando está construindo rotas, favorece o avanço da inserção de um espelho e, quando o faz, favorece o espelho "\" - isso é melhor visto no exemplo "algo diferente" acima, onde ignora a primeira célula abaixo da no topo da lista 'a', em seguida, preenche continuamente um "\" se ele puder encontrar uma solução com um, caso contrário, um "/" (naturalmente, se pular a primeira célula resultou na impossibilidade de encontrar uma solução, seria retroceda e tente colocar um espelho lá).
fonte
Python,
671654 bytesNão é uma solução, mas uma tentativa, leia abaixo.
Não joguei isso ao máximo, pois não estou satisfeito com a solução.
V
valida uma determinada solução percorrendo o campoF
para cada caractereC
encontrado na linha lateral. As soluções são geradas aleatoriamente. É feio, funciona para a entrada1, mas leva muito tempo para as outras entradas. Como ele tenta soluções aleatoriamente, não considero que seja uma solução real para o problema em questão; mas pode ajudar os outros.Corre:
echo "entry1.txt" | python script.py
fonte