Тесты к курсу «Парадигмы программирования» https://www.kgeorgiy.info/courses/paradigms/

Georgiy Korneev 0acc2b1d4b Modifications for Prolog Maps homework added 4 months ago
artifacts/md2html 8132d7598d Md2HtmlAll and Link tests unified 6 months ago
clojure 9642b67fd2 Error reporting improved 4 months ago
java 9812f7fffd List-based Prolog Map homework modification added 4 months ago
javascript c5678280e7 PowLog modification for Parser Combinators homework added 4 months ago
prolog 0acc2b1d4b Modifications for Prolog Maps homework added 4 months ago
README.md 0acc2b1d4b Modifications for Prolog Maps homework added 4 months ago

README.md

Тесты к курсу «Парадигмы программирования»

Условия домашних заданий

Домашнее задание 11. Ассоциативные массивы на Prolog

Модификации

  • Простая
  • Сложная
  • Replace
    • Добавьте правило map_replace(Map, Key, Value, Result), заменяющего значения ключа на указанное, если ключ присутствует.
    • Исходный код тестов: простые, сложные
  • Size
    • Добавьте правило map_size(Map, Size), возвращающее размер дерева
    • Исходный код тестов: простые, сложные
  • floorKey
    • Добавьте правило map_floorKey(Map, Key, FloorKey), вовзращающее максимальный ключ, меньший либо равный заданному.
    • Исходный код тестов: простые, сложные

Исходный код к лекциям по Prolog

Запуск Prolog

Лекция 1. Введение в пролог

Домашнее задание 10. Комбинаторные парсеры

