J, 28 caracteres
((C.!.2=_1^i.&0)&.".&.stdin''
A ordem de entrada é principal com linhas lidas alternadamente da esquerda para a direita e da direita para a esquerda em um único caminho na tabela. Assume que o zero pertence ao canto superior esquerdo.
Uso no Windows:
<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs
Explicação:
<nul set /p=é usado para impedir uma nova linha na entrada, que echoproduz aquilo ".que não gosta. Claro, o Unix suporta echo /n.
v&.".&.stdin''lê "v em análise em stdin" significa "entrada", analise a entrada e, em seguida, v, desfaça a análise (= formato) e desfaça a entrada (= saída) ". 1!:1]3é um caractere mais curto, mas não possui um inverso definido.
C.!.2significa "paridade de permutação". Retorna 1(paridade par) ou _1(paridade ímpar). Isso é,_1^inversions
_1^i.&0 significa "-1 à potência do índice de 0".
- assim,
C.!.2=_1^i.&0significa "a paridade de permutação é igual à paridade de posição do furo?"
Isso funciona para uma placa 4x4, mas se a posição final desejada for maior da linha da esquerda para a direita, a permutação para a posição resolvida tem um número ímpar de inversões e, portanto, uma paridade ímpar. Além disso, a paridade é revertida (para qualquer ordem de entrada) quando a posição desejada do furo se move da parte superior esquerda para a parte inferior direita. Nos dois casos, a correção é de um caractere: add -after =para reverter a paridade esperada.
Prova de correção:
Após cada movimento, o zero troca uma posição com algum número, invertendo a paridade de permutação. O zero também alterna entre as posições quadriculado em branco e preto, indicadas por posições ímpares e pares na ordem de entrada. Portanto, essa condição é necessária. Também é suficiente pelo argumento da contagem: é do conhecimento geral que exatamente metade das posições é solucionável. Essa condição filtra exatamente metade das posições possíveis.