{"id":27277323,"url":"https://github.com/sadimer/compressor","last_synced_at":"2025-10-29T00:34:50.517Z","repository":{"id":109527890,"uuid":"497410256","full_name":"sadimer/compressor","owner":"sadimer","description":"A compressor based on arithmetic compression for bin files and texts in Russian and English. Project in CMC MSU.","archived":false,"fork":false,"pushed_at":"2022-05-28T19:25:24.000Z","size":157,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-28T08:53:26.668Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sadimer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-05-28T19:25:00.000Z","updated_at":"2022-05-28T19:26:39.000Z","dependencies_parsed_at":"2023-03-13T14:09:55.818Z","dependency_job_id":null,"html_url":"https://github.com/sadimer/compressor","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sadimer/compressor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fcompressor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fcompressor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fcompressor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fcompressor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sadimer","download_url":"https://codeload.github.com/sadimer/compressor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sadimer%2Fcompressor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270637493,"owners_count":24620426,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-15T02:00:12.559Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-11T16:58:24.154Z","updated_at":"2025-10-29T00:34:50.435Z","avatar_url":"https://github.com/sadimer.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Задание №1 **\"Универсальный архиватор\"**\n\n## Содержание\n1. [Описание](#Описание)\n2. [Правила игры](#Правила-игры)\n3. [Сборка](#Сборка)\n  * [Unix](#unix)\n  * [Windows](#windows)\n  * [Docker](#docker)\n4. [Запуск](#Запуск)\n5. [Описание репозитория](#Описание-репозитория)\n\n## Описание\nВам необходимо реализовать архиватор.\nЗадача — достичь как можно большей степени сжатия без потерь.\n\nЗамер будет проводиться в трех номинациях:\n1. Арифметическое сжатие (допустим только алгоритм с нормализацией)\n2. PPM\n3. BWT\n\nДля повышения степени сжатия своего архиватора рекомендуется использовать следующие методы:\n* Адаптивная (или блочно-адаптивная) реализация арифметического сжатия.\n* Подбор параметров агрессивности сжатия (возможно динамически, т.е. во время\n  исполнения программы).\n* Начальная инициализация таблиц вероятностей наиболее подходящими значениями \n  (возможно — смена таблиц при изменении характера данных).\n* Увеличение точности алгоритма арифметического сжатия\n  (использование int64_t и double).\n* Если вам этого кажется мало — реализуйте PPM (как минимум простой,\n  рассказанный на лекции, с любыми дополнениями, которые вы можете найти\n  в книге [Методы сжатия данных](http://compression.ru/book/pdf/compression_methods_part1_2-4.pdf)).\n\n## Правила игры\n* За использование чужих исходных текстов или совместное написание — \n  работы всех причастных будут сниматься с замеров, и им будет присуждаться 0 баллов.\n  Подробнее — читайте [Stanford CS Honor Code](http://csmajor.stanford.edu/HonorCode.shtml).\n* Если разархивированный файл не совпадает с исходным,\n  компрессор падает или работает более 3 минут,\n  ему присваивается значение худшего результата в замере.\n* За первые три места в любой номинации (после собеседования по алгоритму)\n  — дополнительные баллы.\n\n## Сборка\n### **Unix**\nВ примере используется пакетный менеджер APT, который по умолчанию стоит \nна Ubuntu. На macOS можно пользоваться Homebrew, и тогда на 1-2 этапах будет \nиспользоваться команда `brew` вместо `apt`.\n\n1. Обновляем package list:\n\n    ```sh\n    sudo apt update\n    ```\n    \n2. Устанавливаем всё необходимое.\n\n    ```sh\n    sudo apt install -y cmake g++ python3\n    ```\n    \n3. Распаковываем архив.\n    \n4. Заходим в папку compressor, создаём папку build и заходим в неё:\n\n    ```sh\n    mkdir build\n    cd build\n\n    ```\n\n5. Теперь конфигурируем проект с помощью CMake, указав ../src как папку\n    с исходниками, а после ключа `-G` — формат проекта, который мы хотим получить.\n    Например, эта команда сгенерирует самый обыкновенный Makefile:\n\n    ```sh\n    cmake -G \"Unix Makefiles\" ../src\n    ```\n    \n    А эта — проект для CodeBlocks:\n    \n    ```sh\n    cmake -G \"CodeBlocks - Unix Makefiles\" ../src\n    ```\n    \n    Все поддерживаемые форматы можно найти в справке `cmake --help`.\n    В дальнейшем вам **не нужно** будет конфигурировать проект повторно.\n    \n6. Собираем проект удобным образом, например:\n\n    ```sh\n    make  # нужно быть в папке compressor/build\n    ```\n    \n7. Проверяем папку compressor/build на наличие исполняемого файла\n   compress.\n8. Тестируем шаблон:\n\n    ```sh\n    cd ..  # поднимаемся из build в папку compressor\n    python3 tests/run.py\n    ```\n    \n    После успешного выполнения тестов в папке compression появится файл\n    results.csv, который можно открыть и посмотреть, что тестирование\n    действительно прошло успешно.\n9. Ура, всё получилось! Вы готовы создавать лучший в мире архиватор.\n    \n    \n### **Windows**\nЭпиграф:\n\n— Надо было ставить Linux!\n\n1. Cтавим [CMake](https://cmake.org/download/).\n2. Для тестирующего скрипта ставим интерпретатор [Python 3](https://www.python.org/downloads/).\n3. На всякий случай ставим [MinGW](http://www.mingw.org/) по этой\n    [ссылке](https://sourceforge.net/projects/mingw/files/Installer/).\n4. Запускаем Windows PowerShell.\n5. Распаковываем архив.\n6. Заходим в папку compressor, создаём папку build и заходим в неё:\n\n    ```sh\n    mkdir build\n    cd build\n\n    ```\n\n8. Теперь конфигурируем проект с помощью CMake, указав ../src как папку\n    с исходниками, а после ключа `-G` — формат проекта, который мы хотим получить.\n    Например, эта команда сгенерирует MinGW Makefile:\n\n    ```sh\n    cmake -G \"MinGW Makefiles\" ../src\n    ```\n    \n    А эта — проект для CodeBlocks:\n    \n    ```sh\n    cmake -G \"CodeBlocks - MinGW Makefiles\" ../src\n    ```\n    \n    Все поддерживаемые форматы можно найти в справке `cmake --help`.\n    В дальнейшем вам **не нужно** будет конфигурировать проект повторно.\n    \n9. Собираем проект удобным образом, например:\n\n    ```sh\n    mingw32-make  # нужно быть в папке compressor/build\n    ```\n    \n10. Проверяем папку compressor/build на наличие исполняемого файла\n   compress.exe.\n11. Тестируем шаблон:\n\n    ```sh\n    cd ..  # поднимаемся из build в папку compression\n    python tests/run.py\n    ```\n    \n    После успешного выполнения тестов в папке compression появится файл\n    results.csv, который можно открыть и посмотреть, что тестирование\n    действительно прошло успешно.\n12. Ура, всё получилось! Вы готовы создавать лучший в мире архиватор.\n\n### **Docker**\nЧтобы прогнать тесты с докером: \n1. Установите [Docker](https://docker.com)\n2. Склонируйте ваш репозиторий\n3. Соберите образ и запустите контейнер:\n\n```bash\ndocker build . -t compressor_tests\ndocker run compressor_tests\n```\n\nТак как набирать эти 2 строчки слишком долго, в корне лежит маленький Makefile,\nкоторый позволяет сократить проверку до 2х слов `make tests`\n  \n**Внимание:** задания будут проверяться именно этим способом, поэтому \nжелательно протестировать последнюю версию вашей программы с Docker\n\n\n## Запуск\nОбщий вид:\n\n```sh\n# Unix\ncompress [options]\n```\n\n```sh\n# Windows\ncompress.exe [options]\n```\n\nОпции:\n\n```cmd\n--help                     = Вызов справки, аналогичной этой.\n--input  \u003cfile\u003e            = Входной файл для архивации/разархивации, по умолчанию `input.txt`.\n--output \u003cfile\u003e            = Выходной файл для архивации/разархивации, по умолчанию `output.txt`.\n--mode   {c | d}           = Режим работы: `c` - архивация, `d` - разархивация; по умолчанию `c`.\n--method {ari | ppm | bwt} = Метод архивации/разархивации файла, по умолчанию `ari`.\n```\n\nНапример, если мы хотим заархивировать файл the_financier.txt в файл\nthe_financier.cmp методом PPM, то команда будет выглядеть так:\n\n```sh\n# Unix\ncompress --input the_financier.txt --output the_financier.cmp --mode c --method ppm\n```\n\n```sh\n# Windows\ncompress.exe --input the_financier.txt --output the_financier.cmp --mode c --method ppm\n```\n\n## Описание репозитория\n* `src` — папка с исходными файлами:\n    * main.c — основной файл;\n    * utils.c — файл, содержащий функции, чтобы парсить аргументы командной строки;\n    * ari.c, ppm.c, bwt.c — файлы, которые вам нужно изменить, написав\n    соответствующий алгоритм;\n    * *.h — заголовочные файлы ко всем вышеуказанным;\n    * CMakeLists.txt — файл, необходимый для генерации нужного вам формата\n    прокета с помощью CMake.\n\n    Вообще говоря, никто вас не обязывает использовать именно такую архитектуру\n    решения. Самое главное — ваше решение должно поддерживать указанный формат\n    запуска.\n\n* `test_files` — папка с тестовыми файлами.\n        \n* `tests` — папка для тестирования. Содержит:\n        \n    * `testing` — содержит необходимые для тестирования скрипты. \n    \n    * `run.py` — тестирующий скрипт на языке Python. \n        Его можно использовать для тестирования вашего архиватора следующим образом:\n        \n        ```sh\n        python run.py [options]\n        ```\n        \n        Опции:\n        \n        ```cmd\n        --timeout \u003ctimeout\u003e = Время, отведённое для тестирования каждого файла, по умолчанию 180с.\n        --testdir \u003cdir\u003e     = Папка с тестовыми файлами, по умолчанию `test_files`.\n        --outputdir \u003cdir\u003e   = Папка для выходных файлов, полученных в результате работы архиватора.\n        --output            = Флаг для сохранения выходных файлов. Если папка не указана с помощью ключа --outputdir, то папка по умолчанию — `output`.\n        ```\n        \n        Скрипт сжимает и распаковывает каждый файл, находящийся в указанной папке,\n        вычисляет размер получившихся файлов, сравнивает содержимое и записывает\n        результат по каждому файлу в results.csv.\n        \n        Возможные вердикты:\n        * OK — файл успешно сжат, распакован и совпадает с исходным;\n        * WA — файл успешно сжат и распакован, но не совпадает с исходным;\n        * RE1 — ошибка выполнения при сжатии;\n        * TL1 — превышен таймаут при сжатии;\n        * RE2 — ошибка выполнения при распаковке;\n        * TL2 — превышен таймаут при распаковке.\n    \n    * `config.cfg` — файл с указанием реализованных методов сжатия в формате списка \n        [JSON](http://www.json.org/).\n        \n        Всего допускается 3 значения: \"ARI\", \"PPM\", \"BWT\".\n        \n        Пример содержимого файла:\n        \n        ```json\n        [\"ARI\", \"BWT\"]\n        ```\n        \n        Этот файл необходим для тестирующего скрипта, чтобы определить,\n        какие методы тестировать.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsadimer%2Fcompressor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsadimer%2Fcompressor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsadimer%2Fcompressor/lists"}