Il videogioco Minecraft è incentrato sul posizionamento e la rimozione di diversi tipi di blocchi nel reticolo intero 3D che costituisce il mondo virtuale. Ogni punto reticolare può contenere esattamente un blocco o essere vuoto (un blocco " aria " ufficialmente). In questa sfida, ci occuperemo solo di un piano 2D orizzontale del mondo 3D e di un tipo di blocco: le casse .
I forzieri permettono ai giocatori di conservare gli oggetti. Quando due casse sono ortogonalmente adiacenti nello stesso piano orizzontale, le loro trame si collegano e un doppio petto con il doppio delle forme di capacità. Nulla di più grande di un doppio petto può essere realizzato; non ci sono bauli tripli né quadrupli.
Un blocco toracico può essere posizionato in un punto reticolare vuoto solo se i suoi quattro punti ortogonalmente adiacenti sono tutti vuoti o se esattamente uno contiene un blocco toracico che non fa già parte di un doppio petto. Queste regole di posizionamento assicurano che non ci sia mai alcuna ambiguità su quali blocchi toracici si collegano per formare doppi forzieri.
Ad esempio, supponiamo che .sia uno spazio vuoto ed Cè un forziere: (I numeri sono anche spazi vuoti e solo a scopo di identificazione).
.......C..
.1.C2.C3..
........5C
.CC4..CC..
..........
- Una cassa può essere posizionata nel punto 1 perché i suoi 4 vicini sono vuoti.
- Una cassa può essere posizionata nel punto 2 perché la cassa vicina non è (ancora) parte di una doppia cassa.
- Una cassa non può essere messa nel punto 3 perché ci sarebbe ambiguità su come si forma la doppia cassa.
- Una cassa non può essere posizionata nel punto 4 perché la cassa vicina fa già parte di una doppia cassa.
- Una cassa può essere posizionata nel punto 5. La doppia cassa diagonale adiacente non influenza nulla.
Supponendo che l'area oltre la griglia sia vuota, cambiando ogni .nella griglia in un *se si potesse posizionare un forziere, si ottiene questo:
******.C**
***C**C.**
*..***..*C
.CC.*.CC.*
*..***..**
*Ovviamente non tutti gli spazi possono essere occupati con forzieri allo stesso tempo, ma se avessi un solo forziere, potrebbe essere posizionato in uno di essi.
Sfida
Scrivi un programma o una funzione che includa una .e una Cgriglia e cambi ogni .in una *se una cassa potesse essere posizionata lì, stampando o restituendo la griglia risultante.
L'input può provenire da stdin o da un file o come argomento stringa in una funzione.
Puoi supporre che l'input sia ben formato - cioè una griglia di testo perfettamente rettangolare, almeno 1 carattere largo e alto, contenente solo
.eCPuoi facoltativamente supporre che ci sia una nuova riga finale dopo l'ultima riga (e potrebbe essercene una nell'output ).Puoi supporre che la disposizione dei forzieri nell'input sia coerente con le regole sopra. Non ci saranno mai ambiguità su quali forzieri formino doppi forzieri.
Se lo si desidera, è possibile utilizzare qualsiasi tre distinte ASCII stampabili caratteri al posto di
.,Ce*. Non puoi usare qualcos'altro al posto di newline.Tutte le casse sono normali. Petti non intrappolati o forzieri .
punteggio
Vince l'invio con il minor numero di byte .
Per una sfida relativa a Minecraft che è un po 'più impegnativa, prova Nether Portal Detection .