El modelo de tráfico Biham-Middleton-Levine es un autómata celular autoorganizado que modela el tráfico simplificado.
Consiste en una cantidad de automóviles representados por puntos en una red con una posición de inicio aleatoria, donde cada automóvil puede ser uno de dos tipos: aquellos que solo se mueven hacia abajo (se muestra en azul en este artículo) y aquellos que solo se mueven hacia el derecha (se muestra en rojo en este artículo). Los dos tipos de automóviles se turnan para moverse. Durante cada turno, todos los autos para el tipo correspondiente avanzan un paso si no están bloqueados por otro auto.
Su tarea es visualizar este modelo como una animación. Aquí hay algunas buenas demostraciones.
Entrada
Un número de coma flotante entre 0 y 1 que representa la densidad, y dos enteros que representan la altura y el ancho de la cuadrícula mostrada. Suponga que las entradas son válidas y que los parámetros para una función o lectura de entrada del usuario están bien.
Ejemplo: 0.38 144 89
(corresponde a la imagen de arriba)
Salida
Una cuadrícula, al menos 80x80, que muestra la animación de este modelo en ejecución. Al principio, los autos se colocan aleatoriamente en la cuadrícula hasta que la cuadrícula alcanza la densidad de entrada, con mitad rojo y mitad azul (es decir, densidad multiplicada por el número total de cuadrados de la cuadrícula, redondeados como desee). La densidad debe ser este valor, lo que significa que no puede llenar cada celda con densidad como una probabilidad. Para cada paso, un tipo de automóvil se mueve hacia abajo o hacia la derecha, envolviéndose si pasan el borde. El tipo de automóvil que se mueve alterna cada paso. Para que la animación sea visible, debe haber al menos 10 ms entre cada paso.
Reglas
Los automóviles pueden ser de cualquier color o símbolo, siempre que sean distinguibles entre sí y del fondo, y cada tipo de automóvil sea del mismo color o símbolo.
La consola y la salida gráfica están permitidas. Para la salida de la consola, cualquier símbolo imprimible está bien, pero la salida debe ser como una cuadrícula de caracteres.
Especifique qué tipo de salida ha producido si no tiene una captura de pantalla o gif.
La simulación debe ejecutarse para siempre.
El resultado es un poco complejo, así que si tiene alguna pregunta, por favor comente.
Respuestas:
R,
350338293291273268264 bytesSin golf:
Función que toma 3 argumentos:
d
como densidad, y dimensionesx,y
.q
es la cantidad de autos en cada color.m
es la matriz con los automóviles, que inicialmente se llena tomando un tipo aleatorio del número de automóviles y espacios vacíos. Los autos son1
o-1
, el espacio vacío es0
.f
es una función que mueve los autos una fila, mirando los autos codificados como1
. Comprueba si el coche puede moverse comprobando si hay1
s seguido de0
. Solíamosapply
correrf
en cada fila o columna, dependiendo de qué automóviles.f
maneja el movimiento de los1
automóviles, para mover los-1
automóviles, transponemos la matriz, cambiando la dirección del movimiento, multiplicando la matriz por-1
, para que los-1
automóviles se vuelvan1
automóviles, y vv y la matriz resultante se transforma nuevamente.Esto se usa
image
para crear la gráfica, usando 3 colores predeterminados para los tres valores. Utiliza elanimation
paquete para manejar las animaciones usando las opciones predeterminadas, que es 1 fps.0.38, 144, 89:
0.2, 144, 89:
0.53, 144, 89:
fuente
0.38 144 89
del ejemplo.Mathematica,
237228203198181 bytesLa salida es una dinámica
Image
. El fondo es de color verde claro, y los autos son negros o magenta, dependiendo de su dirección.Explicación
Crea el tablero inicial:
Establecer
i
a2
. Cree unList
de{0, 2}
, cuya longitud es piso (densidad * ancho * alto / 2) (dividido entre dos porque{0, 2}
es longitud-2).Cambie la forma del 2-D resultante
List
(2 x algo) en 1-DList
(largo = ancho * alto). Rellene1
si no hay suficientes valores.(Pseudo-) ordena aleatoriamente el resultado.
Partición que resulta en longitud (ancho).
Almacenar eso en
b
.Crear un
Dynamic
Image
:Voltear el signo de
i
.Aplique el autómata celular con regla
193973693
y pesos vecinos{{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}
ab
transpuesto. Conjuntob
igual a eso.Si
i
es positivo, déjalob
solo. Si no, transponga elb
(2-
está allí porque juguéCellularAutomaton
un poco al golf ). Esencialmente, esto transponeb
cualquier otra iteración (para deshacer la transposición)Convierta la matriz en un colorido
Image
.Hacer la expresión
Dynamic
. es decir, las funciones anteriores se ejecutan repetidamente.Salida
Aquí hay una salida de muestra (entradas:
0.35, 192, 108
para 2000 cuadros (magnificados 2x).https://i.imgur.com/zmSyRut.mp4
fuente
Dyalog APL ,
190108115112 bytesSolución
TryAPL en línea (ligeramente modificado debido a restricciones en línea):
Set
⎕IO←0
, definir la función S , y luego definir y mostrar una al azar 38% 14 × 29 cuadrícula, G .Haz un movimiento hacia abajo.
Haz un movimiento a la derecha.
Ve al paso 2.
Animación del algoritmo anterior, que no garantizaba la densidad.
Explicación
S←{
defina la función directa S (explicada aquí de derecha a izquierda):÷4
recíproco de 4 (0.25)⎕DL
esperar tantos segundos (devuelve el tiempo transcurrido real)⍵⊣
descartar eso a favor de ⍵ (el argumento correcto; la cuadrícula)⎕←
salida que⍉
transponer⍉⍣⍺
transponer de nuevo si ⍺ (el argumento izquierdo; 0 = abajo, 1 = derecha)(
aplique el tren de funciones (explicado aquí de izquierda a derecha):,⍨
el argumento adjunto a sí mismo,
anexado a⊢
sí mismo)
↓
dividir la matriz en una lista de listas(
buscar expresiones regulares (explicado aquí de izquierda a derecha):⍺⊃
elija uno de los dos siguientes en función de 0 (0 = abajo / primero, 1 = derecha / segundo)'(↓+) ' '(→+) '
secuencias de flecha hacia abajo y hacia la izquierda seguidas de un espacio)⎕R' \1'
reemplazar con un espacio seguido de la secuencia encontrada↑
mezclar lista de listas en matriz⍉
transponerd[⍺]↓
soltar filas de "altura" si ⍺ (argumento izquierdo) es 0 (abajo) o filas de "ancho" si ⍺ es 1 (derecha)d[⍺]↑
luego toma tantas filas⊢
pasar a través (sirve como separador)⍉⍣⍺
transponer si ⍺ (el argumento izquierdo; 0 = abajo, 1 = derecha)}
' ↓→'[
indexe la cadena con (explicada aquí de derecha a izquierda):⎕
entrada numérica (dimensiones)d←
asignar eso a d×/
multiplica las dimensiones (encuentra el recuento de celdas)c←
asignar eso a c⎕×
multiplique eso con entrada numérica (la densidad)⌊
redondear a la baja1 2⍴⍨
repetir cíclicamente uno y dos hasta esa longitudc↑
extiéndalo hasta la longitud c , rellenando con cerosd⍴
use d (las dimensiones) para remodelar{
aplique esta función anónima a eso (explicado aquí de izquierda a derecha):⍵[
El argumento correcto (la lista de ceros, unos y dos) indexado por?⍨
los índices barajados hasta⍴⍵
la longitud del argumento]
}
]
{
aplique la siguiente función anónima (explicada de derecha a izquierda):0S⍵
aplique S con 0 (abajo) como argumento izquierdo y la cuadrícula como argumento derecho1S
con eso como argumento correcto, aplique S con 1 (derecho) como argumento izquierdo}⍣≡
hasta que dos iteraciones sucesivas sean idénticas (un atasco de tráfico)Notas
Requiere
⎕IO←0
, que es el predeterminado en muchos sistemas.Solicita (alto, ancho) y luego densidad.
No utiliza ningún autómata incorporado.
Utiliza soporte de expresiones regulares incorporado.
Se detiene si hay un atasco (ningún automóvil puede moverse).
Emite matrices de caracteres donde
→
representa los automóviles que se mueven hacia la derecha,↓
representa los automóviles que se mueven hacia abajo y los espacios son carreteras vacías.Como arriba, sale a la sesión a 4 Hz, pero la frecuencia se puede ajustar cambiando
÷4
; por ejemplo,÷3
es 3 Hz y.3
es ³⁄₁₀ Hz.Es más fácil ver qué sucede si se ejecuta
]Box on -s=max -f=on
primero.La distribución requerida ahora está garantizada, y los dos tipos de automóviles se producen exactamente en 50-50, salvo el redondeo.
fuente
↓
,. Si entre ᵈ⁄₂ yd se convierte en a→
. Si entre d y 1 se queda vacío.0
(porque son (pseudo) generados aleatoriamente (pseudo) de forma independiente; muy improbable pero posible). Entonces tu tablero está lleno de↓
s.Java (624 bytes + 18 bytes para Java.awt. * = 642 bytes)
Sin golf:
Imagen:
fuente