O modelo de tráfego Biham-Middleton-Levine é um autômato celular de auto-organização que os modelos simplificados de trânsito.
Consiste em vários carros representados por pontos em uma treliça com uma posição inicial aleatória, onde cada carro pode ser de dois tipos: aqueles que apenas se movem para baixo (mostrados em azul neste artigo) e aqueles que apenas se movem em direção à direita (mostrada em vermelho neste artigo). Os dois tipos de carros se revezam para se mover. Durante cada turno, todos os carros do tipo correspondente avançam um passo se não forem bloqueados por outro carro.
Sua tarefa é visualizar esse modelo como uma animação. Aqui estão algumas boas demonstrações.
Entrada
Um número de ponto flutuante entre 0 e 1 representando densidade e dois números inteiros representando a altura e a largura da grade exibidas. Suponha que as entradas sejam válidas e que os parâmetros para uma função ou leitura da entrada do usuário estejam corretos.
Exemplo: 0.38 144 89
(corresponde à imagem acima)
Resultado
Uma grade, pelo menos 80x80, que exibe a animação desse modelo em execução. No início, os carros são colocados aleatoriamente na grade até que a grade atinja a densidade de entrada, com meio vermelho e meio azul (ou seja, densidade vezes o número total de quadrados da grade, arredondados da maneira que você desejar). A densidade deve ser esse valor, o que significa que você não pode preencher cada célula com densidade como uma probabilidade. Para cada etapa, um tipo de carro se move para baixo ou para a direita, contornando se ultrapassarem a borda. O tipo de carro que se move alterna cada etapa. Para tornar a animação visível, deve haver pelo menos 10 ms entre cada etapa.
Regras
Os carros podem ter qualquer cor ou símbolo, desde que sejam distinguíveis entre si e com o plano de fundo, e cada tipo de carro tenha a mesma cor ou símbolo.
Console e saída gráfica são permitidos. Para a saída do console, qualquer símbolo imprimível é bom, mas a saída deve ser como uma grade de caracteres.
Especifique que tipo de saída você produziu se não tiver uma captura de tela ou gif.
A simulação deve ser executada para sempre.
A saída é um pouco complexa, portanto, se você tiver alguma dúvida, comente.
Respostas:
R,
350338293291273268264 bytesUngolfed:
Função que recebe 3 argumentos:
d
como densidade e dimensõesx,y
.q
é o número de carros em cada cor.m
é a matriz com carros, que é preenchida inicialmente tomando um tipo aleatório do número de carros e espaços vazios. Os carros são1
ou-1
, o espaço vazio é0
.f
é uma função que move os carros uma linha, olhando para os carros codificados como1
. Ele verifica se o carro pode se mover verificando1
s seguidos por0
. Costumamosapply
correrf
em todas as linhas ou colunas, dependendo de quais carros.f
lida com o movimento dos1
carros, para mover os-1
carros, transpomos a matriz, seguindo a direção do movimento, multiplicando a matriz por-1
, para que os-1
carros se tornem1
carros, e vv e a matriz resultante é transformada novamente.Isso é usado
image
para criar a plotagem, usando três cores padrão para os três valores. Usa oanimation
pacote para manipular as animações usando as opções padrão, que são 1 fps.0.38, 144, 89:
0.2, 144, 89:
0.53, 144, 89:
fonte
0.38 144 89
do exemplo.Mathematica,
237228203198181 bytesA saída é uma dinâmica
Image
. O fundo é verde claro e os carros são pretos ou magenta, dependendo da direção.Explicação
Crie o quadro inicial:
Defina
i
como2
. Crie umList
de{0, 2}
, cujo comprimento seja piso (densidade * largura * altura / 2) (dividido por dois porque{0, 2}
é comprimento-2).Remodelar o 2-D resultante
List
(2 x algo) em 1-DList
(comprimento = largura * altura). Almofada1
se não houver valores suficientes.(Pseudo-) classifica aleatoriamente o resultado.
Partição que resulta em comprimento (largura).
Armazene isso em
b
.Crie um
Dynamic
Image
:Vire o sinal de
i
.Aplique o autômato celular com
193973693
pesos de regra e vizinhos{{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}
parab
transpor. Conjuntob
igual a isso.Se
i
for positivo, deixe emb
paz. Caso contrário, transponha ob
(2-
existe porque eu jogueiCellularAutomaton
um pouco). Essencialmente, isso transpõeb
todas as outras iterações (para desfazer a transposição)Converta a matriz em um colorido
Image
.Faça a expressão
Dynamic
. ou seja, as funções acima são executadas repetidamente.Resultado
Aqui está uma saída de amostra (entradas :)
0.35, 192, 108
para 2000 quadros (ampliada 2x).https://i.imgur.com/zmSyRut.mp4
fonte
Dyalog APL ,
190108115112 bytesSolução
TryAPL online (ligeiramente modificado devido a restrições online):
Conjunto
⎕IO←0
, definir a função S , e, em seguida, definir e exibir um aleatória 38% 14 × 29 grelha, L .Faça um movimento para baixo.
Faça um movimento para a direita.
Vá para o passo 2.
Animação do algoritmo anterior, que não garantiu densidade.
Explicação
S←{
defina a função direta S (explicada aqui da direita para a esquerda):÷4
recíproco de 4 (0,25)⎕DL
aguarde alguns segundos (retorna o tempo decorrido real)⍵⊣
descartar isso em favor de ⍵ (o argumento certo; a grade)⎕←
saída que⍉
transpor⍉⍣⍺
transponha novamente se ⍺ (o argumento da esquerda; 0 = baixo, 1 = direita)(
aplique o trem de funções (explicado aqui da esquerda para a direita):,⍨
o argumento anexado a si mesmo,
anexado a⊢
em si)
↓
dividir matriz em lista de listas(
regex de pesquisa (explicado aqui da esquerda para a direita):⍺⊃
escolha uma das duas seguintes com base em ⍺ (0 = para baixo / primeiro, 1 = para direita / segundo)'(↓+) ' '(→+) '
seqüências de seta para baixo e esquerda, seguidas por um espaço)⎕R' \1'
substitua por um espaço seguido pela sequência encontrada↑
misturar lista de listas em matriz⍉
transpord[⍺]↓
solte as linhas "altura" se ⍺ (argumento à esquerda) for 0 (para baixo) ou as linhas "largura" se ⍺ for 1 (à direita)d[⍺]↑
então pegue tantas linhas⊢
passagem (serve como separador)⍉⍣⍺
transpõe se ⍺ (o argumento da esquerda; 0 = baixo, 1 = direita)}
' ↓→'[
indexe a string com (explicada aqui da direita para a esquerda):⎕
entrada numérica (dimensões)d←
atribuir isso a d×/
multiplique as dimensões (encontra contagem de células)c←
atribua isso a c⎕×
multiplique isso com entrada numérica (a densidade)⌊
arredondar para baixo1 2⍴⍨
repetir ciclicamente um e dois até esse comprimentoc↑
estenda isso até o comprimento c , preenchendo com zerosd⍴
use d (as dimensões) para remodelar{
aplique esta função anônima a isso (explicada aqui da esquerda para a direita):⍵[
o argumento correto (a lista de zeros, uns e dois) indexados por?⍨
os índices embaralhados até⍴⍵
o comprimento do argumento]
}
]
{
aplique a seguinte função anônima (explicada da direita para a esquerda):0S⍵
aplique S com 0 (para baixo) como argumento à esquerda e a grade como argumento à direita1S
com isso como argumento certo, aplique S com 1 (direito) como argumento esquerdo}⍣≡
até que duas iterações sucessivas sejam idênticas (um engarrafamento)Notas
Requer
⎕IO←0
, que é padrão em muitos sistemas.Solicita (altura, largura) e, em seguida, densidade.
Não usa nenhum autômato interno.
Usa suporte a regex interno.
Pára se houver um engarrafamento (nenhum carro pode se mover).
Produz matrizes de caracteres onde
→
representa carros se movendo para a direita,↓
representa carros se movendo para baixo e espaços são estradas vazias.Como acima, ele envia para a sessão em 4 Hz, mas a frequência pode ser ajustada alterando
÷4
; por exemplo,÷3
é 3 Hz e.3
é ³⁄₁₀ Hz.É mais fácil ver o que está acontecendo se for executado
]Box on -s=max -f=on
primeiro.A distribuição necessária agora está garantida e os dois tipos de carros ocorrem exatamente em 50 a 50, exceto o arredondamento.
fonte
↓
,. Se entre ᵈ⁄₂ ed se tornar a→
. Se entre d e 1, ele permanecerá vazio.0
(porque elas são (pseudo) - geradas aleatoriamente (pseudo) - independentemente; muito improváveis, mas possíveis). Então seu quadro está cheio de↓
s.Java (624 bytes + 18 bytes para Java.awt. * = 642 bytes)
Ungolfed:
Cenário:
fonte