Scrivi un programma o una funzione che accetta tre numeri interi, una larghezza w
, un'altezza h
e un conteggio dei passi s
. Disegnerai una camminata casuale non autointersecante s
lungo su un'immagine 5*w
per 5*h
pixel in cui ogni cella di 5 per 5 pixel è vuota (beige puro) o una di queste dodici semplici "pipe":
L'immagine sopra è ingrandita per mostrare i dettagli. Ecco i tubi di dimensioni reali:
(Le linee grigie servono solo a separare i tipi di tubo.)
La camminata casuale sarà un singolo percorso di tubo continuo che inizia in corrispondenza di un punto finale del tubo (uno dei quattro tipi di tubo in basso) e termina in un altro punto finale del tubo.
Inizia con un vuoto w
dih
griglia e scegli casualmente una cella come punto di partenza. Quindi scegli una delle quattro direzioni in modo casuale per iniziare e disegnare il punto finale del tubo corrispondente. Questa cella iniziale segna il primo passo della tua camminata e ogni volta che disegni una nuova cella o ne sovrascrivi una esistente, conta come un altro passo fatto.
Ora, ripetutamente, scegli casualmente di andare a destra, a sinistra o dritto, disegnando la cella del tubo appropriata se la direzione scelta è valida. Tornare indietro e scegliere nuovamente se una direzione non è valida fino a quando non s
viene formato il percorso completo . Il percorso dovrebbe terminare con un endpoint del tubo, che potrebbe trovarsi in qualsiasi punto della griglia, a seconda del percorso seguito dal percorso.
È molto importante notare che solo le due celle a tubo diritto possono essere sovrascritte e solo dalla cella a tubo diritto con orientamento opposto, il risultato è una cella di intersezione. Altrimenti, tutti i tubi devono essere posizionati in celle vuote.
Quando viene disegnata un'intersezione, la parte del percorso che si trova più lontano dalla cella iniziale deve essere disegnata in alto.
Spetta a te se la griglia ha o meno condizioni al contorno periodiche (PBC), ovvero se un tubo che esce da un lato della griglia uscirà dall'altro lato. Senza PBC il confine della griglia conta come una barriera che puoi incontrare proprio come le altre pipe.
Casi speciali
- Quando
s
è 0 senza tubi devono essere compilati e l'uscita dovrebbe essere uno sbozzato5*w
da5*h
immagine (cioè tutto beige). Quando
s
è 1 un moncone monotubodovrebbe essere disegnato nella cella iniziale scelta casualmente.
Altri dettagli
- Puoi supporre che
s
sia al massimow*h
quindi un percorso sarà sempre possibile. (Anche se sono possibili percorsi più lunghi a causa delle intersezioni.) w
eh
sarà sempre positivo.- Tutte le scelte casuali devono essere uniformemente casuali. ad es. non dovresti evitare di fare intersezioni quando sono possibili anche se questo semplifica il problema. Sono consentiti generatori di numeri pseudo-casuali.
- È possibile utilizzare tre colori visivamente distinti al posto del nero, del blu e del beige.
- Le tue immagini di output possono essere ingrandite in modo che siano realmente
5*w*k
di5*h*k
pixel in cuik
è un numero intero positivo. (Si consiglia di ingrandire qualsiasi esempio che pubblichi anche se haik
1.) - È possibile utilizzare qualsiasi formato di file immagine lossless comune e l'immagine può essere salvata in un file, visualizzata o emessa grezza su stdout.
Vince il codice più breve in byte.
Esempi
(Tutto ampliato del 500%.)
Se l'ingresso è w=2, h=1, s=0
allora l'uscita sarà sempre:
Se l'input è w=2, h=1, s=1
allora l'output sarà una di queste immagini con uguale probabilità:
Se l'ingresso è w=2, h=1, s=2
allora l'uscita sarà
o forse
se si presume che la griglia abbia PBC.
(Notare che l'avvio di un percorso del genere renderebbe impossibile un secondo passo.)
Ecco alcune possibili uscite per w=3, h=2, s=6
, supponendo PBC:
Ecco un possibile output per w=3, h=3, s=9
, supponendo PBC:
Si noti che il percorso non ha dovuto coprire tutte le celle a causa dell'intersezione che conta come due passaggi. Inoltre, possiamo dedurre che l'endpoint dell'angolo era la cella iniziale poiché il cavalcavia dell'intersezione deve essere stato disegnato in seguito. Quindi possiamo dedurre la sequenza di scelte casuali fatte:
start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end
Infine, ecco alcuni esempi di w=4, h=5, s=20
e w=4, h=5, s=16
:
You will be drawing a non-self-intersecting random walk
... è autointersecante o no?