Cerco Leapers


19

Di recente ho ottenuto una scacchiera irregolare davvero strana. Le sue piazze sono ovunque e nemmeno tutte collegate. Almeno sono ancora disposti su una griglia regolare. Voglio adattare le regole degli scacchi per poter giocare sul tabellone, ma per cominciare, ho bisogno di un pezzo che possa effettivamente andare ovunque sul tabellone, e sembra che un salto sia la mia scommessa migliore per quello.

I Leapers sono la generalizzazione degli scacchi fatati dei cavalieri. I Leaper sono parametrizzati da due numeri interi m e n e possono spostare m quadrati in una direzione e poi altri n quadrati in entrambe le direzioni perpendicolari. Per il cavaliere standard, abbiamo (m, n) = (2, 1) . L'intera mossa è considerata un singolo salto in modo tale che nessuno dei quadrati sulla strada verso il bersaglio deve essere vuoto o addirittura esistere.

La sfida

Ti viene data una "scacchiera" sotto forma di un elenco di coordinate intere 2D positive che rappresentano i quadrati che fanno parte della scacchiera. Il tuo compito è quello di trovare un saltatore che, con abbastanza mosse, possa raggiungere qualsiasi quadrato sul tabellone.

Diamo un'occhiata ad alcuni esempi. La scacchiera standard utilizza una griglia regolare di 8x8 quadrati (nota che per questa sfida non distinguiamo tra quadrati bianchi e neri):

########
########
########
########
########
########
########
########

Il cavaliere standard può raggiungere tutti questi, quindi (2, 1)sarebbe un risultato valido. Tuttavia, (1, 1)ad esempio, non sarebbe valido, dal momento che un pezzo del genere può raggiungere solo la metà dei quadrati indipendentemente da dove inizia. (1, 0)d'altra parte sarebbe anche un output valido, poiché tutti i quadrati sono collegati ortogonalmente.

Ora se abbiamo una tavola irregolare come:

#   #
 # # #
  # # #
 # #
    #

Quindi le possibili soluzioni sono (1, 1)e (3, 1). Possiamo anche avere una scheda con regioni completamente disconnesse come:

#### ####
#### ####
#### ####
#### ####

Il cavaliere standard (2, 1)può ancora raggiungere tutti i quadrati qui, che in realtà è l'unica soluzione.

E infine, la seguente semplice scheda non può essere completamente raggiunta da nessun leaper:

#
 ##

Si noti che il formato di input non sarà come una rappresentazione ASCII ma un elenco di coordinate. Ad esempio il secondo esempio sopra potrebbe essere dato come:

[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]]

Regole

È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).

Le coordinate di input possono essere prese in qualsiasi formato di elenco conveniente (elenco piatto, elenco di coppie, elenco di numeri interi complessi, stringa con separatori coerenti, ecc.).

L'output dovrebbe essere i due numeri interi m e n che identificano il leaper se esiste una soluzione (come due numeri interi separati, un elenco, una stringa con delimitatore non numerico, ecc.). Se non esiste una soluzione, è possibile generare un valore coerente che non può essere un leaper valido. Ciò include la coppia di numeri interi (0, 0)nel tuo formato normale, nonché qualsiasi cosa che non sia una coppia di numeri interi non negativi.

Il tuo programma deve gestire uno qualsiasi dei casi di test entro un minuto . Questa è una restrizione un po 'confusa, ma usa il buon senso: se ci vogliono 2 minuti sul tuo computer, penso che possiamo supporre che potrebbe funzionare entro 1 su quello di qualcun altro, ma se ci vogliono 20 è meno probabile. Non dovrebbe essere difficile risolvere ogni caso di test in pochi secondi, quindi questa regola agisce solo per escludere l'ingenua forza bruta.

Si applicano le regole standard del .

Casi test

Ogni caso di test ha la forma board => all valid leapers. Ricorda che devi solo produrre uno di questi. Se l'elenco dei jumpers è vuoto, assicurarsi di restituire qualcosa che non sia un leaper valido.

Examples above:
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7], [7, 8], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8]] => [[0, 1], [1, 2], [1, 4], [2, 3], [3, 4]]
[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]] => [[1, 1], [1, 3]]
[[1, 1], [2, 2], [3, 2]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => [[1, 2]]

Square boards:
[[1, 1], [1, 2], [2, 1], [2, 2]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [2, 3]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]] => [[0, 1], [1, 2], [2, 3]]

Miscellaneous:
[[1, 1], [2, 1]] => [[0, 1]]
[[1, 1], [1, 2]] => [[0, 1]]
[[1, 1], [12, 35]] => [[11, 34]]
[[1, 1], [1, 2], [2, 1], [2, 2], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 5], [3, 6], [4, 1], [4, 2], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [1, 4]]
[[2, 2], [2, 4], [2, 6], [2, 8], [4, 2], [4, 4], [4, 6], [4, 8], [6, 2], [6, 4], [6, 6], [6, 8], [8, 2], [8, 4], [8, 6], [8, 8]] => [[0, 2], [2, 4]]

