Задание 0. Код Грея
Срок выполнения: до 5 ноября, 23:59.
Код Грея изначально предназначался для защиты от ложного срабатывания электромеханических переключателей. Сегодня коды Грея широко используются для упрощения выявления и исправления ошибок в системах связи, а также в формировании сигналов обратной связи в системах управления.
Для получения кода Грея может быть использован следующий простой алгоритм:
Код Грея для
n
бит может быть рекурсивно построен на основе кода дляn-1
бит путем переворачивания списка бит (то есть записыванием кодов в обратном порядке), конкатенации исходного и перевернутого списков, дописывания нулей в начало каждого кода в исходном списке и единиц — в начало кодов в перевернутом списке.
Необходимо реализовать функцию, вычисляющую код Грея.
Инструкция по выполнению
-
Ознакомьтесь с инструментами и материалами.
-
Воспользуйтесь заготовкой проекта на Reason. В заготовке проекта уже есть git-репозиторий с первым коммитом.
Для сборки и запуска исполняемого файла воспользуйтесь командой
dune exec -- gray
. -
Напишите реализацию функции
gray
в файлеlib/gray/Gray.re
, соответствующую сигнатуре в файлеlib/gray/Gray.rei
, вычисляющую код Грея.Функция должна принимать аргумент
n
типаint
— количество бит в коде и возвращать список строк, образующихn
-битный код Грея, в которых биты кодируются символами0
и1
. Примеры того, как должна работать эта функция, можно посмотреть в тестах в файлеlib/gray/Gray.re
.Постарайтесь уместить код этой функции не более чем в 15 строк.
Функция должна работать корректно для
n
от 0 до 15.Скорее всего вам могут пригодиться функции
List.map
,List.rev
, а также оператор@
для конкатенации списков и оператор++
для конкатенации строк. -
Напишите еще два модульных теста в файле
lib/gray/Gray.re
по аналогии с уже существующими в заготовке тестами. Тесты могут быть, например, такие:-
Тест для случая
n = 3
. -
Тест для случая
n = 10
, проверяющий только корректность длины результирующего списка.При необходимости вы можете ознакомиться с документацией к библиотеке
ppx_inline_test
.
-
-
Напишите еще один приемочный тест (например, для случая
n = 3
) в файлеbin/gray/gray.t
по аналогии с уже существующими в заготовке тестами.При необходимости вы можете ознакомиться с документацией по Cram-тестам в Dune.
-
Убедитесь в прохождении всех тестов командой
dune test
. -
Отформатируйте код командой
dune fmt
.
Сдача задания
Отклонение от алгоритма сдачи задания приведет к неизбежной необходимости все исправлять. |
-
Настройте ваши идентификационные данные в git, если они еще не настроены.
Полное имя принято указывать в порядке first + last.
Пример настройки:
git config --global user.name "Arthur Khashaev" git config --global user.email arthur@khashaev.ru
Пожалуйста, укажите ваше настоящее имя, чтобы было понятно, кому ставить оценку.
-
Зарегистрируйтесь на хостинге GitLab.com, если у вас нет там аккаунта.
-
Установите в профиле GitLab настоящее имя, аналогично настройке
user.name
в git, чтобы не пришлось гадать, кто сделал задание. -
Воспользуйтесь заготовкой проекта с начальным коммитом в ветке
master
. -
Создайте новый закрытый проект в GitLab.
При создании выбирайте «пустой проект» и снимите галочку «Initialize repository with a README», чтобы в созданном репозитории не было вообще никаких коммитов.
-
Настройте удаленный репозиторий в локальном и отправьте ветку
master
с начальным коммитом из заготовки проекта. -
Пригласите пользователя @Invizory в ваш репозиторий, предоставив роль Maintainer.
-
Создайте и переключитесь на ветку (например,
gray
), в которой вы будете вести разработку. В веткеmaster
при этом должен остаться только начальный коммит. -
Выполните задание согласно формулировке, сделав для этого необходимые коммиты.
-
Создайте запрос на слияние и назначьте его на проверяющего.
-
В случае наличия замечаний, их опубликуют в качестве комментариев к запросу на слияние, после чего вы сможете их учесть. Задание считается полностью выполненным тогда и только тогда, когда проверяющий нажмет «approve».