traintracks
Um solucionador para o quebra-cabeça Train Tracks escrito em JavaScript
No Saturday Times (no Reino Unido), há um quebra-cabeça chamado Train Tracks.
É uma grade de quadrados 8x8. Cada linha e coluna possui um número que indica quantas peças vão naquela linha ou coluna.
Há também um marcador para A
e B
no início e no final da pista. Possivelmente já existam uma ou mais peças na grade.
Seu trabalho é desenhar a pista usando apenas peças de canto retas ou de 90 graus de A
a B
para que o número correto de peças esteja presente em cada linha e coluna da grade.
Aqui está um exemplo de quebra-cabeça:
Codificamos o quebra-cabeça da seguinte maneira: <A><B>-<cols>-<rows>-<pieces>
.
O quebra-cabeça acima é 54-14134544-54234341-48EW.53NE
A
e B
são os números de 1 a 8 que indicam a distância ao longo da grade (a partir do canto inferior esquerdo) do início (a que distância acima) e do fim (a que distância à direita). Neste exemplo, A
é 5
e B
é 4
cols
é uma lista de 8 números de 1 a 8 indicando a restrição na coluna. os números são lidos da esquerda para a direita (ao longo da parte superior do quebra-cabeça, conforme ilustrado).
rows
é o mesmo para as linhas, desta vez de cima para baixo, facilitando o acompanhamento do quebra-cabeça real.
pieces
são a lista de peças iniciais (sem contar o início e o fim) separadas por um ponto .
e são <rol><col><type>
onde type é a forma como a peça aponta. Os tipos válidos são NS
(vertical) EW
(horizontal) NE
em forma de L, NW
para trás-L, SE
de cabeça para baixo-L, SW
180 graus girado L.
Isso é muito mais fácil de digitar do que parece. Mas se isso fosse usado em um site, uma interface de usuário mais intuitiva poderia criar o quebra-cabeça e gerar a codificação.
De qualquer forma, assim que tivermos a codificação, podemos chamar a ferramenta traintracks
:
$ traintracks 54-14134544-54234341-48EW.53NE
Puzzle: 54-14343245-14134544-48EW.53NE
1 4 1 3 4 5 4 4 1 4 1 3 4 5 4 4
┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐
8 │ │ │ │━│ │ │ │ │ 5 8 │ │┏│━│━│━│┓│ │ │ 5
├─┼─┼─┼─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┼─┼─┼─┤
7 │ │ │ │ │ │ │ │ │ 4 7 │ │┃│ │ │ │┗│━│┓│ 4
├─┼─┼─┼─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┼─┼─┼─┤
6 │ │ │ │ │ │ │ │ │ 2 6 │ │┃│ │ │ │ │ │┃│ 2
├─┼─┼─┼─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┼─┼─┼─┤
A │━│ │ │ │ │ │ │ │ 3 A │━│┛│ │ │ │ │ │┃│ 3
├─┼─┼─┼─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┼─┼─┼─┤
4 │ │ │ │ │ │ │ │ │ 4 4 │ │ │ │ │┏│━│━│┛│ 4
├─┼─┼─┼─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┼─┼─┼─┤
3 │ │ │ │ │┗│ │ │ │ 3 3 │ │ │ │ │┗│━│┓│ │ 3
├─┼─┼─┼─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┼─┼─┼─┤
2 │ │ │ │ │ │ │ │ │ 4 2 │ │ │ │┏│━│━│┛│ │ 4
├─┼─┼─┼─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┼─┼─┼─┤
1 │ │ │ │┃│ │ │ │ │ 1 1 │ │ │ │┃│ │ │ │ │ 1
└─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘
1 2 3 B 5 6 7 8 1 2 3 B 5 6 7 8
Solved: true - Steps: 323
E você pode observar o funcionamento do algoritmo adicionando --animate
. Veja o vídeo do asciinema:
Eu vi este AR Sudoku Solver. Já houve arte anterior na área, mas esta foi a primeira que vi. De qualquer forma, gosto deste pequeno quebra-cabeça e me perguntei se a) eu poderia fazer o mesmo eb) torná-lo totalmente baseado na web.
Portanto, o roteiro é: