Решения реализованы на языках программирования Java (версия 11), Javascipt (Typescipt), Clojure (на основе Java).
В решениях реализованы сложные модификации (38-39 группы). К каждой задаче предоставлены тесты на корректность исполнения программы.
Лектор: Корнеев Георгий Александрович.
Практики: Корнеев Георгий, Плотников Андрей, Байдюк Вадим.
Мой контакт: https://t.me/abramkht (Хетаг).
Описание программы и принципов взаимодействия с пользователем указаны на странице условия домашних заданий.
Для тестирования программы требуется запустить соответсвующий каждому домашнему заданию исполняющий файл из тестов. Для каждого тестового файла указан его usage. Все тесты следует запускать с параметром enable asserts.
Модификации
- Базовая
- Код должен находиться в файле
clojure-solutions/expression.clj
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
илиhard
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
- Variables (32-33). Дополнительно реализовать поддержку:
- Переменных, состоящих из произвольного количества букв
XYZ
в любом регистре- Настоящее имя переменной определяется первой буквой ее имени
- Переменных, состоящих из произвольного количества букв
- Boolean (34-35). Сделать модификацию Variables и дополнительно реализовать поддержку:
- Булевских операций
- Аргументы: число больше 0 →
true
, иначе →false
- Результат:
true
→ 1,false
→ 0 And
(&&
) – и:5 & -6
равно 0Or
(||
) - или:5 & -6
равно 1Xor
(^^
) - исключающее или:5 ^ -6
равно 1- операции по увеличению приоритета:
^^
,||
,&&
, операции базовой модификации
- Аргументы: число больше 0 →
- Булевских операций
- PowLog (36-37). Сделать модификацию Variables и дополнительно реализовать поддержку:
- Бинарных правоассоциативных операций максимального приоритета:
IPow
(**
) – возведения в степень:4 ** 3 ** 2
равно4 ** (3 ** 2)
равно 262144ILog
(//
) – взятия логарифма:8 // 9 // 3
равно8 // (9 // 3)
равно 3
- Бинарных правоассоциативных операций максимального приоритета:
- ImplIff (38-39). Сделать модификацию Boolean и дополнительно реализовать поддержку:
- Булевских операций
Impl
(->
) – импликация (правоассоциативна):-4 -> 1
равно 1Iff
(<->
) - тогда и только тогда:2 <-> 6
равно 1- операции по увеличению приоритета:
<->
,->
, операции модификации Boolean
- Булевских операций
Модификации
- Base
- Код должен находиться в файле
clojure-solutions/expression.clj
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
илиhard
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
- SinCos (32-33). Дополнительно реализовать поддержку:
- унарных операций:
Sin
(sin
) – синус,(sin 4846147)
примерно равно 1;Cos
(cos
) – косинус,(cos 5419351)
примерно равно 1.
- унарных операций:
- SinhCosh (34-35). Дополнительно реализовать поддержку:
- унарных операций:
Sinh
(sinh
) – гиперболический синус,(sinh 3)
немного больше 10;Cosh
(cosh
) – гиперболический косинус,(cosh 3)
немного меньше 10.
- унарных операций:
- SumAvg (36-37). Дополнительно реализовать поддержку:
- операций произвольного числа аргументов:
Sum
(sum
) – сумма,(sum 1 2 3)
равно 6;Avg
(avg
) – арифметическое среднее,(avg 1 2 3)
равно 2;
- операций произвольного числа аргументов:
- Means (38-39). Дополнительно реализовать поддержку:
- операций произвольного числа аргументов:
ArithMean
(arith-mean
) – арифметическое среднее(arith-mean 1 2 6)
равно 3;GeomMean
(geom-mean
) – геометрическое среднее(geom-mean 1 2 4)
равно 2;HarmMean
(harm-mean
) – гармоническое среднее,(harm-mean 2 3 6)
равно 3;
- операций произвольного числа аргументов:
Модификации
- Base
- Код должен находиться в файле
clojure-solutions/expression.clj
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
илиhard
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
- SinCos (32-33). Дополнительно реализовать поддержку:
- унарных операций:
sin
– синус,(sin 4846147)
примерно равно 1;cos
– косинус,(cos 5419351)
примерно равно 1.
- унарных операций:
- SinhCosh (34-35). Дополнительно реализовать поддержку:
- унарных операций:
sinh
– гиперболический синус,(sinh 3)
немного больше 10;cosh
– гиперболический косинус,(cosh 3)
немного меньше 10.
- унарных операций:
- SumAvg (36-37). Дополнительно реализовать поддержку:
- операций произвольного числа аргументов:
sum
– сумма,(sum 1 2 3)
равно 6;avg
– среднее,(avg 1 2 3)
равно 2;
- операций произвольного числа аргументов:
- MeanVarn (38-39). Дополнительно реализовать поддержку:
- операций произвольного числа аргументов:
mean
– математическое ожидание аргументов,(mean 1 2 6)
равно 3;varn
– дисперсия аргументов,(varn 2 5 11)
равно 14;
- операций произвольного числа аргументов:
Модификации
- Базовая
- Код должен находиться в файле
clojure-solutions/linear.clj
. - Исходный код тестов
- Запускать c аргументом
easy
илиhard
- Запускать c аргументом
- Код должен находиться в файле
- Cuboid (32-33)
- Назовем кубоидом трехмерную прямоугольную таблицу чисел.
- Добавьте операции поэлементного сложения (
c+
), вычитания (c-
), умножения (c*
) и деления (cd
) кубоидов. Например,(с+ [[[1] [2]] [[3] [4]]] [[[5] [6]] [[7] [8]]])
должно быть равно[[[6] [8]] [[10] [12]]]
. - Исходный код тестов
- Tensor (34-35)
- Назовем тензором многомерную прямоугольную таблицу чисел.
- Добавьте операции поэлементного сложения (
t+
), вычитания (t-
) и умножения (t*
) тензоров. Например,(t+ [[1 2] [3 4]] [[5 6] [7 8]])
должно быть равно[[6 8] [10 12]]
. - Исходный код тестов
- Simplex (36-37)
- Назовем симплексом многомерную таблицу чисел,
такую что для некоторого
n
в ней существуют все значения с суммой индексов не превышающейn
и только эти значения. - Добавьте операции поэлементного сложения (
x+
), вычитания (x-
) и умножения (x*
) симплексов. Например,(x+ [[1 2] [3]] [[5 6] [7]])
должно быть равно[[6 8] [10]]
. - Исходный код тестов
- Назовем симплексом многомерную таблицу чисел,
такую что для некоторого
- Broadcast (38-39)
- Назовем тензором многомерную прямоугольную таблицу чисел.
- Форма тензора – последовательность чисел
(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).
Для этого, элементы тензора копируются по недостающим осям.
Например, распространив тензор
[[1 2]]
формы (1, 2) до формы (1, 2, 3) получим[[[1 1 1] [2 2 2]]]
, а распространив1
до формы (2, 3) получим[[1 1 1] [1 1 1]]
. - Тензоры называются совместимыми, если один из них может быть распространен до формы другого. Например, тензоры формы (1, 2, 3) и (1, 2) совместимы, а (1, 2, 3) и (2, 1) – нет. Числа совместимы с тензорами любой формы.
- Добавьте операции поэлементного
сложения (
tb+
), вычитания (tb-
), умножения (tb*
) и деления (tbd
) совместимых тензоров. Если формы тензоров не совпадают, то тензоры меньшей размерности должны быть предварительно распространены до тензоров большей размерности. Например,(tb+ 1 [[10 20 30] [40 50 60]] [100 200])
должно быть равно[[111 121 131] [241 251 261]]
. - Исходный код тестов
Для запуска тестов можно использовать скрипты TestClojure.cmd и TestClojure.sh
- Репозиторий должен быть скачан целиком.
- Скрипты должны находиться в каталоге
clojure
(их нельзя перемещать, но можно вызывать из других каталогов). - Полное имя класса теста указывается в качестве аргумента командной строки,
например,
cljtest.linear.LinearTest
. - Тестируемое решение должно находиться в текущем каталоге.
Запуск Clojure
- Консоль: Windows, *nix
- Интерактивный:
RunClojure
- С выражением:
RunClojure --eval "<выражение>"
- Скрипт:
RunClojure <файл скрипта>
- Справка:
RunClojure --help
- Интерактивный:
- IDE
- IntelliJ Idea: плагин Cursive
- Eclipse: плагин Counterclockwise
Лекция 1. Функции
Лекция 2. Внешний мир
Лекция 3. Объекты
Лекция 4. Разное
Лекция 5. Комбинаторные парсеры
Модификации
- Base
- Код должен находиться в файле
javascript-solutions/objectExpression.js
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
илиhard
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
- Prefix: SinhCosh (32-33). Дополнительно реализовать поддержку:
- унарных операций:
Sinh
(sinh
) – гиперболический синус,(sinh 3)
немного больше 10;Cosh
(cosh
) – гиперболический косинус,(cosh 3)
немного меньше 10;
- Исходный код тестов
- унарных операций:
- Prefix: Means (34-35). Дополнительно реализовать поддержку:
- операций произвольного числа аргументов:
ArithMean
(arith-mean
) – арифметическое среднее(arith-mean 1 2 6)
равно 3;GeomMean
(geom-mean
) – геометрическое среднее(geom-mean 1 2 4)
равно 2;HarmMean
(harm-mean
) – гармоническое среднее,(harm-mean 2 3 6)
равно 3;
- Исходный код тестов
- операций произвольного числа аргументов:
- Postfix: SumsqLength (36-37). Дополнительно реализовать поддержку:
- выражений в постфиксной записи:
(2 3 +)
равно 5 - операций произвольного числа аргументов:
Sumsq
(sumsq
) – сумма квадратов,(1 2 3 sumsq)
равно 14;Length
(length
у) – длина вектора,(3 4 length)
равно 5;
- Исходный код тестов
- выражений в постфиксной записи:
- Postfix: Means (38-39). Дополнительно реализовать поддержку:
- операций произвольного числа аргументов:
ArithMean
(arith-mean
) – арифметическое среднее(arith-mean 1 2 6)
равно 3;GeomMean
(geom-mean
) – геометрическое среднее(geom-mean 1 2 4)
равно 2;HarmMean
(harm-mean
) – гармоническое среднее,(harm-mean 2 3 6)
равно 3;
- Исходный код тестов
- операций произвольного числа аргументов:
Модификации
- Base
- Код должен находиться в файле
javascript-solutions/objectExpression.js
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
,hard
илиbonus
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
- ArcTan (32, 33). Дополнительно реализовать поддержку:
- функций:
ArcTan
(atan
) – арктангенс,1256 atan
примерно равно 1.57;ArcTan2
(atan2
) – арктангенс,841 540 atan2
примерно равно 1;
- функций:
- AvgMed (34, 35). Дополнительно реализовать поддержку:
- функций:
Avg5
(avg5
) – арифметическое среднее пяти аргументов,1 2 3 4 5 avg5
равно 3;Med3
(med3
) – медиана трех аргументов,1 2 -10 med3
равно 1.
- функций:
- Cube (36, 37). Дополнительно реализовать поддержку:
- унарных функций:
Cube
(cube
) – возведение в куб,3 cube
равно 27;Cbrt
(cbrt
) – извлечение кубического корня,-27 cbrt
равно −3;
- унарных функций:
- Harmonic (38, 39). Дополнительно реализовать поддержку:
- функций от двух аргументов:
Hypot
(hypot
) – квадрат гипотенузы,3 4 hypot
равно 25;HMean
(hmean
) – гармоническое среднее,5 20 hmean
равно 8;
- функций от двух аргументов:
Модификации
- Базовая
- Код должен находиться в файле
javascript-solutions/functionalExpression.js
. - Исходный код тестов
- Запускать c аргументом
hard
илиeasy
;
- Запускать c аргументом
- Код должен находиться в файле
- Mini (для тестирования)
- Не поддерживаются бинарные операции
- Код находится в файле functionalMiniExpression.js.
- Исходный код тестов
- Запускать c аргументом
hard
илиeasy
;
- Запускать c аргументом
- Variables (32, 33). Дополнительно реализовать поддержку:
- переменных:
y
,z
; - Исходный код тестов
- переменных:
- OneTwo (34, 35). Дополнительно реализовать поддержку:
- переменных:
y
,z
; - констант:
one
– 1;two
– 2;
- Исходный код тестов
- переменных:
- OneMinMax (36, 37). Дополнительно реализовать поддержку:
- переменных:
y
,z
; - констант:
one
– 1;two
– 2;
- операций:
min5
– минимальный из пяти аргументов,3 1 4 0 2 min5
равно 0;max3
– максимальный из трех аргументов,3 1 4 max3
равно 4.
- Исходный код тестов
- переменных:
- OneFP (38, 39). Дополнительно реализовать поддержку:
- переменных:
y
,z
; - констант:
one
– 1;two
– 2;
- операций:
*+
(madd
) – тернарный оператор произведение-сумма,2 3 4 *+
равно 10;_
(floor
) – округление вниз2.7 _
равно 2;^
(ceil
) – округление вверх2.7 ^
равно 3.
- Исходный код тестов
- переменных:
Запуск тестов
- Для запуска тестов используется GraalJS (часть проекта GraalVM, вам не требуется их скачивать отдельно)
- Для запуска тестов можно использовать скрипты TestJS.cmd и TestJS.sh
- Репозиторий должен быть скачан целиком.
- Скрипты должны находиться в каталоге
javascript
(их нельзя перемещать, но можно вызывать из других каталогов). - В качестве аргументов командной строки указывается полное имя класса теста и модификация,
например
jstest.functional.FunctionalExpressionTest hard
.
- Для самостоятельно запуска из консоли необходимо использовать командную строку вида:
java -ea --module-path=<js>/graal --class-path <js> jstest.functional.FunctionalExpressionTest {hard|easy}
, где-ea
– включение проверок времени исполнения;--module-path=<js>/graal
путь к модулям Graal (здесь и далее<js>
путь к каталогуjavascript
этого репозитория);--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
;Graal.js not found
– неверно указаны--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
;First argument should be one of: "easy", "hard", found: XXX
– неверно указана сложность;Exception in thread "main" jstest.EngineException: Script 'functionalExpression.js' not found
– в текущем каталоге отсутствует решение (functionalExpression.js
)
Запуск примеров
- В браузере
- Из консоли
- на Java: RunJS.cmd, RunJS.sh
- на node.js:
node RunJS.node.js
Лекция 1. Типы и функции
- Типы
- Функции
- Функции высшего порядка.
Обратите внимание на реализацию функции
mCurry
.
Лекция 2. Объекты и методы
Лекция 3. Другие возможности
- Обработка ошибок
- Чего нет в JS
- Стандартная библиотека
- Работа со свойствами
- Методы и классы
- JS 6+
- Модули: объявление использование
Модификации
- Базовая
- Класс
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
.
- Исходный код тестов
- Класс
- Ufb (32-33)
- Дополнительно реализовать поддержку режимов:
u
– вычисления вint
без проверки на переполнение;f
– вычисления вfloat
без проверки на переполнение;b
– вычисления вbyte
без проверки на переполнение.
- Исходный код тестов
- Дополнительно реализовать поддержку режимов:
- Uls (34-35)
- Дополнительно реализовать поддержку режимов:
u
– вычисления вint
без проверки на переполнение;l
– вычисления вlong
без проверки на переполнение;s
– вычисления вshort
без проверки на переполнение.
- Исходный код тестов
- Дополнительно реализовать поддержку режимов:
- AsmUls (36-7)
- Реализовать режимы из модификации Uls.
- Дополнительно реализовать унарные операции:
abs
– модуль числа,abs -5
равно 5;square
– возведение в квадрат,square 5
равно 25.
- Дополнительно реализовать бинарную операцию (максимальный приоритет):
mod
– взятие по модулю, приоритет как у умножения (1 + 5 mod 3
равно1 + (5 mod 3)
равно3
).
- Исходный код тестов
- AsmUpb (38-39)
- Дополнительно реализовать унарные операции:
abs
– модуль числа,abs -5
равно 5;square
– возведение в квадрат,square 5
равно 25.
- Дополнительно реализовать бинарную операцию (максимальный приоритет):
mod
– взятие по модулю, приоритет как у умножения (1 + 5 mod 3
равно1 + (5 mod 3)
равно3
).
- Дополнительно реализовать поддержку режимов:
u
– вычисления вint
без проверки на переполнение;p
– вычисления в целых числах по модулю 1009;b
– вычисления вbyte
без проверки на переполнение.
- Исходный код тестов
- Дополнительно реализовать унарные операции:
Модификации
- Базовая
- ToArray (32-33)
- Добавить в интерфейс очереди и реализовать метод
toArray
, возвращающий массив, содержащий элементы, лежащие в очереди в порядке от головы к хвосту. - Исходный код тестов
- Откомпилированные тесты
- Добавить в интерфейс очереди и реализовать метод
- IndexedToArray (34-35)
- Реализовать методы
get
– получить элемент по индексу, отсчитываемому с головы;set
– заменить элемент по индексу, отсчитываемому с головы;toArray
, возвращающий массив, содержащий элементы, лежащие в очереди в порядке от головы к хвосту.
- Исходный код тестов
- Откомпилированные тесты
- Реализовать методы
- Contains (36-37)
- Добавить в интерфейс очереди и реализовать методы
contains(element)
– проверяет, содержится ли элемент в очередиremoveFirstOccurrence(element)
– удаляет первое вхождение элемента в очередь и возвращает было ли такое
- Дублирования кода быть не должно
- Исходный код тестов
- Откомпилированные тесты
- Добавить в интерфейс очереди и реализовать методы
- Nth (38-39)
- Добавить в интерфейс очереди и реализовать методы
getNth(n)
– создать очередь, содержащую каждый n-й элемент, считая с 1removeNth(n)
– создать очередь, содержащую каждый n-й элемент, и удалить их из исходной очередиdropNth(n)
– удалить каждый n-й элемент из исходной очереди
- Тип возвращаемой очереди должен соответствовать типу исходной очереди
- Дублирования кода быть не должно
- Исходный код тестов
- Откомпилированные тесты
- Добавить в интерфейс очереди и реализовать методы
Модификации
- Базовая
- Классы должны находиться в пакете
queue
- Исходный код тестов
- Откомпилированные тесты
- Классы должны находиться в пакете
- ToArray (32-33)
- Реализовать метод
toArray
, возвращающий массив, содержащий элементы, лежащие в очереди в порядке от головы к хвосту. - Исходная очередь должна остаться неизменной
- Дублирования кода быть не должно
- Исходный код тестов
- Откомпилированные тесты
- Реализовать метод
- Indexed (34-35)
- Реализовать методы
get
– получить элемент по индексу, отсчитываемому с головыset
– заменить элемент по индексу, отсчитываемому с головы
- Исходный код тестов
- Откомпилированные тесты
- Реализовать методы
- Deque (36-37)
- Реализовать методы
push
– добавить элемент в начало очередиpeek
– вернуть последний элемент в очередиremove
– вернуть и удалить последний элемент из очереди
- Исходный код тестов
- Откомпилированные тесты
- Реализовать методы
- DequeToStrArray (38-39)
- Реализовать модификацию Deque
- Реализовать метод
toArray
, возвращающий массив, содержащий элементы, лежащие в очереди в порядке от головы к хвосту. - Реализовать метод
toStr
, возвращающий строковое представление очереди в виде '[
' голова ',
' ... ',
' хвост ']
' - Исходный код тестов
- Откомпилированные тесты
Модификации
- Базовая
- Класс
BinarySearch
должен находиться в пакетеsearch
- Исходный код тестов
- Откомпилированные тесты
- Класс
- Missing (32-33)
- Если в массиве
a
отсутствует элемент, равныйx
, то требуется вывести индекс вставки в формате, определенном вArrays.binarySearch
. - Класс должен иметь имя
BinarySearchMissing
- Исходный код тестов
- Откомпилированные тесты
- Если в массиве
- Min (34-35)
- На вход подается циклический сдвиг отсортированного (строго) по возрастанию массива. Требуется найти в нем минимальное значение.
- Класс должен иметь имя
BinarySearchMin
- Исходный код тестов
- Откомпилированные тесты
- Span (36-37)
- Требуется вывести два числа: начало и длину диапазона элементов,
равных
x
. Если таких элементов нет, то следует вывести пустой диапазон, у которого левая граница совпадает с местом вставки элементаx
. - Не допускается использование типов
long
иBigInteger
. - Класс должен иметь имя
BinarySearchSpan
- Исходный код тестов
- Откомпилированные тесты
- Требуется вывести два числа: начало и длину диапазона элементов,
равных
- Max (38-39)
- На вход подается массив полученный приписыванием отсортированного (строго) по убыванию массива в конец массива отсортированного (строго) по возрастанию Требуется найти в нем максимальное значение.
- Класс должен иметь имя
BinarySearchMax
- Исходный код тестов
- Откомпилированные тесты
Для того, чтобы протестировать базовую модификацию домашнего задания:
-
Скачайте тесты (BinarySearchTest.jar)
-
Откомпилируйте
BinarySearch.java
-
Проверьте, что создался
BinarySearch.class
-
В каталоге, в котором находится
search/BinarySearch.class
выполните командуjava -jar <путь к BinarySearchTest.jar>
Например, если
BinarySearchTest.jar
находится в текущем каталоге, аBinarySearch.class
в каталогеsearch
, выполните командуjava -jar BinarySearchTest.jar