Perl, 293 byte
-9 byte grazie a @Dom Hastings
{$==7+rand 30;@r=$"=();@a=((C)x4,(E)x3,("#")x1369,(" ")x1369);for$i(0..7+rand 30){$r[$i][$_]=splice@a,rand@a,1for 0..$=}$r[0][$=]=F;$r[-1][0]=P;$_=$r=join$/,$v="#"x($=+=3),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say
Aggiungi -E
flag per eseguirlo:
perl -E '{$==7+rand 30;@r=$"=();@a=((C)x4,(E)x3,("#")x1369,(" ")x1369);for$i(0..7+rand 30){$r[$i][$_]=splice@a,rand@a,1for 0..$=}$r[0][$=]=F;$r[-1][0]=P;$_=$r=join$/,$v="#"x($=+=3),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say'
Tuttavia, l'esecuzione richiede molto tempo, quindi consiglio di utilizzare questa versione invece:
perl -E '{${$_}=8+rand 30for"=","%";@r=$"=();@a=((C)x4,(E)x3,("#")x($v=rand $=*$%),(" ")x($=*$%-$v));for$i(0..$%-1){$r[$i][$_]=splice@a,rand@a,1for 0..$=-1}$r[0][$=-1]=F;$r[$%-1][0]=P;$_=$r=join$/,$v="#"x($=+=2),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say'
Provalo online!
Spiegazione
{ # inserisci un blocco (che viene utilizzato come un ciclo) { $ == 7 + rand 30 ; # seleziona a caso la larghezza della mappa -2 # (-2 perché non includiamo ancora i bordi) @r = $ "= (); # reset @r e imposta $" su undef @a = ( # create un elenco del personaggio che può essere sul tabellone ( C ) x4 , # 4 monete 'C' ( E ) x3 , # 3 nemici 'E' ( "#" ) x1369 , # 37 * 37 '#' (
"" ) x1369 ); # 37 * 37 spazi per $ i ( 0..7 + rand 30 ) # crea la mappa 2D (7 + rand 30 è l'altezza, che viene generata proprio ora) per $ _ ( 0 .. $ = - 1 ) {
$ r [ $ i ] [ $ _ ] = # index [$ i] [$ _] riceve ...
splice @ a , rand @ a , 1 # .. un carattere casuale dall'elenco precedentemente generato # (il carattere è quindi rimosso dall'elenco grazie a "splice") } }
$ r [
0 ] [ $ =] = F ; # aggiungi la cella finale
$ r [- 1 ] [ 0 ] = P ; # aggiungi la cella iniziale
$ _ = $ r = # qui generiamo una rappresentazione di stringa della mappa
join $ /, # unisce i seguenti elementi con le nuove righe
$ v = "#" x ( $ = + = 3 ), # a first solo riga # ( mappa "# @ $ _ #" , @r ), # aggiungi un # all'inizio e alla fine di ogni riga
$ v ; # l'ultima riga di #
1while # la seguente regex sostituirà ogni cella accessibile con una F
$ r = ~ s / F (. { $ =})? [^ # F ] / F $ 1F / s # una cella a destra o in fondo a una La cellula F è sostituita || # o
$ r = ~ s / [^ # F ] (. { $ =})? F / F $ 1F / s ; # una cella a sinistra o nella parte superiore di una cella F viene sostituita
$ r ! ~ / [CEP] / # se non ci sono C, E o P sulla mappa (nel senso che erano tutti accessibili) &&
/C.*C/ s # e ci sono almeno 2 monete && / E / ? # e 1 nemico per ultimo : # la mappa è valida, usciamo dal ciclo ripetiamo # altro, ricominciamo da capo }
diciamo # e stampiamo la scheda
Ci vuole molto tempo per correre, perché l'elenco da cui scegliamo casualmente i personaggi da mettere sul tabellone ( @a
) contiene 1369 spazi bianchi #
e solo 4 monete e 3 nemici. Quindi, se la dimensione della larghezza e dell'altezza sono piccole, ci sono molti spazi e #
rispetto alla moneta e ai nemici, quindi è molto probabile che una mappa casuale non sia valida. Ecco perché la versione "ottimizzata" è più veloce: l'elenco da cui scegliamo i personaggi è solo un po 'più grande della mappa (l'elenco è @a=((C)x4,(E)x3,("#")x($v=rand $=*$%),($")x($=*$%-$v))
: un numero casuale $v
di #
(inferiore alla dimensione della mappa) e size of the map - $v
spazi bianchi).