Задание 1.2D

Лабораторная №1 — задание 1.2D #

Используйте шаблон проекта

Задание выполняется в репозитории, созданном из шаблона: Шаблон проекта на C# / .NET

Учитывайте Требования к коду на C#

Нужно добавить в ExampleLib/ новый метод согласно выбранному варианту задания.

Требования #

Требования:

  1. Нужно добавить функцию в класс TextUtil либо в новый класс;
  2. Нужно покрыть реализацию модульными тестами;
  3. Функции должны использовать посимвольную обработку строк;
  4. Следует стремиться к тому, чтобы входная строка обрабатывалась за один проход;
  5. Нельзя использовать готовые библиотечные функции, решающие аналогичную задачу.

Допущения:

  • Можно использовать тип char либо Rune для представления символа — другими словами, поддерживать Unicode-символы за пределами BMP не требуется
  • Можно использовать или не использовать конечные автоматы

Варианты #

  1. Напишите функцию int ParseRoman(string text) для разбора чисел в римской системе счисления
    • Примеры: ParseRoman("VII") → 7, ParseRoman("MMXXV") → 2025
    • Поддерживайте следующие римские цифры: I=1, V=5, X=10, L=50, C=100, D=500, M=1000
    • Поддерживайте перевод чисел от 0 до 3000
    • Функция должна бросать исключение, если строка не является правильно записанным римским числом на отрезке от 0 до 3000
  2. Напишите функцию string FormatRoman(int value) для форматирования чисел в римской системе счисления
    • Примеры: FormatRoman(7) → "VII", FormatRoman(2025) → "MMXXV"
    • Поддерживайте следующие римские цифры: I=1, V=5, X=10, L=50, C=100, D=500, M=1000
    • Поддерживайте форматирование чисел от 0 до 3000
    • Функция должна бросать исключение, если число не входит в диапазон от 0 до 3000
  3. Напишите функцию string FormatEasternArabic(int value) для форматирования чисел с помощью традиционных арабских цифр
    • Пример: FormatEasternArabic(2025) → "٢٠٢٥"
    • Пример: FormatEasternArabic(12500) → "١٢٥٠٠"
    • Поддерживайте весь диапазон целых чисел от наименьшего отрицательного int.MinValue (-2147483648) до наибольшего положительного int.MaxValue (2147483647)
    • Учтите, что в C# для всех платформ тип int — это 32-битное целое со знаком
  4. Напишите функцию int ParseEasternArabic(string text) для чтения чисел, записанных с помощью традиционных арабских цифр
    • Пример: ParseEasternArabic("٢٠٢٥") → 2025
    • Пример: ParseEasternArabic("١٢٥٠٠") → 12500
    • Функция должна бросать исключение, если число не входит в диапазон от int.MinValue (-2147483648) до int.MaxValue (2147483647)
    • Учтите, что в C# для всех платформ тип int — это 32-битное целое со знаком
  5. Напишите функцию RgbColor ParseCssRbgColor(string text) для разбора CSS-строк цветов, заданных в модели RGB
    • Структура RgbColor должна иметь три свойства типа byte, соответствующие компонентам цвета: Red, Green и Blue
    • Функция должна разбирать цвета, заданные в HEX-формате с помощью символа «решётка» и 3 или 6 цифр в шестнадцатеричной системе счисления
    • Примеры допустимых цветов: #00a400, #FF00AA, #fff
    • Функция должна бросать исключение, если переданная строка не является допустимым цветом в HEX-формате
  6. Напишите функцию string FormatLowerCamelCase(string identifier) для форматирования идентификатора в нотации lowerCamelCase
    • Допустимый идентификатор содержит только буквы английского алфавита (a-z, A-Z), цифры 0-9 и символы подчёркивания _, но начинается всегда с буквы
    • Функция должна бросать исключение, если переданная строка не является допустимым идентификатором
    • В результирующей строке первое слово начинается с буквы в нижнем регистре, а каждое последующее — с буквы в верхнем регистре, при этом символы подчёркивания не сохраняются
    • Воспринимайте подчёркивания как разделители слов: FormatLowerCamelCase("sneak_case") → "sneakCase"
    • Сохраняйте исходную нотацию Camel Case: FormatLowerCamelCase("Can_process_rgbColor") → "canProcessRbgColor"
    • Сохраняйте аббревиатуры
    • Считайте словом только последовательность букв
  7. Напишите функцию string ParseUrlEncoded(string text) для разбора текста, закодированного методом URL encoding (percent-encoding)
    • Функция должна декодировать закодированные символы. Пример: ParseUrlEncoded("%D0%93%D0%B4%D0%B5%3F") → "Где?"
    • Функция должна принимать символы, которые ошибочно не были закодированы. Пример: ParseUrlEncoded("Где?") → "Где?"
    • Функция должна ожидать, что после символа % («процент») следуют две шестнадцатеричных цифры, и бросать исключение, когда это ожидание нарушено

Уточнения #

Традиционные арабские цифры #

В вашем редакторе кода вставка арабских цифр может приводить к изменению направления записи с LTR (left-to-right) на RTL (right-to-left). Адаптируйтесь к этому либо просто поменяйте вариант задания.

В восточных арабских странах для записи чисел могут использоваться традиционные цифры, начертание которых отличается от привычных для европейских. С точки зрения Unicode они являются отдельными символами.

Таблица традиционных арабских цифр:

0123456789
٠١٢٣٤٥٦٧٨٩