Controlla se il puzzle 15 è risolvibile


9

Il quindici puzzle è peculiare in quanto solo la metà dei possibili stati di accordo sono risolvibili. Se capovolgi le tessere 14 e 15, non è possibile far scorrere i blocchi in modo tale che vengano capovolti.

Il tuo compito è costruire un programma che accetti un elenco di numeri interi nel formato che preferisci (contenente esattamente un'istanza di ciascuno dei numeri da 0 a 15, con 0 come spazio vuoto) che rappresenta lo stato di una disposizione di riquadri in una griglia 4x4 e genera un singolo valore booleano che determina se la griglia è risolvibile o meno.

Vince il codice più breve per farlo in qualsiasi lingua.


Bella domanda :)
Cruncher,

Stavo per porre questa domanda, ma con una lunghezza laterale arbitraria; ma questo aggiunge molto poco alla sfida.
Jonathan Allan,

Risposte:


0

Gelatina , 9 byte

Œc>/€;TSḂ

Un collegamento monadico che accetta un elenco di numeri interi che leggono in ordine di riga maggiore alternando tra sinistra-destra e destra-sinistra che produce 0se risolvibile e in 1caso contrario (per invertire questo aggiungere ¬a destra del codice).

Provalo online! (questo esempio è una scheda in cui 12 deve solo scorrere in posizione)

Come?

Simile alla risposta di John Dvorak, calcoliamo le parità e utilizziamo un ordine di input simile a un serpente per semplificare la parità della scacchiera, anche se invece di verificare l'uguaglianza di parità sommiamo il conteggio fuori ordine con gli indici diversi da zero e testiamo se è dispari:

Œ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?

4

J, 28 caratteri

((C.!.2=_1^i.&0)&.".&.stdin''

L'ordine di input è maggiore di riga con le righe lette alternativamente da sinistra a destra e da destra a sinistra in un singolo percorso attraverso la tabella. Presuppone che lo zero appartenga all'angolo in alto a sinistra.

Utilizzo su Windows:

<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs

Spiegazione:

  • <nul set /p=viene utilizzato per impedire una nuova riga nell'input, che echoproduce che ".non gli piace. Naturalmente, Unix supporta echo /n.
  • v&.".&.stdin''legge "v sotto analisi sotto stdin" che significa "input", quindi analizza l'input, quindi esegue v, quindi annulla l'analisi (= formato), quindi annulla input (= output) ". 1!:1]3è più corto di un carattere, ma non ha un inverso definito.
  • C.!.2significa "parità di permutazione". Restituisce 1(parità pari) o _1(parità dispari). Questo è,_1^inversions
  • _1^i.&0 significa "-1 alla potenza dell'indice di 0".
  • quindi, C.!.2=_1^i.&0significa "la parità di permutazione è uguale alla parità di posizione del foro?"

Questo funziona per una scheda 4x4, ma se la posizione finale desiderata è la riga maggiore da sinistra a destra, la permutazione per la posizione risolta ha un numero dispari di inversioni e quindi una parità dispari. Inoltre, la parità viene invertita (per qualsiasi ordine di input) quando la posizione del foro desiderata si sposta da sinistra in alto a destra in basso. In entrambi i casi, la correzione è un carattere: aggiungi -dopo =per invertire la parità prevista.

Prova di correttezza:

Dopo ogni mossa, lo zero scambia una posizione con un certo numero, lanciando la parità di permutazione. Lo zero si alterna anche tra le posizioni della scacchiera bianca e nera, indicate da posizioni dispari e pari nell'ordine di input. Pertanto, questa condizione è necessaria. È anche sufficiente per l'argomento del conteggio: è risaputo che esattamente la metà delle posizioni è risolvibile. Questa condizione filtra esattamente la metà delle posizioni possibili.


Quando dici "lo zero si alterna anche tra posizioni pari e dispari": non cambia di +1, -1, +4 o -4? Penso che un motivo a quadri dia la colorazione di cui hai bisogno, ma potrebbe essere descritto in modo più accurato.
Peter Taylor,

@PeterTaylor hai ragione; scusa. La mia modifica è considerata una correzione valida?
John Dvorak,

Penso che la tua modifica risolva un problema completamente separato. Il bit che ho citato è nell'ultimo paragrafo.
Peter Taylor,

"Tra posizioni dispari e pari" è più simile a "tra quadrati bianchi e neri su una scacchiera".
Joe Z.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.