https://github.com/bialger/sandpile
A C++ implementation of the Abelian sand pile model. ITMO SE'27 first cource programming laboratory work.
https://github.com/bialger/sandpile
algorithms from-scratch sandpile sandpile-model simulations student-project
Last synced: 5 months ago
JSON representation
A C++ implementation of the Abelian sand pile model. ITMO SE'27 first cource programming laboratory work.
- Host: GitHub
- URL: https://github.com/bialger/sandpile
- Owner: bialger
- License: gpl-3.0
- Created: 2024-08-13T18:10:55.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-08-14T15:44:24.000Z (almost 2 years ago)
- Last Synced: 2025-08-23T11:32:14.873Z (11 months ago)
- Topics: algorithms, from-scratch, sandpile, sandpile-model, simulations, student-project
- Language: C++
- Homepage:
- Size: 107 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Лабораторная работа 3
## Задача
Реализовать упрощенную [модель песчаной кучи](https://en.wikipedia.org/wiki/Abelian_sandpile_model), которая позволяет сохранять свои состояния в картинку в [формате BMP](https://en.wikipedia.org/wiki/BMP_file_format).
Изначальное состояние задается входным файлом.
Размер сетки может изменяться в процессе работы программы.
Реализация - консольное приложение, поддерживающее следующие аргументы командной строки:
**-i, --input** - [tsv-файл](https://en.wikipedia.org/wiki/Tab-separated_values) (tab-separated values) c начальными данными
**-o, --output** - путь к директории для сохранения картинок
**-m, --max-iter** - максимальное количество итераций модели
**-f, --freq** - частота, с которой должны сохранятся картинки (если 0, то сохраняется только последнее состояние)
## Начальное состояние
Начальное состояние задается файлом со значением количества песчинок в каждой ячейке, кроме пустых. Размер сетки следует рассчитать на основании этих данных - минимальный прямоугольник в который попадают все ячейки.
Формат файла:
Каждая строчка содержит информацию об одной ячейке, в виде (x-координаты, y-координаты, количество песчинок), разделенных символом табуляции. Количество песчинок гарантированно влезет в `uint64_t`, координаты гарантированно влезают в `int16_t`
## Примечания к модели
1. Новые песчинки добавляются только при инициализации.
2. Состояние следующего поколения ячеек зависит только от предыдущего состояния сетки.
3. В случае если песчинки пытаются обвалиться за границу сетки, ее размер увеличивается на 1 в соответствующую сторону.
## Результат работы - программа
Программа должна пересчитывать состояние модели согласно начальным данным, а также сохранять промежуточные состояния с заданной частотой в виде картинки в формате bmp.
Картинка для текущего состояния формируется по следующим правилам:
1. Размер картинки равен размеру поля.
2. Каждый пиксель соответствует ячейке поля.
3. Цвет пикселя зависит от количества песчинок в ячейке.
+ 0 - белый
+ 1 - зеленый
+ 2 - желтый
+ 3 - фиолетовый
+ \> 3 - черный
4. Кодирование 1 пикселя должно занимать не более 4 бит.
Программа должна закончить свою работу в случае если модель достигла стабильного состояния, либо номера заданной изначально итерации.
## Ограничения
1. Пользовать сторонними библиотеками, кроме стандартной, запрещено. В частности это означает, что Вы должны *сами* спроектировать и реализовать функции для работы с картинками в формате bmp.
2. Использование контейнеров стандартной библиотеки (`std::vector`, `std::list` и тд) - запрещено.
## Примечание
1. Для реализации Вам может пригодиться [библиотека](https://en.cppreference.com/w/cpp/filesystem) для работы с файловой системой из стандартной библиотеки.
2. В данной лабе Вам дано только описание. Структура проекта и организация сборки также ваша задача. Использовать для сборки не cmake - запрещено.
3. Важно помнить, что размер структуры может быть не равен сумме размеров ее полей за счет [выравнивания](https://en.cppreference.com/w/c/language/object). Данную проблему можно решить за счет [директив препроцессора](https://en.cppreference.com/w/cpp/preprocessor/impl).
## Deadline
1. 31.10.23 24:00 - 0.8
2. 07.11.23 24:00 - 0.65
3. 14.11.23 24:00 - 0.5
Данная работа оценивается 15 баллами.