Random boards:
[[1, 5], [1, 9], [2, 6], [2, 8], [2, 10], [2, 12], [3, 5], [3, 7], [3, 9], [3, 11], [3, 13], [4, 2], [4, 4], [4, 6], [4, 8], [4, 14], [5, 1], [5, 3], [5, 5], [5, 7], [6, 2], [6, 4], [7, 1], [8, 2]] => [[1, 1], [1, 3]]
[[1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 6], [3, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 3], [5, 4], [5, 6]] => [[0, 1], [1, 2]]
[[1, 8], [2, 6], [2, 10], [3, 3], [3, 4], [3, 8], [4, 1], [4, 11], [5, 3], [5, 9], [6, 12], [8, 11], [10, 10], [11, 12], [12, 6], [12, 8], [13, 6], [13, 8], [13, 10], [13, 11], [14, 5], [14, 7], [14, 8], [14, 13], [14, 14], [15, 7], [15, 9], [15, 11], [15, 12], [16, 6], [16, 7], [16, 9], [16, 13], [16, 14], [17, 10], [17, 12], [18, 8], [18, 12], [20, 9], [21, 11], [22, 13], [23, 10], [23, 11], [23, 15], [24, 12]] => [[1, 2]]
[[1, 17], [1, 21], [3, 11], [3, 15], [3, 19], [3, 23], [5, 13], [5, 21], [7, 11], [7, 15], [7, 19], [9, 1], [9, 13], [9, 17], [11, 3], [11, 7], [11, 15], [11, 19], [13, 5], [13, 9], [13, 13], [13, 17], [13, 21], [15, 11], [15, 15], [15, 19], [17, 13], [17, 17]] => [[2, 2], [2, 6], [2, 10]]
[[1, 3], [2, 4], [2, 5], [3, 6], [4, 1], [5, 3], [5, 6], [5, 7], [6, 12], [6, 14], [6, 21], [7, 9], [7, 19], [8, 9], [8, 15], [8, 17], [8, 18], [8, 24], [9, 12], [9, 19], [10, 12], [10, 14], [10, 17], [10, 21], [11, 22], [12, 15], [12, 17], [12, 24], [13, 16], [14, 20], [14, 21], [14, 26], [15, 13], [15, 19], [16, 18], [16, 23], [17, 16], [17, 24]] => [[2, 3]]
[[1, 11], [3, 13], [4, 10], [6, 14], [8, 12], [9, 9], [9, 15], [12, 8], [13, 5], [13, 19], [13, 21], [14, 8], [15, 1], [15, 17], [16, 4], [16, 14], [16, 18], [16, 20], [17, 21], [18, 2], [18, 16], [18, 18], [19, 9], [19, 13], [19, 15], [20, 12], [21, 1], [21, 17], [22, 4], [22, 10], [23, 7]] => [[1, 3]]
[[1, 39], [6, 37], [8, 32], [10, 27], [11, 31], [11, 35], [12, 22], [16, 21], [16, 29], [16, 33], [18, 34], [21, 3], [21, 9], [21, 19], [23, 8], [23, 14], [23, 22], [23, 24], [23, 36], [24, 6], [25, 13], [25, 17], [26, 1], [26, 11], [28, 6], [28, 20], [28, 26], [28, 30], [28, 34], [30, 11], [30, 15], [30, 21], [32, 6], [33, 28], [33, 32], [35, 13], [35, 23]] => [[2, 5]]

Come caso speciale, si noti che per una scheda costituita da una sola cella, qualsiasi leaper funziona, ma l'output deve corrispondere a un leaper reale, quindi [0, 0]non è un output valido.


Domanda veloce. Come sta un cavaliere (2,1)? Correggimi se sbaglio, ma sono abbastanza sicuro che i cavalieri possano spostare 3 quadrati in una direzione e quindi 1 quadrato in qualsiasi direzione perpendicolare alla precedente, quindi dovrebbe essere invece (3,1).
R. Kap


@DLosc Ok, wow. Immagino di esserlo. Grazie per quello!
R. Kap,

Possiamo produrre tutti i leaper validi in un elenco? Se lo facciamo, possiamo produrre leapers equivalenti come [[1, 0], [0, 1]]?
FryAmTheEggman,

@FryAmTheEggman Solo uno di questi, per favore.
Martin Ender,

Risposte:


12

Pyth, 41 35

hfqQu@+G+VM*s_BM*F_BMTGQ]hQ)maVhQdt

Esce in caso di errore se non ci sono jumpers validi, fornendo la stringa vuota se STDERR viene ignorato.

Provalo qui o esegui una Test Suite

6 byte salvati grazie a isaacg ! Fondamentalmente trova tutti i candidati leaper selezionando ogni leaper valido dalla prima tessera all'altra. Quindi, per ognuno di questi, esegue tutte e otto le configurazioni degli [x, y]offset che il leaper potrebbe prendere. Quindi trova tutte le mosse a partire dalla prima tessera che segue dopo la mossa e scarta quelle che non sono nell'input. Continua fino a quando il risultato non cambia. Se questo elenco finale è uguale all'input, il leaper era valido.

La scacchiera standard ha impiegato più tempo quando stavo testando, ci sono voluti circa 3 secondi sul mio computer non molto impressionante.

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.