Модификации

  • Базовая
  • Variables. Дополнительно реализовать поддержку:
    • Переменных, состоящих из произвольного количества букв XYZ в любом регистре
      • Настоящее имя переменной определяется первой буквой ее имени
    • Исходный код тестов
  • PowLog. Дополнительно реализовать поддержку:
    • Бинарных правоассоциативных операций максимального приоритета:
      • Pow (**) – возведения в степень: 4 ** 3 ** 2 равно 4 ** (3 ** 2) равно 262144
      • Log (//) – взятия логарифма: 8 // 9 // 3 равно 8 // (9 // 3) равно 3
    • Исходный код тестов
  • Bitwise. Дополнительно реализовать поддержку:
    • Побитовых операций
      • And (&) – и: 5 & 6 равно 4
      • Or (|) - или: 5 & 6 равно 7
      • Xor (^) - исключающее: 5 ^ 6 примерно равно 1.66881E-308
      • для реализации операций используйте doubleToLongBits и longBitsToDouble
      • операции по увеличиению приоритета: ^, |, &, + и -, * и /
    • Исходный код тестов

Домашнее задание 9. Объектные выражения на Clojure

Модификации

  • Базовая
  • SinhCosh. Дополнительно реализовать поддержку:
    • унарных операций:
      • Sinh (sinh) – гиперболический синус, (sinh 3) немного больше 10;
      • Cosh (cosh) – гиперболический косинус, (cosh 3) немного меньше 10.
    • Исходный код тестов
  • SquareSqrt. Дополнительно реализовать поддержку:
    • унарных операций:
      • Square (square) – возведение в квадрат, (square 3) равно 9;
      • Sqrt (sqrt) – извлечение квадратного корня из модуля аргумента, (sqrt -9) равно 3.
    • Исходный код тестов

Домашнее задание 8. Функциональные выражения на Clojure

Модификации

  • Базовая
  • SquareSqrt. Дополнительно реализовать поддержку:
    • унарных операций:
      • square (square) – возведение в квадрат, (square 3) равно 9;
      • sqrt (sqrt) – извлечение квадратного корня из модуля аргумента, (sqrt -9) равно 3.
    • Исходный код тестов
  • MinMax. Дополнительно реализовать поддержку:
  • MedAvg. Дополнительно реализовать поддержку:

Домашнее задание 7. Линейная алгебра на Clojure

Модификации

  • Базовая
  • Shapeless
    • Добавьте операции поэлементного сложения (s+), вычитания (s-) и умножения (s*) чисел и векторов любой (в том числе, переменной) формы. Например, (s+ [[1 2] 3] [[4 5] 6]) должно быть равно [[5 7] 9].
    • Исходный код тестов
  • Tensor
    • Назовем тензором многомерную прямоугольную таблицу чисел.
    • Добавьте операции поэлементного сложения (t+), вычитания (t-) и умножения (t*) тензоров. Например, (s+ 1 2] [3 4]] [[5 6] [7 8) должно быть равно 6 8] [10 12.
    • Исходный код тестов
  • Broadcast
    • Назовем тензором многомерную прямоугольную таблицу чисел.
    • Форма тензора – последовательность чисел (s1..n)=(s1, s2, …, sn), где n – размерность тензора, а si – число элементов по i-ой оси. Например, форма тензора [ [ [2 3 4] [5 6 7] ] ]  равна (1, 2, 3), а форма 1 равна ().
    • Тензор формы (s1..n) может быть распространен (broadcast) до тензора формы (u1..m), если (si..n) является суффиксом (u1..m). Для этого, исходный тензор копируется по недостающим осям. Например, распространив тензор [ [2] [3] ] формы (2, 1) до формы (3, 2, 1) получим [ [ [2] [3] ] [ [2] [3] ] [ [2] [3] ] ], а распространив 1 до формы (2, 3) получим [ [1 1 1] [1 1 1] ].
    • Тензоры называются совместимыми, если один из них может быть распространен до формы другого. Например, тензоры формы (3, 2, 1) и (2, 1) совместимы, а (3, 2, 1) и (1, 2) – нет. Числа совместимы с тензорами любой формы.
    • Добавьте операции поэлементного сложения (b+), вычитания (b-) и умножения (b*) совместимых тензоров. Если формы тензоров не совпадают, то тензоры меньшей размерности должны быть предварительно распространены до тензоров большей размерности. Например, (b+ 1 [ [10 20 30] [40 50 60] ] [100 200 300] ) должно быть равно [ [111 221 331] [141 251 361] ].
    • Исходный код тестов

Исходный код к лекциям по Clojure

Запуск Clojure

  • Консоль: Windows, *nix
    • Интерактивный: RunClojure
    • С выражением: RunClojure --eval "<выражение>"
    • Скрипт: RunClojure <файл скрипта>
    • Справка: RunClojure --help
  • IDE

Скрипт со всеми примерами

Лекция 1. Функции

Лекция 2. Внешний мир

Лекция 3. Объекты и вычисления

Лекция 4. Комбинаторные парсеры

Домашнее задание 6. Обработка ошибок на JavaScript

Модификации

  • Базовая
  • PrefixSumAvg. Дополнительно реализовать поддержку:
    • операций произвольного числа аргументов:
      • Sum (sum) – сумма, (sum 1 2 3) равно 6;
      • Avg (avg) – арифметическое среднее, (avg 1 2 3) равно 2;
    • Исходный код тестов
  • PostfixSumAvg. Дополнительно реализовать поддержку:
    • выражений в постфиксной записи: (2 3 +) равно 5
    • унарных операций:
      • Sum (sum) – сумма, (1 2 3 sum) равно 6;
      • Avg (avg) – арифметическое среднее, (1 2 3 avg) равно 2;
    • Исходный код тестов
  • PrefixSumexpSoftmax. Дополнительно реализовать поддержку:
    • операций произвольного числа аргументов:
      • Sumexp (sumexp) – сумма экспонент, (8 8 9) примерно равно 14065;
      • Softmax (softmax) – softmax первого аргумента, (softmax 1 2 3) примерно равно 9;
    • Исходный код тестов
  • PostfixSumexpSoftmax. Дополнительно реализовать поддержку:
    • выражений в постфиксной записи: (2 3 +) равно 5
    • унарных операций:
      • Sumexp (sumexp) – сумма экспонент, (8 8 9 sumexp) примерно равно 14065;
      • Softmax (softmax) – softmax первого аргумента, (1 2 3 softmax) примерно 9;
    • Исходный код тестов
  • PostfixSumsqLength. Дополнительно реализовать поддержку:
    • выражений в постфиксной записи: (2 3 +) равно 5
    • унарных операций:
      • Sumsq (sumsq) – сумма квадратов, (1 2 3 sumsq) равно 14;
      • Length (lengthу) – длина вектора, (3 4 length) равно 5;
    • Исходный код тестов

Домашнее задание 5. Объектные выражения на JavaScript

Модификации

  • Базовая
    • Код должен находиться в файле objectExpression.js.
    • Исходный код тестов
      • Запускать c аргументом easy, hard или bonus.
  • ArcTan. Дополнительно реализовать поддержку:
    • функций:
      • ArcTan (atan) – арктангенс, 1256 atan примерно равно 1.57;
      • ArcTan2 (atan2) – арктангенс, 841 540 atan2 примерно равно 1;
    • Исходный код тестов
  • MinMax. Дополнительно реализовать поддержку:
    • функций:
      • Min3 (min3) – минимум из трех аргументов, 1 2 3 min равно 1;
      • Max5 (max5) – максимум из пяти аргументов, 1 2 3 4 5 max равно 5;
    • Исходный код тестов
  • SinhCosh. Дополнительно реализовать поддержку:
    • унарных функций:
      • Sinh (sinh) – гиперболический синус, 3 sinh немного больше 10;
      • Cosh (cosh) – гиперболический косинус, 3 cosh немного меньше 10;
    • Исходный код тестов

Исходный код к лекциям по JavaScript

Скрипт с примерами

Запуск примеров

Лекция 1. Типы и функции

Лекция 2. Объекты и методы

Лекция 3. Другие возможности

Домашнее задание 4. Функциональные выражения на JavaScript

Модификации

  • Базовая
  • PieAvgMed. Дополнительно реализовать поддержку:
    • переменных: y, z;
    • констант:
      • pi – π;
      • e – основание натурального логарифма;
    • операций:
      • avg5 – арифметическое среднее пяти аргументов, 1 2 3 4 5 avg5 равно 7.5;
      • med3 – медиана трех аргументов, 1 2 -10 med3 равно 1.
    • Исходный код тестов
      • Запускать c аргументом hard
  • Variables. Дополнительно реализовать поддержку:
  • OneIffAbs. Дополнительно реализовать поддержку:
    • переменных: y, z;
    • констант:
      • one – 1;
      • two – 2;
    • операций:
      • abs – абсолютное значение, -2 abs равно 2;
      • iff – условный выбор: если первый аргумент неотрицательный, вернуть второй аргумент, иначе вернуть первый третий аргумент.
        • iff one two 3 равно 2
        • iff -1 -2 -3 равно -3
        • iff 0 one two равно 1;
    • Исходный код тестов
      • Запускать c аргументом hard
  • IffAbs. Дополнительно реализовать поддержку:
    • переменных: y, z;
    • операций:
      • abs – абсолютное значение, -2 abs равно 2;
      • iff – условный выбор: если первый аргумент неотрицательный, вернуть второй аргумент, иначе вернуть первый третий аргумент:
        • iff 1 2 3 равно 2
        • iff -1 -2 -3 равно -3
        • iff 0 1 2 равно 1;
    • Исходный код тестов
      • Запускать c аргументом hard
  • OneTwo. Дополнительно реализовать поддержку:

Запуск тестов

  • Для запуска тестов используется GraalVM
  • Для запуска тестов можно использовать скрипты TestJS.cmd и TestJS.sh
    • Репозиторий должен быть скачан целиком.
    • Скрипты должны находиться в каталоге javascript (их нельзя перемещать, но можно вызывать из других каталогов).
  • Для самостоятельно запуска из консоли необходимо использовать командную строку вида: java -ea -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI --module-path=<js>/graal --upgrade-module-path=<js>/graal/compiler.jar --class-path <js> jstest.functional.FunctionalExpressionTest {hard|easy}, где
    • -ea – включение проверок времени исполнения;
    • -XX:+UnlockExperimentalVMOptions и -XX:+EnableJVMCI – опции необходимые для запуска Graal;
    • --module-path=<js>/graal путь к модулям Graal (здесь и далее <js> путь к каталогу javascript этого репозитория);
    • --upgrade-module-path=<js>/graal/compiler.jar путь к JIT-компилятору Graal;
    • --class-path <js> путь к откомпилированным тестам;
    • {hard|easy} указание тестируемой модификации.
  • При запуске из IDE, обычно не требуется указывать --class-path, так как он формируется автоматически. Остальные опции все равно необходимо указать.
  • Troubleshooting
    • Error occurred during initialization of boot layer java.lang.module.FindException: Module org.graalvm.truffle not found, required by jdk.internal.vm.compiler – неверно указан --module-path;
    • ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider com.oracle.truffle.js.scriptengine.GraalJSEngineFactory could not be instantiated – неверно указан --upgrade-module-path или не указана опция -XX:+EnableJVMCI;
    • Graal.js not found – неверно указаны --module-path и --upgrade-module-path
    • Error: Could not find or load main class jstest.functional.FunctionalExpressionTest – неверно указан --class-path;
    • Error: Could not find or load main class <other class> – неверно указано полное имя класса теста;
    • Exception in thread "main" java.lang.AssertionError: You should enable assertions by running 'java -ea jstest.functional.FunctionalExpressionTest' – не указана опция -ea;
    • Error: VM option 'EnableJVMCI' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions. – не указана опция -XX:+UnlockExperimentalVMOptions;
    • First argument should be one of: "easy", "hard", found: XXX – неверно указана сложность;
    • Exception in thread "main" jstest.EngineException: Script 'functionalExpression.js' not found – в текущем каталоге отсутствует решение (functionalExpression.js)

Домашнее задание 3. Вычисление в различных типах

Модификации

  • Базовая
    • Класс GenericTabulator должен реализовывать интерфейс Tabulator и сроить трехмерную таблицу значений заданного выражения.
      • mode – режим вычислений:
        • i – вычисления в int с проверкой на переполнение;
        • d – вычисления в double без проверки на переполнение;
        • bi – вычисления в BigInteger.
      • expression – выражение, для которого надо построить таблицу;
      • x1, x2 – минимальное и максимальное значения переменной x (включительно)
      • y1, y2, z1, z2 – аналогично для y и z.
      • Результат: элемент result[i][j][k] должен содержать значение выражения для x = x1 + i, y = y1 + j, z = z1 + k. Если значение не определено (например, по причине переполнения), то соответствующий элемент должен быть равен null.
    • Исходный код тестов
  • AsmUfb
    • Дополнительно реализовать унарные операции:
      • abs – модуль числа, abs -5 равно 5;
      • square – возведение в квадрат, square 5 равно 25.
    • Дополнительно реализовать бинарную операцию (максимальный приоритет):
      • mod – взятие по модулю, приоритет как у умножения (1 + 5 mod 3 равно 1 + (5 mod 3) равно 3).
    • Дополнительно реализовать поддержку режимов:
      • u – вычисления в int без проверки на переполнение;
      • f – вычисления в float без проверки на переполнение;
      • b – вычисления в byte без проверки на переполнение.
    • Исходный код тестов
  • Ls
    • Дополнительно реализовать поддержку режимов:
      • l – вычисления в long без проверки на переполнение;
      • s – вычисления в short без проверки на переполнение.
    • Исходный код тестов
  • Ufb
    • Дополнительно реализовать поддержку режимов:
      • u – вычисления в int без проверки на переполнение;
      • f – вычисления в float без проверки на переполнение;
      • b – вычисления в byte без проверки на переполнение.
    • Исходный код тестов

Домашнее задание 2. Markdown to HTML

Модификации

Домашнее задание 1. Обработка ошибок

Модификации

  • Базовая
    • Класс ExpressionParser должен реализовывать интерфейс Parser
    • Классы CheckedAdd, CheckedSubtract, CheckedMultiply, CheckedDivide и CheckedNegate должны реализовывать интерфейс TripleExpression
    • Нельзя использовать типы long и double
    • Нельзя использовать методы классов Math и StrictMath
    • Исходный код тестов
  • HighLow
    • Дополнительно реализовать унарные операции:
      • high – значение, у которого оставлен только самый старший установленный бит high -4 равно Integer.MIN_VALUE;
      • low – значение, у которого оставлен только самый младший установленный бит low 18 равно 2.
    • Исходный код тестов