Suddividere una griglia quadrata in parti di uguale area


17

Questa sfida si basa sul seguente di puzzle: si è data una nda ngriglia con ncellule marcate. Il tuo compito è dividere la griglia in nparti in cui ogni parte è composta esattamente da ncelle, ognuna contenente esattamente una cella contrassegnata.

Esempio

Ecco un puzzle a sinistra e la sua (unica) soluzione a destra:

puzzle soluzione

Sfida

Ti verrà data una serie di ncoordinate indicizzate zero in qualsiasi formato ragionevole.

[(0,0), (0,3), (1,0), (1,1), (2,2)]

E il tuo compito è quello di scrivere un programma che restituisca qualsiasi partizione valida (di nuovo, in qualsiasi formato ragionevole).

[
  [(0,0), (0,1), (0,2), (1,2), (1,3)],
  [(0,3), (0,4), (1,4), (2,4), (3,4)],
  [(1,0), (2,0), (3,0), (4,0), (4,1)],
  [(1,1), (2,1), (3,1), (3,2), (4,2)],
  [(2,2), (2,3), (3,3), (4,3), (4,4)]
]

Se il puzzle non ha soluzione, il programma dovrebbe indicarlo lanciando un errore o restituendo una soluzione vuota.

Esempi di input / output

[(0,0)]               => [[(0,0)]]

[(0,0), (1,1)]        => [
                          [(0,0), (1,0)], 
                          [(0,1), (1,1)]
                         ]

[(0,0), (0,1), (1,0)] => [] (no solution)

[(0,0), (0,1), (0,2)] => [
                          [(0,0), (1,0), (2,0)], 
                          [(0,1), (1,1), (2,1)],
                          [(0,2), (1,2), (2,2)],
                         ]

[(0,0), (0,2), (1,2)] => [
                          [(0,0), (1,0), (2,0)], 
                          [(0,1), (0,2), (1,1)],
                          [(1,2), (2,1), (2,2)],
                         ]

punteggio

Questo è , quindi vince il codice più corto.



@Arnauld, sembra per i puzzle di Shikaku, "l'obiettivo è dividere la griglia in pezzi rettangolari e quadrati". In questo caso, non esiste tale vincolo.
Peter Kagey,

Dispiace per la confusione. Penso che potrebbe esserci una sfida Shikaku da qualche parte nella sandbox, o forse stavo pianificando di farne uno da solo ad un certo punto - non ricordo di sicuro. Ad ogni modo, ho pensato che fosse la stessa cosa a prima vista.
Arnauld,

Perché il risultato è un array di coordinate 2D? Non capisco cosa si sta esprimendo lì ... Non può essere un array 2d dell'indice dell'array? Ad esempio la riga 3, la colonna 2 contiene una partizione con coordinate all'indice 4?
Olivier Grégoire il

Possiamo supporre che ogni area possa essere disegnata partendo dalle coordinate di riferimento, come suggerisce l'esempio? Ho appena realizzato che inconsciamente l'ho dato per scontato.
Arnauld,

Risposte:


11

JavaScript (ES7), 166 byte

fun'lSe

a=>(m=a.map(_=>[...a]),g=(n,X,Y,j=0,i)=>a[n]?a[j]?m.some((r,y)=>r.some((v,x)=>++v|(X-x)**2+(Y-y)**2-1?0:g(r[x]=n,x,y,j+1,i|x+[,y]==a[n])?1:r[x]=v)):i&&g(n+1):1)(0)&&m

Provalo online!

Come?

mN×NN

m = a.map(_ => [...a])

mNm++

gn(X,Y)jio

g = (n, X, Y, j = 0, i) => a[n] ? a[j] ? ... : i && g(n + 1) : 1

un'[n]un'[j]

gm

m.some((r, y) =>          // for each row r[] at position y in m[]:
  r.some((v, x) =>        //   for each cell of value v at position x in r[]:
    ++v |                 //     if this cell is already filled (i.e. v is numeric)
    (X - x) ** 2 +        //     or the squared Euclidean distance between
    (Y - y) ** 2 -        //     (X, Y) and (x, y)
    1 ?                   //     is not equal to 1:
      0                   //       this is an invalid target square: do nothing
    :                     //     else:
      g(                  //       do a recursive call to g:
        r[x] = n,         //         pass n unchanged and fill the cell with n
        x, y,             //         pass the coordinates of the current cell
        j + 1,            //         increment j
        i |               //         update i:
        x + [,y] == a[n]  //         set it if (x, y) = a[n]
      ) ?                 //       if the result of the call is truthy:
        1                 //         return 1
      :                   //       else:
        r[x] = v          //         reset the cell to NaN
  )                       //   end of inner map()
)                         // end of outer map()
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.