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 echo
produz 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.!.2
significa "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.&0
significa "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.