Модель трафика Бихам-Миддлтон-Левин - это самоорганизующийся сотовый автомат, который моделирует упрощенный трафик.
Он состоит из нескольких автомобилей, представленных точками на решетке со случайной стартовой позицией, где каждый автомобиль может быть одного из двух типов: те, которые движутся только вниз (показано синим цветом в этой статье), и те, которые движутся только к правильно (показано красным цветом в этой статье). Два типа автомобилей по очереди двигаются. В течение каждого поворота все автомобили соответствующего типа продвигаются на один шаг, если они не заблокированы другим автомобилем.
Ваша задача визуализировать эту модель как анимацию. Вот несколько хороших демонстраций.
вход
Число с плавающей точкой от 0 до 1, представляющее плотность, и два целых числа, представляющие отображаемую высоту и ширину сетки. Предположим, что входные данные действительны, и параметры для функции или чтения из пользовательского ввода в порядке.
Пример: 0.38 144 89
(соответствует изображению выше)
Выход
Сетка размером не менее 80x80, отображающая анимацию работы этой модели. В начале, автомобили случайным образом размещаются в сетке, пока сетка не достигнет входной плотности, наполовину красный и наполовину синий (то есть плотность умножается на общее количество квадратов сетки, округленных, как вам нравится). Плотность должна быть этим значением, что означает, что вы не можете заполнить каждую ячейку плотностью в качестве вероятности. На каждом шаге один тип автомобиля движется вниз или вправо, оборачиваясь, если они проходят через край. Тип автомобиля, который движется, чередуется с каждым шагом. Чтобы сделать анимацию видимой, между каждым шагом должно быть не менее 10 мс.
правила
Автомобили могут быть любого цвета или символа, если они отличаются друг от друга и фона, и каждый тип автомобиля одного цвета или символа.
Консоль и графический вывод разрешены. Для вывода на консоль подойдет любой печатный символ, но вывод должен быть в виде сетки символов.
Пожалуйста, укажите, какой вывод вы создали, если у вас нет скриншота или GIF.
Симуляция должна работать вечно.
Вывод немного сложный, поэтому, если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте.
Ответы:
R
350338293291273268264 байтаUngolfed:
Функция, которая принимает 3 аргумента:
d
как плотность, так и размерыx,y
.q
количество автомобилей в каждом цветеm
это матрица с автомобилями, которая изначально заполняется путем случайного сортировки количества автомобилей и пустых мест. Автомобили являются либо1
или-1
пустое пространство0
.f
это функция, которая перемещает автомобили на один ряд, глядя на автомобили, закодированные как1
. Он проверяет, может ли автомобиль двигаться, проверяя1
s и затем0
. Мы используемapply
для запускаf
на каждом ряду или столбце, в зависимости от того, какие машины.f
управляет движением1
автомобилей, чтобы переместить-1
автомобили, мы транспонируем матрицу, изменяя направление движения, умножая матрицу на-1
, таким образом,-1
автомобили становятся1
автомобилями, и vv и получающаяся матрица снова преобразуются.Используется
image
для создания графика, используя 3 цвета по умолчанию для трех значений. Используетanimation
пакет для обработки анимации, используя параметры по умолчанию, которые составляют 1 кадр / с.0.38, 144, 89:
0.2, 144, 89:
0.53, 144, 89:
источник
0.38 144 89
из примера.Mathematica,
237228203198181 байтВыход является динамическим
Image
. Фон светло-зеленый, а автомобили черные или пурпурные, в зависимости от их направления.объяснение
Создайте начальную доску:
Установите
i
в2
. СоздайтеList
из{0, 2}
, длина которого равна полу (плотность * ширина * высота / 2) (делится на два, потому что{0, 2}
это длина-2).Измените получающееся 2-D
List
(2 x что-то) в 1-DList
(длина = ширина * высота). Pad,1
если не хватает значений.(Псевдо-) случайная сортировка результата.
Раздел, который приводит к длине (ширине).
Храните это в
b
.Создать
Dynamic
Image
:Переверните знак
i
.Примените клеточный автомат с
193973693
весами правил и соседей{{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}
кb
транспонированным. Установитеb
равным этому.Если
i
положительно, оставь вb
покое. Если нет, перенестиb
(2-
есть, потому что я немного играл в гольфCellularAutomaton
). По сути, это транспонируетb
каждую другую итерацию (чтобы отменить транспонирование)Преобразуйте массив в красочный
Image
.Сделай выражение
Dynamic
. то есть вышеуказанные функции запускаются повторно.Выход
Вот пример выходных данных (входы:)
0.35, 192, 108
для 2000 кадров (увеличено в 2 раза).https://i.imgur.com/zmSyRut.mp4
источник
Dyalog APL ,
190108115112 байтовРешение
TryAPL online (слегка измененный из-за сетевых ограничений):
Набор
⎕IO←0
, определит функцию S , а затем определить и отобразить случайный 38% 14 × 29 сетки, G .Сделай один шаг вниз.
Сделайте один шаг вправо.
Переходите к шагу 2.
Анимация предыдущего алгоритма, который не гарантировал плотность.
объяснение
S←{
определим прямую функцию S (объясняется здесь справа налево):÷4
обратная 4 (0,25)⎕DL
подождите столько секунд (возвращает фактическое истекшее время)⍵⊣
отбросить это в пользу ⍵ (правильный аргумент; сетка)⎕←
вывод, что⍉
транспонирования⍉⍣⍺
транспонировать обратно снова, если ⍺ (левый аргумент; 0 = вниз, 1 = вправо)(
примените функцию train (объясняется здесь слева направо):,⍨
аргумент приложил к себе,
добавлен в⊢
сам)
↓
разбить матрицу на список списков(
поиск по регулярному выражению (объясняется здесь слева направо):⍺⊃
выберите один из следующих двух на основе ⍺ (0 = вниз / первый, 1 = вправо / второй)'(↓+) ' '(→+) '
последовательности стрелок вниз и влево, сопровождаемые пробелом)⎕R' \1'
заменить на пробел, за которым следует найденная последовательность↑
смешать список списков в матрицу⍉
транспонированияd[⍺]↓
пропустите строки "height", если ⍺ (левый аргумент) равен 0 (вниз), или строк "width", если ⍺ равен 1 (справа)d[⍺]↑
затем взять столько строк⊢
пройти через (служит разделителем)⍉⍣⍺
транспонировать, если ⍺ (левый аргумент; 0 = вниз, 1 = вправо)}
' ↓→'[
индексировать строку с помощью (поясняется здесь справа налево):⎕
числовой ввод (размеры)d←
назначьте это на d×/
умножить размеры (находит количество ячеек)c←
назначить это с⎕×
умножить это с числовым вводом (плотность)⌊
округлить1 2⍴⍨
циклически повторять один и два до этой длиныc↑
расширить это до длины с , дополняя нулямиd⍴
используйте d (размеры), чтобы изменить форму{
примените эту анонимную функцию к этому (объяснено здесь слева направо):⍵[
правильный аргумент (список нулей, единиц и двойок), проиндексированный?⍨
перемешанные индексы до⍴⍵
длина аргумента]
}
]
{
примените следующую анонимную функцию (объясняется справа налево):0S⍵
применить S с 0 (вниз) в качестве левого аргумента и сетку в качестве правого аргумента1S
с этим в качестве правого аргумента, примените S с 1 (правым) в качестве левого аргумента}⍣≡
пока две последовательные итерации не будут идентичны (пробка)Примечания
Требуется
⎕IO←0
, что по умолчанию во многих системах.Запрашивает для (высота, ширина), а затем для плотности.
Не использует встроенный автомат.
Использует ли встроенную поддержку регулярных выражений.
Останавливается, если есть пробка (ни одна машина не может двигаться).
Выводит матрицы символов, в которых
→
представлены автомобили, движущиеся направо,↓
автомобили, движущиеся вниз, а пробелы - пустые дороги.Как и выше, он выводит на сеанс с частотой 4 Гц, но частоту можно регулировать путем изменения
÷4
; Например÷3
, 3 Гц и.3
³⁄₁₀ Гц.Проще увидеть, что происходит, если выполнить
]Box on -s=max -f=on
сначала.Требуемое распределение теперь гарантировано, и два типа автомобилей встречаются ровно в 50-50, за исключением округления.
источник
↓
,. Если между ᵈ⁄₂ и d он становится→
. Если между d и 1 он остается пустым.0
(потому что они (псевдо) - случайно генерируемые (псевдо) - независимо; очень маловероятно, но возможно). Тогда ваша доска полна↓
с.Java (624 байта + 18 байтов для Java.awt. * = 642 байта)
Ungolfed:
Картина:
источник