Questa sfida riguarda la conversione di labirinti 2D in labirinti 1D.
Panoramica
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | |A| | B| A B A -- D
+ + + + +-+-+ + + + + +-+-+ \ | C -- D
| | | | | | | | \ | D -- E
+-+-+ +-+-+ + +-+-+ +-+-+ + \ | E -- F
| | |C D E F| C---D-E---F E -- G
+-+-+-+ +-+ + +-+-+-+ +-+ + | | B -- F
| | | | G | | .---G | F -- J
+ +-+-+-+ + + + +-+-+-+ + + .' / | G -- H
| | | | |H|I |J| H I-' J G -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 1 Figure 2 Figure 3
Ai fini di questa sfida, un labirinto 2D tradizionale è un labirinto rettangolare formato da punti reticolari in cui sono presenti tutti i seguenti elementi:
- È chiuso (il bordo esterno è collegato da pareti).
- Tutti i punti reticolari sono collegati alle pareti
- È collegato (per ogni due spazi X e Y c'è un percorso tra di loro)
- È aciclico (non ci sono percorsi da qualsiasi spazio da X a X senza backtracking)
La Figura 1 mostra un labirinto 2D tradizionale. Questi labirinti hanno tre aree di interesse:
- Strade senza uscita : luoghi da cui esiste un solo percorso disponibile
- Corridoi : luoghi da cui sono disponibili due percorsi
- Punti decisionali : luoghi da cui sono disponibili tre o quattro percorsi
Per ogni labirinto di questo tipo, è possibile creare un grafico in cui i vicoli ciechi e i punti di decisione sono nodi e c'è un bordo tra ogni due nodi collegati da un percorso lungo un corridoio. La Figura 2 mostra lo stesso labirinto con tali nodi etichettati e la Figura 3 il grafico del labirinto (in notazione con punti ASCII e Graphviz).
Labirinti 1D
I labirinti 1D incorporano punti di curvatura, che vengono in coppia, e sono identificati usando una lettera (in entrambi i casi). La Figura 4 mostra un labirinto 1D di esempio. Questo è altrimenti identico a un labirinto 2D con un'altezza di 1, come mostrato nella Figura 5. Notare in particolare nella Figura 5 le posizioni dei punti reticolari contrassegnate da +
, che si alternano da sinistra a destra; nel labirinto 1D, ogni altro personaggio che inizia con la parete più a sinistra è anche un punto reticolare.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| D| D E|G E F| F | G | | D| D E|G E F| F | G |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4 Figure 5
Le regole per navigare in questo labirinto sono le seguenti. Ogni mossa può essere rappresentata come avanti ( >
) o indietro ( <
). Avanti e indietro qui di default hanno lo stesso significato della nostra consapevolezza spaziale intuitiva; avanti va immediatamente nella posizione a destra e indietro immediatamente a sinistra.
I punti di curvatura rappresentano posizioni che scambiano asimmetricamente la connessione con i vicini. Se vieni da un vicino a un punto di curvatura, la posizione dei due punti di curvatura viene scambiata; se provieni da un punto di curvatura a un vicino, questi non vengono scambiati. Ad esempio, nella Figura 6, spostarsi all'indietro da 1 ti porta a 2 (poiché 1 è il vicino di G, e ci stiamo spostando dal vicino, i punti 2 e @ vengono scambiati). Andare avanti da 2 (punto di curvatura G) ti porta a 3 (qui, stiamo iniziando da un punto di curvatura, quindi non c'è scambio). Allo stesso modo, spostarsi indietro da 3 ti porta a @.
54 2367 89^ @1
| D| D E|G E F| F | G |
Y X
Figure 6
La Figura 6 mostra anche un esempio di navigazione da X a Y, usando la sequenza di mosse <<>><>>>>>
. Queste mosse portano ai punti etichettati 123456789^
rispettivamente, in quell'ordine. Sentiti libero di esplorarlo tu stesso usando lo snippet di codice nella sezione successiva.
Conversione da 2D a 1D
Dato un labirinto 1D, si può creare un grafico in cui ogni nodo è una strada senza uscita o una coppia di punti di curvatura, e esistono dei bordi tra due nodi collegati collegati lungo un corridoio. Questo grafico ci consente di confrontare labirinti 1D e 2D.
Ad esempio, il labirinto 1D nella Figura 4 è lo stesso labirinto nella Figura 1. Per capire perché, la Figura 7 aggiunge etichette ai vicoli ciechi. Usando quelle etichette per costruire un grafico, il grafico di Figura 7 è semplicemente di nuovo Figura 3. La Figura 8 mostra una panoramica della costruzione di questo grafico.
| D| D E|G E F| F | G |
A C B J H I
Figure 7
| D| D E|G E F| F | G |
+ + + + + + + + + + + + + + + <- lattice points
|A |C | |B J|H I| <- dead ends
|A D|C D E|G E F|B F J|H G I| <- all nodes (dead ends+warp points); i.e.:
"where each end is either a dead end
or a warp point pair"; note that each
pair of warp points is the same node.
|A-D|C-D-E|G-E-F|B-F-J|H-G-I| <- corridors; note each is a connection, since
1 2 3 4 5 6 7 8 9 "edges exist between any two nodes
connected along a corridor"
graph { graph {
A -- D // 1 <----> A -- D
C -- D // 2 <----> C -- D
D -- E // 3 <----> D -- E
G -- E // 4 <----> E -- G
E -- F // 5 <----> E -- F
B -- F // 6 <----> B -- F
F -- J // 7 <----> F -- J
H -- G // 8 <----> G -- H
G -- I // 9 <----> G -- I
} ^ }
Built from | From Figure 3
1D maze `-> isomorphic mappings
Figure 8
(Si noti che le etichette e il layout di ciascun grafico sono stati scelti artificialmente per essere allineati a scopo illustrativo; in generale si tratta di un problema di isomorfismo del grafico ).
Il seguente frammento viene fornito per aiutare a visualizzare la meccanica del labirinto 1D e la connessione tra il labirinto 1D, il grafico di equivalenza e il labirinto 2D.
Mentre navighi nel labirinto 1D in questo frammento, vengono evidenziati gli ultimi due nodi che tocchi. Gli stessi nodi sono evidenziati allo stesso modo nel grafico di equivalenza e nel labirinto 2D.
In generale, per qualsiasi labirinto 2D tradizionale è possibile creare un labirinto 1D equivalente di questo tipo. Un esempio leggermente più complesso è la Figura 9:
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | | |A| | |B| A B A -- D
+ + + + + + + + + + + + + + \ / C -- D
| | | | | | | | | | \ / D -- E
+-+-+ + +-+-+ +-+-+ + +-+-+ \ / B -- E
| | |C D E | C---D-E E -- F
+-+-+-+ +-+ + +-+-+-+ +-+ + |\ E -- I
| | | | F | | .---F \ F -- G
+ +-+-+-+ + + + +-+-+-+ + + .' / \ G -- H
| | | | |G|H |I| G H-' I H -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 9 Figure 10 Figure 11
| D| D E |F E | F | | D| D E |F E | F |
A C I B G H
Figure 12 Figure 13
Questo labirinto ha un nodo con quattro percorsi (E in Figura 10). La Figura 11 mostra il suo grafico. La Figura 12 è un labirinto 1D equivalente; e la Figura 13 mostra lo stesso labirinto con etichette per vicoli ciechi da confrontare con la Figura 11.
Sfida
Dato un labirinto 2D come input, scrivi una funzione o un programma che trasforma il labirinto 2D in un labirinto 1D con punti di curvatura. I punti di curvatura possono usare una delle 52 lettere in ogni caso.
Garanzie di input (se uno di questi non è soddisfatto nell'input non è necessario gestirlo):
- Il labirinto di input è collegato (vale a dire, puoi sempre passare da un punto all'altro).
- Il labirinto di input è chiuso.
- Il labirinto di input è rettangolare.
- Vengono utilizzati tutti i punti reticolari
+
. - Tutte le pareti tra i punti reticolari sulla stessa riga utilizzano
|
- Tutte le pareti tra punti reticolari nella stessa colonna utilizzano
-
. - Tutti gli spazi fanno parte di un percorso (e tutti all'interno del labirinto).
- I percorsi sono tutti spazi (questo sarà sempre tradizionale, non deformabile)
- I percorsi hanno esattamente uno spazio.
- Il labirinto è costruito collegando punti su un reticolo.
- Non ci sono più di 52 nodi totali (es. Vicoli ciechi più punti di decisione) nel grafico del labirinto.
Formato di output:
- L'output dovrebbe essere una riga singola che mostra un labirinto 1D.
- L'output non dovrebbe contenere spazi iniziali / finali; tranne che una nuova riga finale va bene.
- Il primo personaggio e ogni altro personaggio successivo sono punti reticolari.
- Tutte le pareti dovrebbero essere su punti reticolari; e tutti i punti di curvatura tra di loro.
- Il grafico del labirinto 1D dovrebbe essere equivalente al grafico del labirinto 2D.
- I tuoi labirinti 1D devono essere compatti; tutti i punti non reticolari devono essere vicoli ciechi (cioè adiacenti alle pareti) o punti di curvatura.
- Le uniche lettere nel tuo output dovrebbero essere i punti di curvatura. Ogni punto di curvatura si presenta sulla linea esattamente due volte.
Esempio:
| D| D E|G E F| F | G | <- (1,2) The single line output
+ + + + + + + + + + + + + + + <- lattice point spacing... (3)
(4,6) lattice points are all walls or spaces
(5) See Figure 8
(7) D, E, F, G appear twice; no other labels
Questo è code-golf. Il vincitore è l'invio corretto senza scappatoie con il minor numero di byte.
analisi
Non ci sono casi di test per questa sfida, poiché esiste un numero elevato di output corretti per qualsiasi labirinto non banale.
Ho, tuttavia, creato un correttore in C ++ (questo controllore rappresenta entrambe le soluzioni attraverso una canonicalizzazione grafica ).
Inoltre, ecco alcuni esempi per illustrare la formattazione corretta:
Esempio 1
+-+-+-+-+-+-+
| | | |
+ + + + +-+-+
| | | |
+-+-+ +-+-+ +
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E|G E F| F | G |
Esempio 2
+-+-+-+-+-+-+
| | | | |
+ + + + + + +
| | | | |
+-+-+ + +-+-+
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E |F E | F |