- Реализуйте итеративный и рекурсивный варианты бинарного поиска в массиве.
- На вход подается целое число x и массив целых чисел a, отсортированный по невозрастанию. Требуется найти минимальное значение индекса i, при котором a[i] <= x.
- Для функций бинарного поиска и вспомогательных функций должны быть указаны, пред- и постусловия. Для реализаций методов должны быть приведены доказательства соблюдения контрактов в терминах троек Хоара.
- Интерфейс программы.
- Имя основного класса — BinarySearch.
- Первый аргумент командной строки — число x.
- Последующие аргументы командной строки — элементы массива a.
- Пример запуска: java BinarySearch 3 5 4 3 2 1. Ожидаемый результат: 2.
Модификации
-
Базовая
- Класс
BinarySearch
должен находиться в пакетеsearch
- Исходный код тестов
- Откомпилированные тесты
- Класс
-
Min
- На вход подается циклический сдвиг отсортированного (строго) по возрастанию массива. Требуется найти в нем минимальное значение.
- Класс должен иметь имя
BinarySearchMin
- Исходный код тестов
- Откомпилированные тесты
- Найдите инвариант структуры данных «очередь». Определите функции, которые необходимы для реализации очереди. Найдите их пред- и постусловия, при условии что очередь не содержит null.
- Реализуйте классы, представляющие циклическую очередь с применением массива.
- Класс ArrayQueueModule должен реализовывать один экземпляр очереди с использованием переменных класса.
- Класс ArrayQueueADT должен реализовывать очередь в виде абстрактного типа данных (с явной передачей ссылки на экземпляр очереди).
- Класс ArrayQueue должен реализовывать очередь в виде класса (с неявной передачей ссылки на экземпляр очереди).
- Должны быть реализованы следующие функции (процедуры) / методы:
- enqueue – добавить элемент в очередь;
- element – первый элемент в очереди;
- dequeue – удалить и вернуть первый элемент в очереди;
- size – текущий размер очереди;
- isEmpty – является ли очередь пустой;
- clear – удалить все элементы из очереди.
- Инвариант, пред- и постусловия записываются в исходном коде в виде комментариев.
- Обратите внимание на инкапсуляцию данных и кода во всех трех реализациях.
- Напишите тесты к реализованным классам.
Модификации
-
Базовая
- Классы должны находиться в пакете
queue
- Исходный код тестов
- Откомпилированные тесты
- Классы должны находиться в пакете
-
Indexed
- Реализовать методы
get
– получить элемент по индексу, отсчитываемому с головыset
– заменить элемент по индексу, отсчитываемому с головы
- Исходный код тестов
- Откомпилированные тесты
- Реализовать методы
- Определите интерфейс очереди Queue и опишите его контракт.
- Реализуйте класс LinkedQueue — очередь на связном списке.
- Выделите общие части классов LinkedQueue и ArrayQueue в базовый класс AbstractQueue.
Модификации
-
Базовая
-
IndexedToArray
- Реализовать методы
get
– получить элемент по индексу, отсчитываемому с головы;set
– заменить элемент по индексу, отсчитываемому с головы;toArray
, возвращающий массив, содержащий элементы, лежащие в очереди в порядке от головы к хвосту.
- Исходный код тестов
- Откомпилированные тесты
- Реализовать методы
- Добавьте в программу разбирающую и вычисляющую выражения поддержку различных типов.
- Первым аргументом командной строки программа должна принимать указание на тип, в котором будут производится вычисления
- Вторым аргументом командной строки программа должна принимать выражение для вычисления.
- Реализация не должна содержать непроверяемых преобразований типов.
- Реализация не должна использовать аннотацию
@SuppressWarnings
.
- При выполнении задания следует обратить внимание на легкость добавления новых типов и операциий.
Модификации
-
Базовая
- Класс
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
.
- Исходный код тестов
- Класс
-
Uls
- Дополнительно реализовать поддержку режимов:
u
– вычисления вint
без проверки на переполнение;l
– вычисления вlong
без проверки на переполнение;s
– вычисления вshort
без проверки на переполнение.
- Исходный код тестов
- Дополнительно реализовать поддержку режимов:
-
Разработайте функции
cnst
,variable
,add
,subtract
,multiply
,divide
,negate
для вычисления выражений с одной переменной. -
Функции должны позволять производить вычисления вида:
let expr = subtract( multiply( cnst(2), variable("x") ), cnst(3) ); println(expr(5));
При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра функции
expr
(на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7. -
Тестовая программа должна вычислять выражение
x2−2x+1
, дляx
от 0 до 10. -
При выполнение задания следует обратить внимание на:
- Применение функций высшего порядка.
- Выделение общего кода для бинарных операций.
Модификации
-
Базовая
- Код должен находиться в файле
javascript-solutions/functionalExpression.js
. - Исходный код тестов
- Запускать c аргументом
hard
илиeasy
;
- Запускать c аргументом
- Код должен находиться в файле
-
Mini (для тестирования)
- Не поддерживаются бинарные операции
- Код находится в файле functionalMiniExpression.js.
- Исходный код тестов
- Запускать c аргументом
hard
илиeasy
;
- Запускать c аргументом
-
OneTwo. Дополнительно реализовать поддержку:
- переменных:
y
,z
; - констант:
one
– 1;two
– 2;
- Исходный код тестов
- переменных:
-
Разработайте классы
Const
,Variable
,Add
,Subtract
,Multiply
,Divide
,Negate
для представления выражений с одной переменной.-
Пример описания выражения
2x-3
:let expr = new Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) );
-
Метод
evaluate(x)
должен производить вычисления вида: При вычислении такого выражения вместо каждой переменной подставляется значениеx
, переданное в качестве параметра функцииevaluate
(на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7. -
Метод
toString()
должен выдавать запись выражения в обратной польской записи. Например,expr.toString()
должен выдавать2 x * 3 -
.
-
-
При выполнение задания следует обратить внимание на:
- Применение инкапсуляции.
- Выделение общего кода для операций.
Модификации
-
Base
- Код должен находиться в файле
javascript-solutions/objectExpression.js
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
,hard
илиbonus
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
-
AvgMed. Дополнительно реализовать поддержку:
- функций:
Avg5
(avg5
) – арифметическое среднее пяти аргументов,1 2 3 4 5 avg5
равно 3;Med3
(med3
) – медиана трех аргументов,1 2 -10 med3
равно 1.
- функций:
- Добавьте в предыдущее домашнее задание функцию
parsePrefix(string)
, разбирающую выражения, задаваемые записью вида(- (* 2 x) 3)
. Если разбираемое выражение некорректно, методparsePrefix
должен бросать человеко-читаемое сообщение об ошибке. - Добавьте в предыдущее домашнее задание метод
prefix()
, выдающий выражение в формате, ожидаемом функциейparsePrefix
. - При выполнение задания следует обратить внимание на:
- Применение инкапсуляции.
- Выделение общего кода для бинарных операций.
- Обработку ошибок.
- Минимизацию необходимой памяти.
Модификации
-
Base
- Код должен находиться в файле
javascript-solutions/objectExpression.js
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
илиhard
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
-
Prefix: Means. Дополнительно реализовать поддержку:
- операций произвольного числа аргументов:
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;
- Исходный код тестов
- операций произвольного числа аргументов:
-
Разработайте функции для работы с объектами линейной алгебры, которые представляются следующим образом:
- скаляры – числа
- векторы – векторы чисел;
- матрицы – векторы векторов чисел.
-
Функции над векторами:
v+
/v-
/v*
– покоординатное сложение/вычитание/умножение;scalar
/vect
– скалярное/векторное произведение;v*s
– умножение на скаляр.
-
Функции над матрицами:
m+
/m-
/m*
– поэлементное сложение/вычитание/умножение;m*s
– умножение на скаляр;m*v
– умножение на вектор;m*m
– матричное умножение;transpose
– траспонирование;
-
Все функции должны поддерживать произвольное число аргументов. Например
(v+ [1 2] [3 4] [5 6])
должно быть равно[9 12]
. -
При выполнение задания следует обратить внимание на:
- Применение функций высшего порядка.
- Выделение общего кода для операций.
Модификации
-
Базовая
- Код должен находиться в файле
clojure-solutions/linear.clj
. - Исходный код тестов
- Запускать c аргументом
easy
илиhard
- Запускать c аргументом
- Код должен находиться в файле
-
Tensor
- Назовем тензором многомерную прямоугольную таблицу чисел.
- Добавьте операции поэлементного сложения (
t+
), вычитания (t-
) и умножения (t*
) тензоров. Например,(t+ [[1 2] [3 4]] [[5 6] [7 8]])
должно быть равно[[6 8] [10 12]]
. - Исходный код тестов
-
Разработайте функции
constant
,variable
,add
,subtract
,multiply
иdivide
для представления арифметических выражений.-
Пример описания выражения
2x-3
:(def expr (subtract (multiply (constant 2) (variable "x")) (constant 3)))
-
Выражение должно быть функцией, возвращающей значение выражение при подстановке элементов, заданных отображением. Например,
(expr {"x" 2})
должно быть равно 1.
-
-
Разработайте разборщик выражений, читающий выражения в стандартной для Clojure форме. Например,
(parseFunction "(- (\* 2 x) 3)")
должно быть эквивалентно
expr
. -
При выполнение задания следует обратить внимание на:
- Выделение общего кода для операций.
Модификации
-
Base
- Код должен находиться в файле
clojure-solutions/expression.clj
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
илиhard
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
-
SinhCosh. Дополнительно реализовать поддержку:
- унарных операций:
sinh
– гиперболический синус,(sinh 3)
немного больше 10;cosh
– гиперболический косинус,(cosh 3)
немного меньше 10.
- унарных операций:
- Разработайте конструкторы
Constant
,Variable
,Add
,Subtract
,Multiply
иDivide
для представления выражений с одной переменной.-
Пример описания выражения
2x-3
:(def expr (Subtract (Multiply (Constant 2) (Variable "x")) (Const 3)))
-
Функция
(evaluate expression vars)
должна производить вычисление выраженияexpression
для значений переменных, заданных отображениемvars
. Например,(evaluate expr {"x" 2})
должно быть равно 1. -
Функция
(toString expression)
должна выдавать запись выражения в стандартной для Clojure форме. -
Функция
(parseObject "expression")
должна разбирать выражения, записанные в стандартной для Clojure форме. Например,(parseObject "(- (\* 2 x) 3)")
должно быть эквивалентно
expr
. -
Функция
(diff expression "variable")
должена возвращать выражение, представляющее производную исходного выражения по заданой пермененной. Например,(diff expression "x")
должен возвращать выражение, эквивалентное(Constant 2)
, при этом выражения(Subtract (Const 2) (Const 0))
и(Subtract (Add (Multiply (Const 0) (Variable "x")) (Multiply (Const 2) (Const 1))) (Const 0))
так же будут считаться правильным ответом.
-
- При выполнение задания можно использовать любой способ преставления объектов.
Модификации
-
Base
- Код должен находиться в файле
clojure-solutions/expression.clj
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
илиhard
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
-
SinhCosh. Дополнительно реализовать поддержку:
- унарных операций:
Sinh
(sinh
) – гиперболический синус,(sinh 3)
немного больше 10;Cosh
(cosh
) – гиперболический косинус,(cosh 3)
немного меньше 10.
- унарных операций:
- Реализуйте функцию (parseObjectSuffix "expression"), разбирающую выражения, записанные в суффиксной форме, и функцию
toStringSuffix
, возвращающую строковое представление выражения в этой форме. Например,(toStringSuffix (parseObjectSuffix "( ( 2 x * ) 3 - )"))
должно возвращать((2 x *) 3 -)
. - Функции разбора должны базироваться на библиотеке комбинаторов, разработанной на лекции.
Модификации
-
Базовая
- Код должен находиться в файле
clojure-solutions/expression.clj
. - Исходный код тестов
- Запускать c указанием модификации и сложности (
easy
илиhard
).
- Запускать c указанием модификации и сложности (
- Код должен находиться в файле
-
Boolean. Сделать модификацию Variables и дополнительно реализовать поддержку:
- Булевских операций
- Аргументы: число больше 0 →
true
, иначе →false
- Результат:
true
→ 1,false
→ 0 And
(&&
) – и:5 & -6
равно 0Or
(||
) - или:5 & -6
равно 1Xor
(^^
) - исключающее или:5 ^ -6
равно 1- операции по увеличению приоритета:
^^
,||
,&&
, операции базовой модификации
- Аргументы: число больше 0 →
- Булевских операций
-
Разработайте правила:
- prime(N), проверяющее, что N – простое число.
- composite(N), проверяющее, что N – составное число.
- prime_divisors(N, Divisors), проверяющее, что список Divisors содержит все простые делители числа N, упорядоченные по возрастанию. Если N делится на простое число P несколько раз, то Divisors должен содержать соответствующее число копий P.
-
Вариант N <= 1000.
-
Вы можете рассчитывать, на то, что до первого запроса будет выполнено правило init(MAX_N).
Модификации
-
Базовая
- Код должен находиться в файле
prolog-solutions/primes.pl
. - Исходный код тестов
- Запускать c аргументом
easy
,hard
илиbonus
- Запускать c аргументом
- Код должен находиться в файле
-
Power
- Добавьте правило
power_divisors(N, I, D)
, возвращающее делители Nⁱ:power_divisors(6, 2, [2, 2, 3, 3])
. - Исходный код тестов
- Добавьте правило
- Реализуйте ассоциативный массив (map) на основе деревьев поиска. Для решения можно реализовать любое дерево поиска логарифмической высоты.
- Разработайте правила:
- map_build(ListMap, TreeMap), строящее дерево из упорядоченного списка пар ключ-значение (O(n));
- map_get(TreeMap, Key, Value), проверяющее, что массив содержит заданную пару ключ-значение (O(log n)).
Модификации
-
Базовая
- Код должен находиться в файле
prolog-solutions/tree-map.pl
. - Исходный код тестов
- Запускать c аргументом
easy
илиhard
- Запускать c аргументом
- Код должен находиться в файле
-
KeysValues
- Добавьте правила:
map_Keys(Map, Keys)
, возвращающее ключи в порядке возрастания;map_Values(Map, Values)
, возвращающее значения в порядке возрастания ключей.
- Добавьте правила: