Visão geral
Pérolas (ou Masyu) é um jogo de lógica jogado em uma grade. Há pérolas em preto e branco colocadas na grade. O objetivo é formar um loop fechado único que viaja através de cada pérola usando apenas segmentos de linha reta e ângulos retos.
Existem algumas regras que governam como o loop interage com as pérolas:
- Pérolas brancas devem ser percorridas diretamente , mas o loop deve girar na célula anterior e / ou na próxima célula em seu caminho.
- Pérolas negras deve ser virou em cima, mas o loop deve viajar em linha reta através dos próximos e células anteriores em seu caminho.
- O loop não deve cruzar ou se cruzar. Todas as células possuem exatamente zero ou duas entradas / saídas de loop.
Um exemplo de quebra-cabeça da Wikipedia (e sua solução):
Seu objetivo é resolver um determinado quebra-cabeça. Se houver várias soluções possíveis, não importa qual você fornecer.
Entrada
A entrada será uma grade quadrada não resolvida . O exemplo mostrado acima ficaria assim:
..w.w.....
....w...b.
..b.b.w...
...w..w...
b....w...w
..w....w..
..b...w...
w...b....w
......ww..
..b......b
w
é uma pérola branca, b
é uma pérola negra e .
é uma célula vazia.
Suponha que a entrada seja válida. Isso significa que é bem formado e pelo menos uma solução é possível. Todos os quebra-cabeças válidos são pelo menos 3x3 e contêm pelo menos uma pérola.
Resultado
Saída é uma sequência de coordenadas que representam o caminho. O canto superior esquerdo da grade é 0 0
, superior direito n-1 0
, onde n é a largura da grade.
Um caminho é simplesmente uma série de coordenadas ordenadas:
x1 y1 x2 y2 x3 y3 ...
Presume-se que o caminho esteja fechado; portanto, não é necessário repetir a primeira coordenada no final, mas não há penalidade por isso.
A saída deve consistir em pelo menos todos os cantos do caminho. Você não precisa produzir todas as células no caminho se não houver uma volta. Por exemplo, a saída do exemplo pode começar com:
1 0 5 0 5 1 ...
ou
1 0 2 0 3 0 4 0 5 0 5 1 ...
A saída não deve conter nenhuma célula que não esteja no caminho. Você pode iniciar em qualquer célula do caminho.
Snippet
Aqui está um trecho que você pode usar para visualizar sua solução. Basta colar na grade em que você está trabalhando e no caminho que você produz. Estou ciente de que é doloroso olhar para o meu código, então sugiro que não;)
Casos de teste
Esses casos de teste mostram uma saída possível para cada entrada (exceto a última, que é mostrada sem solução). Pode haver outros caminhos válidos, você pode ir no sentido horário ou no sentido horário ou iniciar em um ponto diferente etc. As soluções devem ser capazes de resolver os casos de teste em segundos / minutos / horas, não em dias / semanas / éons.
...
w..
..b
0 0 1 0 2 0 2 1 2 2 1 2 0 2 0 1
.wb..b
......
..b...
w.ww..
......
b....b
0 0 2 0 2 2 4 2 4 1 3 1 3 0 5 0 5 5 3 5 3 4 4 4 4 3 1 3 1 4 2 4 2 5 0 5 0 2 1 2 1 1 0 1
.....w.b.w..
ww..b...b...
.w.....b....
...wbww..b.b
....b.......
w.w.........
..w......b.b
.....bb.....
.....b.....w
w.ww..b.....
...w......w.
b..w.....b..
fonte
Respostas:
C, 590
640 760 880 963 1018A força bruta é bastante rápida para isso. O teste 12x12 é executado em 10ms. Sabendo que poderia optar por algum idioma mais apropriado para o golfe.
Não presumo que o tabuleiro seja quadrado, pois os quebra-cabeças maiores tendem a não ser quadrados.
A
W
definição define o limite nas dimensões da placa. O limite real é menor,W - 2
pois uso linhas extras para bordas para evitar verificações de limites.Teste- me .
Aqui está um caso de teste mais desafiador:
Tive sorte: meu código encontra a solução bem cedo na execução (<5min), mas a pesquisa completa leva muito mais tempo (67min).
fonte
Python - 1669
Ainda muito longo, mas rápido o suficiente para executar o último exemplo em menos de um segundo no meu computador. Provavelmente é possível diminuir o custo da velocidade, mas por enquanto é praticamente equivalente ao código não-bloqueado.
Exemplo de saída para o último caso de teste:
Código:
Ungolfed:
fonte
Lua,
830810765752739729710Executa board1 e board2 muito bem, mas leva um tempo a bordo3.
Ele poderia economizar 9 bytes, produzindo todos os caminhos em vez do primeiro ...
fonte