Escriba un programa o función que tome tres enteros, un ancho w
, un alto h
y un conteo de pasos s
. Dibujará s
pasos de caminata aleatorios que no se cruzan entre sí en una imagen 5*w
por 5*h
píxel, donde cada celda de 5 por 5 píxeles está vacía (beige puro) o uno de estos doce "tubos" simples:
La imagen de arriba se amplía para mostrar detalles. Aquí están las tuberías a tamaño real:
(Las líneas grises son solo para separar los tipos de tubería).
La caminata aleatoria será una sola ruta de tubería continua que comienza en un punto final de tubería (uno de los cuatro tipos de tubería inferiores) y termina en otro punto final de tubería.
Comience con un vacío w
por h
cuadrícula y elija aleatoriamente una celda como punto de partida. Luego, elija al azar una de las cuatro direcciones para comenzar y dibuje el punto final de la tubería correspondiente. Esta celda inicial marca el primer paso en su caminata y cada vez que dibuja una nueva celda o sobrescribe una existente, cuenta como otro paso dado.
Ahora, repetidamente, elija al azar ir a la derecha, izquierda o recta, dibujando la celda de tubería apropiada si la dirección elegida es válida. Retroceda y vuelva a elegir si una dirección no es válida hasta s
que se forme la ruta de paso completa . La ruta debe terminar con un punto final de tubería, que puede estar en cualquier lugar de la cuadrícula, dependiendo del curso que tomó la ruta.
Es muy importante tener en cuenta que solo las dos celdas de tubería recta se pueden sobrescribir, y solo por la celda de tubería recta de la orientación opuesta, el resultado es una celda de intersección. De lo contrario, todas las tuberías deben colocarse en celdas vacías.
Cuando se dibuja una intersección, la parte de la ruta que está más lejos de la celda inicial debe dibujarse en la parte superior.
Depende de usted si la red tiene o no condiciones de contorno periódicas (PBC), es decir, si una tubería que sale de un lado de la red saldrá por el otro lado. Sin PBC, el límite de la cuadrícula cuenta como una barrera con la que puede toparse al igual que otras tuberías.
Casos especiales
- Cuando
s
es 0, no se deben dibujar tuberías y la salida debe estar en blanco5*w
por5*h
imagen (es decir, todo beige). Cuando
s
es 1 un trozo de tubo únicodebe dibujarse en la celda inicial elegida al azar.
Otros detalles
- Puede suponer que
s
es como mucho,w*h
por lo que siempre será posible un camino. (Aunque son posibles caminos más largos debido a las intersecciones). w
yh
siempre será positivo- Todas las elecciones aleatorias deben ser uniformemente aleatorias. por ejemplo, no debe evitar hacer intersecciones cuando sean posibles, incluso si esto facilita el problema. Se permiten generadores de números pseudoaleatorios.
- Se pueden usar tres colores visualmente distintos en lugar del negro, azul y beige.
- Sus imágenes de salida se pueden ampliar para que sean realmente
5*w*k
por5*h*k
píxeles, dondek
es un entero positivo. (Se recomienda ampliar los ejemplos que publique incluso si suk
es 1.) - Se puede usar cualquier formato de archivo de imagen sin pérdida común y la imagen se puede guardar en un archivo, mostrar o arrojar sin formato a stdout.
El código más corto en bytes gana.
Ejemplos
(Todo ampliado en un 500%).
Si la entrada es w=2, h=1, s=0
entonces, la salida siempre será:
Si la entrada es w=2, h=1, s=1
entonces, la salida será una de estas imágenes con la misma posibilidad:
Si la entrada es w=2, h=1, s=2
entonces la salida será
o posiblemente
si se supone que la cuadrícula tiene PBC.
(Tenga en cuenta que comenzar el camino como haría un segundo paso imposible).
Aquí hay algunas salidas posibles para w=3, h=2, s=6
, suponiendo PBC:
Aquí hay una salida posible para w=3, h=3, s=9
, suponiendo PBC:
Tenga en cuenta que la ruta no necesitaba cubrir todas las celdas debido a que la intersección cuenta como dos pasos. Además, podemos deducir que el punto final de la esquina era la celda inicial, ya que el paso elevado de la intersección debe haberse dibujado después. Por lo tanto, podemos inferir la secuencia de elecciones aleatorias que se hicieron:
start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end
Finalmente, aquí hay ejemplos de w=4, h=5, s=20
y w=4, h=5, s=16
:
fuente
You will be drawing a non-self-intersecting random walk
... ¿se cruza o no?Respuestas:
CJam, 274
Pruébalo en línea
Utiliza PBC, salidas en formato PGM. Puede eliminar el
:+
extremo cercano para obtener una salida visual más agradable en el navegador.Es muy lento para entradas más grandes, especialmente si el conteo de pasos está cerca del área.
Ejemplo de resultado para entrada
4 3 10
(escala 500%):Breve explicacion:
El enfoque general es:
fuente
QBasic,
517516bytesw
,h
ys
de la entrada del usuario, separados por comas.El enfoque aquí es intentar una dirección aleatoria en cada paso y comenzar de nuevo desde el principio si resulta en un movimiento no válido. Dibujamos las tuberías a medida que se deciden las instrucciones y las usamos
POINT
para probar puntos en la pantalla para nuestras condiciones de validez. Un movimiento es válido si no sale de los límites de la cuadrícula y:Al igual que la respuesta CJam de aditsu , este código es muy lento y puede ser muy lento si
s
es una fracción significativa dew*h
. En mi configuración QB64, aparece una respuesta con5,5,19
bastante rapidez, pero lleva más tiempo del que estaba dispuesto a esperar5,5,20
.Si desea ejecutar ejemplos más grandes / más densos, aquí está mi enfoque original usando una búsqueda profunda . Es mucho más eficiente, a costa de la friolera de 300 bytes adicionales.
Ejemplo de salida para entradas
10, 10, 100
, tamaño real:Una versión aún más elegante se puede encontrar en esta esencia . Además de ser poco entusiasta y completamente comentado, escala la salida por un factor constante y permite un retraso establecido entre los pasos, lo que le permite ver el algoritmo DFS en funcionamiento. Aquí hay un ejemplo de ejecución:
fuente