Dama: King Me?


14

Sfida:

Data una scacchiera, genera il minor numero di mosse necessarie (supponendo che il nero non si muova affatto) per re un pezzo rosso, se possibile.

Regole :

La parte rossa sarà sempre sul fondo, tuttavia i loro pezzi possono iniziare in qualsiasi fila (anche la fila del re che devono raggiungere). I pezzi neri sono fermi , il che significa che non si muovono tra i movimenti del rosso, ma vengono rimossi dal tabellone quando catturati. Nota che i pezzi possono iniziare su qualsiasi spazio sul tabellone, anche uno accanto all'altro. Questo non è il modo in cui vengono giocate le normali pedine, ma il tuo programma deve essere in grado di risolverle. (Vedi input 5) Tuttavia, le pedine devono muoversi solo in diagonale (vedi input 3). L'acquisizione all'indietro è consentita se la prima acquisizione è in avanti nella catena (vedere input 7).

Ingresso:

Una scacchiera 8x8, con spazi di bordo definiti come i seguenti personaggi (sentiti libero di usare alternative purché siano coerenti):

. - Vuoto

R - Pezzi rossi

B - Pezzi neri

Produzione:

Il minor numero di mosse richiederebbe un pezzo rosso per essere "re" inserendo la fila del re nella riga superiore del tabellone (lato nero), 0 se non sono necessarie mosse (un pezzo rosso è iniziato nella fila del re), oppure un numero negativo se è impossibile re un pezzo rosso (cioè il nero occupa tutta la sua prima fila).

Ingresso 1:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Uscita 1:

7

Ingresso 2:

. . . . . . . .
. . . . . . . .
. . . . . B . .
. . . . . . . .
. . . B . . . .
. . . . . . . .
. B . . . . . .
R . . . . . . .

Uscita 2:

2

Ingresso 3:

. B . B . B . B
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Uscita 3:

-1

Ingresso 4:

. . . . . . . R
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Uscita 4:

0

Ingresso 5:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. B . . B . . .
B . . . . B . .
. B . B . . . .
. . B . . B . .
. . . R R . . .

Uscita 5:

4

Ingresso 6:

. . . . . . . .
. . . . . . . .
. B . . . . . .
. . B . . . . .
. B . B . . . .
. . . . R . . .
. . . B . . . .
. . . . R . . .

Uscita 6:

2

Ingresso 7:

. . . . . . . .
. . . . . . . .
. . B . . . . .
. . . . . . . .
. . B . . . . .
. B . B . B . .
. . . . B . . .
. . . . . R . R

Uscita 7:

4

punteggio:

Questo è , quindi vince il codice più breve in byte.


1
Il secondo caso di test non dovrebbe essere 2, dato che puoi saltare il doppio / il triplo?
James,

Una matrice di stato di matrici di numeri interi come input è OK?
Jonathan Allan,

1
Ho aggiunto un altro testcase che dovrebbe rivelarsi difficile. Implica più salti, più pezzi e saltare all'indietro per ottenere la migliore soluzione possibile.
orlp,

1
@orlp Hm, stavo per dire che nessuno dei pezzi rossi può muoversi all'indietro poiché nessuno di loro è un re (da qui il punto della sfida), ma sembra che alcune persone giochino con regole in cui la cattura all'indietro è consentita da pezzi regnati se la prima cattura fosse avanti. Lo aggiungerò alle regole poiché non ne ero a conoscenza prima.
Yodle,

1
ooooooooh, non devi scegliere solo un pezzo rosso, possono unirsi! Ho capito
Greg Martin,

Risposte:


4

JavaScript (ES6), 354 322 byte

Accetta un array come input con:

  • 0 = quadrato vuoto
  • 1 = pezzo rosso
  • 2 = pezzo nero

Restituisce il numero ottimale di mosse o 99 se non c'è soluzione.

È molto veloce ma potrebbe essere giocato a golf molto di più.

F=(b,n=0,C=-1,i)=>b.map((v,f,X,T,x=f&7,y=f>>3)=>v-1||(y&&n<m?[-9,-7,7,9].map(d=>(N=c=X=-1,r=(d&7)<2,T=(t=f+d)>=0&t<64&&(x||r)&&(x<7||!r)?(!b[t]&d<0)?t:b[t]&1?N:b[t]&2&&(d<0&y>1|d>0&C==f)?(X=t,x>1||r)&&(x<6|!r)&&!b[t+=d]?c=t:N:N:N)+1&&(b[f]=b[X]=0,b[T]=1,F(b,n+!(C==f&c>N),c,1),b[f]=1,b[X]=2,b[T]=0)):m=n<m?n:m),m=i?m:99)|m

var test = [
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,2,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,2,0,2,0,2,0,2,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,1,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,2,0,0,0,
    2,0,0,0,0,2,0,0,
    0,2,0,2,0,0,0,0,
    0,0,2,0,0,2,0,0,
    0,0,0,1,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,2,0,0,
    0,0,0,0,2,0,0,0,
    0,0,0,0,0,1,0,1
  ]
];

test.forEach((b, n) => {
  console.log("Test #" + (n + 1) + " : " + F(b));
});


99 probabilmente va bene, non riesco a immaginare una soluzione reale che esegua 99 mosse su una tavola 8x8. Bel lavoro!
Yodle,
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.