Immagina il seguente scenario: stai giocando a navi da guerra con un amico ma decidi di imbrogliare. Invece di muovere una nave dopo che spara dove era la tua nave, decidi di non posizionare alcuna nave. Gli dici che tutti i suoi colpi sono mancati, finché non è impossibile posizionare le navi in questo modo.
Devi scrivere una funzione, o un programma completo, che in qualche modo accetta 3 argomenti: la dimensione del campo, un elenco di quantità di dimensioni della nave e un elenco di scatti.
Campo di battaglia
Uno dei parametri indicati è la dimensione della scheda. Il campo di battaglia è un quadrato di celle e il parametro dato è semplicemente un lato del quadrato.
Ad esempio, la seguente è una tavola di dimensioni 5.
Le coordinate sul campo sono specificate come una stringa a 2 componenti: una lettera seguita da un numero. Puoi fare affidamento sul fatto che le lettere siano in alcuni casi particolari.
La lettera specifica la colonna, il numero specifica la riga della cella (1 indicizzata). Ad esempio nella figura sopra, la cella evidenziata è indicata da "D2"
.
Poiché ci sono solo 26 lettere, il campo non può essere più grande di 26x26.
Navi
Le navi sono linee rette di 1 o più blocchi. La quantità di navi è specificata in un elenco, in cui il primo elemento è la quantità di navi a 1 cella, la seconda - di navi a 2 celle e così via.
Ad esempio, l'elenco [4,1,2,0,1]
creerebbe il seguente set di navi:
Quando vengono posizionate sul campo di battaglia, le navi non possono intersecarsi o toccarsi. Nemmeno con gli angoli. Possono comunque toccare i bordi del campo.
Di seguito puoi vedere un esempio di posizionamento valido della nave:
Si può presumere che per un determinato set di navi, esista sempre un posizionamento su una tavola vuota di una determinata dimensione.
Produzione
Se tali posizionamenti di navi esistono, devi emetterne uno qualsiasi.
Il programma deve generare una matrice separata da nuova riga di caratteri ascii di uno dei 3 tipi - uno per indicare una cella vuota, uno - un pezzo di nave e uno - una cella contrassegnata come "mancata". Non devono essere emessi altri caratteri.
Per esempio,
ZZ@Z
\@@Z
@\\Z
\Z\\
(In questo esempio, ho definito @
cella vuota, cella \
"mancata" e Z
pezzo di nave)
Se non esiste tale posizionamento, il programma / funzione dovrebbe tornare senza emettere nulla.
Ingresso
Se decidi di creare un programma completo, spetta a te specificare come vengono inseriti gli elenchi, alcuni potrebbero passare tramite argomenti, altri tramite stdin.
Questo è code-golf , vince il minor numero di personaggi.
Un esempio di soluzione non golfizzata può essere trovato qui
Compilare con -std=c99
, il primo argomento è la dimensione della tavola, gli altri argomenti sono le dimensioni della nave. Un elenco di colpi separati da una nuova riga viene fornito su stdin. Esempio:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
con un 4,3,2,1
set di navi
26x26
? Ho disegnato una soluzione basata su regexps e ricorsione, e diventa estremamente lenta = inutilizzabile per i campi più di6x6
. O faccio qualcosa di molto stupido o la mancanza di risposte significa che anche altri non hanno successo.