Verifique se o quebra-cabeça 15 é solucionável

9

O quebra - cabeça das quinze é peculiar, pois apenas metade dos possíveis estados de arranjo são solucionáveis. Se você virar as peças 14 e 15, não há como deslizar os blocos para que eles sejam virados para trás.

Sua tarefa é criar um programa que aceite uma lista de números inteiros no formato de sua escolha (contendo exatamente uma instância de cada um dos números de 0 a 15, com 0 sendo o espaço em branco) representando o estado de um arranjo de blocos em uma grade 4x4 e gera um único valor booleano determinando se a grade é solucionável ou não.

O código mais curto para fazer isso em qualquer idioma vence.

Joe Z.
fonte
Boa pergunta :)
Cruncher
Eu ia fazer essa pergunta, mas com um comprimento arbitrário; mas isso acrescenta muito pouco ao desafio.
Jonathan Allan

Respostas:

0

Geléia , 9 bytes

Œc>/€;TSḂ

Um link monádico que aceita uma lista dos números inteiros lidos na ordem das linhas principais alternando entre esquerda-direita e direita-esquerda, o que produz 0se for solucionável e 1se não for (para inverter isso, adicione ¬à direita do código).

Experimente online! (este exemplo é um quadro em que apenas 12 se encaixa)

Quão?

Semelhante à resposta de John Dvorak , calculamos paridades e utilizamos uma ordem de entrada semelhante a cobra para simplificar a paridade do tabuleiro de damas, embora, em vez de verificar a igualdade de paridade, somamos a contagem fora de ordem com índices diferentes de zero e testamos se isso é ímpar:

Œc>/€;TSḂ - Link: list of integers
Œc        - unordered pairs
    €     - for each:
   /      -   reduce with:
  >       -     greater than?
      T   - truthy indices (i.e. [1..16] without 1-indexed index of 0)
     ;    - concatenate
       S  - sum
        Ḃ - is odd?
Jonathan Allan
fonte
4

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.

John Dvorak
fonte
Quando você diz "o zero também alterna entre as posições pares e ímpares": ele não muda em +1, -1, +4 ou -4? Eu acho que um padrão marcado dá a cor que você precisa, mas pode ser descrito com mais precisão.
Peter Taylor
@ PeterTaylor, você está certo; desculpa. Minha edição conta como uma correção válida?
John Dvorak
Acho que sua edição aborda um problema completamente separado. A parte que citei está no último parágrafo.
Peter Taylor
"Entre posições ímpares e pares" é mais parecido com "entre quadrados pretos e brancos em um tabuleiro de xadrez".
Joe Z.