Esse desafio é completamente inspirado no All Light , desenvolvido pela Soulgit Games.
Desafio
Você é eletricista e é seu trabalho conectar todas as luzes à bateria.
- As luzes e a bateria estão dispostas em uma grade.
- Você pode conectar uma luz ou bateria à luz ou bateria mais próxima ao norte, sul, leste e oeste.
- A bateria pode ter qualquer número de conexões.
- Cada luz especifica quantas conexões são necessárias. Você deve fazer exatamente tantas conexões com essa luz.
- Você pode criar conexões únicas ou duplas entre duas luzes (ou luz e bateria).
- Os fios não podem se cruzar.
- Deve haver um caminho de cada luz para a bateria.
- É garantida a existência de pelo menos uma solução válida.
Dada a posição da bateria e cada luz, e o número de conexões que cada luz requer, produza as conexões entre elas que admitem essas propriedades.
Condição da vitória
Isso é código-golfe , então o código mais curto em cada idioma vence.
Casos de teste
A E / S é flexível, como de costume.
Para entrada, usarei uma matriz 2d do tamanho da grade que armazena números inteiros positivos para luzes, zeros para espaços em branco e -1 para a bateria. Outra boa opção pode ser uma lista de luzes, em que uma luz é uma tupla que contém a posição da luz e o número de conexões necessárias.
Para saída, usarei uma lista de conexões, onde uma conexão é uma tupla contendo a posição inicial e a posição final. Se uma conexão dobrar, terei 2 deles na lista (outra opção é incluir esse parâmetro na tupla). Outra boa opção pode ser algum tipo de layout de grade.
Se você estiver usando um sistema de coordenadas, poderá especificar o índice inicial e de onde é o índice. Meus exemplos serão indexados em 0 e usarão (0, 0) como o canto superior esquerdo (linha, coluna). (Estou usando {} simplesmente para introduzir outro tipo de delimitador, para facilitar a leitura, não porque sejam conjuntos.)
Aqui está uma visão gráfica dos casos de teste: Testes 1-12
Teste 1:
[-1 | 0 | 1 ] => [{(0, 0), (0, 2)}]
Teste 2:
[-1 | 0 | 2 ] => [{(0, 0), (0, 2)}, {(0, 0), (0, 2)}]
Teste 3:
[-1 ]
[ 0 ] => [{(0, 0), (2, 0)), ((0, 0), (2, 0)}]
[ 2 ]
Teste 4:
[ 1 | 0 |-1 | 0 | 2 ] => [{(0, 0), (0, 2)}, {(0, 2), (0, 4)}, {(0, 2), (0, 4)}]
Teste 5:
[ 2 ]
[ 0 ]
[-1 ] => [{(0, 0), (2, 0)}, {(0, 0), (2, 0)}, {(2, 0), (4, 0)}]
[ 0 ]
[ 1 ]
Teste 6:
[ 1 | 0 | 0 ]
[ 0 | 0 | 0 ] => [{(0, 0), (2, 0)}, {(2, 0), (2, 2)}]
[ 2 | 0 |-1 ]
Teste 7:
[ 4 | 0 | 0 |-1 ]
[ 0 | 0 | 0 | 0 ] => [{(0, 0), (0, 3)}, {(0, 0), (0, 3)},
[ 2 | 0 | 0 | 0 ] {(0, 0), (3, 0)}, {(0, 0), (3, 0)}]
Teste 8:
[ 2 | 0 |-1 | 0 | 2 ] [{(0, 0), (0, 2)}, {(0, 0), (0, 2)},
[ 0 | 0 | 0 | 0 | 0 ] => {(0, 2), (0, 4)}, {(0, 2), (0, 4)},
[ 0 | 0 | 1 | 0 | 0 ] {(0, 2), (2, 2)}]
Teste 9:
[ 0 | 0 | 2 | 0 | 0 ]
[ 0 | 0 | 0 | 0 | 0 ]
[ 1 | 0 |-1 | 0 | 1 ] => [{(0, 2), (2, 2)}, {(0, 2), (2, 2)}, {(2, 0), (2, 2)},
[ 0 | 0 | 0 | 0 | 0 ] {(4, 2), (2, 2)}, {(2, 4), (2, 2)}, {(2, 4), (2, 2)}]
[ 0 | 0 | 2 | 0 | 0 ]
Teste 10:
[-1 | 2 | 3 | 2 ] => [{(0, 0), (0, 3)}, {(0, 0), (0, 3)},
{(0, 0), (0, 3)}, {(0, 0), (0, 3)}]
Teste 11:
[-1 | 0 | 0 | 0 ]
[ 3 | 0 | 0 | 0 ]
[ 3 | 0 | 0 | 3 ] => [{(0, 0), (1, 0)}, {(1, 0), (2, 0)}, {(1, 0), (2, 0)},
[ 0 | 0 | 0 | 0 ] {(2, 0), (2, 3)}, {(2, 3), (4, 3)}, {(2, 3), (4, 3)}]
[ 0 | 0 | 0 | 2 ]
Teste 12:
[ 2 | 0 | 0 ] [{(0, 0), (1, 0)}, {(0, 0), (1, 0)}, {(1, 0), (1, 1)},
[ 3 |-1 | 0 ] => {(1, 1), (2, 1)}, {(1, 1), (2, 1)}, {(2, 0), (2, 1)},
[ 2 | 5 | 1 ] {(2, 0), (2, 1)}, {(2, 1), (2, 2)}]
[1 | -1] [1 1]
.