Представляем вам коллекцию актуальных алгоритмических задач —в данном списке собраны разнообразные упражнения, ориентированные на участников с любым уровнем компетенции.
Подобная практика позволит вам совершенствовать искусство написания чистого кода,
поддерживать актуальность программных навыков и с удовольствием оттачивать мастерство решения сложных логических головоломок.
Что было раньше:
В предыдущей части мы решили:
- Calculate BMI (Рассчитать ИМТ)
- Reversed Strings (Перевернутые струны)
- Alphabetical Addition (Сложение в алфавитном порядке)
- Numerical Palindrome #3.5 (Числовой палиндром #3.5)
- T.T.T.17: Split odd and even (T.T.T.17: Разделить четное на нечетное)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: How old will I be in 2099? (Сколько мне будет лет в 2099 году?)
Ссылка на задачу: https://www.codewars.com/kata/5761a717780f8950ce001473
Сложность: 8 kyu
Уже решили (На момент написания статьи): 25 440 из 84 457
Тэги: Fundamentals
Оригинальное описание задачи:
Philip's just turned four and he wants to know how old he will be in various years in the future such as 2090 or 3044. His parents can't keep up calculating this so they've begged you to help them out by writing a programme that can answer Philip's endless questions.
Your task is to write a function that takes two parameters: the year of birth and the year to count years in relation to. As Philip is getting more curious every day he may soon want to know how many years it was until he would be born, so your function needs to work with both dates in the future and in the past.
Provide output in this format: For dates in the future: "You are ... year(s) old." For dates in the past: "You will be born in ... year(s)." If the year of birth equals the year requested return: "You were born this very year!"
"..." are to be replaced by the number, followed and proceeded by a single space. Mind that you need to account for both "year" and "years", depending on the result.
Good Luck!
Пояснение задачи:
Задача состоит в создании функции, которая вычисляет возраст человека на заданную дату либо сообщает, через сколько лет человек родится, если указанная дата находится в будущем. Функция принимает два аргумента:
- Год рождения (`birth_year`)
- Год, к которому нужно посчитать возраст (`target_year`)
Алгоритм решения:
1. Если год рождения больше года запроса, значит, человек еще не родился, и выводим сообщение о том, через сколько лет он родится.
2. Если год рождения меньше года запроса, значит, человек уже родился, и вычисляем его возраст.
3. Если годы равны, выводим сообщение, что человек родился именно в этот год.
Примеры:
age(2000, 2023) # Вычисляем возраст человека, родившегося в 2000 году, в 2023 году
Результат: "You are 23 year(s) old."
age(2000, 1999) # Человек еще не родился, вычисляем, когда он родится
Результат: "You will be born in 1 year(s)." age(2000, 2000)
Человек родился в указанный год
Результат: "You were born this very year!"
Важно учитывать корректное использование слова «год» или «года», в зависимости от результата вычислений.
Задача 2
Платформа: CodeWars
Название задачи: Responsible Drinking (Ответственное употребление алкоголя)
Ссылка на задачу: https://www.codewars.com/kata/5aee86c5783bb432cd000018
Сложность: 7 kyu
Уже решили (На момент написания статьи): 7 624 из 23 727
Тэги: Fundamentals
Оригинальное описание задачи:
Welcome to the Codewars Bar!
Codewars Bar recommends you drink 1 glass of water per standard drink so you're not hungover tomorrow morning.
Your fellow coders have bought you several drinks tonight in the form of a string. Return a string suggesting how many glasses of water you should drink to not be hungover.
Examples "1 beer" --> "1 glass of water"
because you drank one standard drink
"1 shot, 5 beers, 2 shots, 1 glass of wine, 1 beer" --> "10 glasses of water"
because you drank ten standard drinks
Note: To keep the things simple, we'll consider that any "numbered thing" in the string is a drink. Even `"1 bear"` -> `"1 glass of water"`; or `"1 chainsaw and 2 pools"` -> `"3 glasses of water"`...
Пояснение задачи:
Задача формулируется так: Необходимо написать функцию, принимающую строку, представляющую собой перечень напитков, употреблённых человеком.
Каждый напиток обозначается словом, перед которым может стоять число, указывающее количество выпитых порций данного напитка.
Например, строка "1 beer, 2 whiskey" означает, что человек выпил одну порцию пива и две порции виски.
Функция должна подсчитать общее количество стандартных порций алкоголя (одна стандартная порция равна одной единице любого напитка, указанного в строке), и вернуть строку, содержащую рекомендацию выпить соответствующее количество стаканов воды (по одному стакану на каждую порцию алкоголя).
Примеры:
- Вход: "1 beer"
Выход: "1 glass of water"
Объяснение:
одна единица алкоголя требует одного стакана воды.
Вход: "1 shot, 5 beers, 2 shots, 1 glass of wine, 1 beer"
Выход: "10 glasses of water" Объяснение: всего было выпито 10 единиц алкоголя (1+5+2+1+1), значит, рекомендуется выпить 10 стаканов воды. -
Вход: "1 bear"
Выход: "1 glass of water"
Объяснение: даже слово «bear» считается напитком, следовательно, одна порция требует одного стакана воды.
Вход: "1 chainsaw and 2 pools"
Выход: "3 glasses of water"
Объяснение: хотя слова «chainsaw» и «pools» выглядят необычно, каждое из них считается отдельной порцией напитка, соответственно, требуется три стакана воды.
Дополнительное замечание:
Подходящий алгоритм должен учитывать следующие моменты:
- Слова, указанные в строке, рассматриваются как названия напитков, независимо от их реального смысла.
- Перед каждым названием напитка может стоять целое число, обозначающее количество выпитых порций.
- Результат должен быть представлен в виде строки, где указано общее количество стаканов воды, которое нужно выпить, и фраза «glasses of water».
Задача 3
Платформа: CodeWars
Название задачи: Histogram data (Данные гистограммы)
Ссылка на задачу: https://www.codewars.com/kata/5704bf9b38428f1446000a9d
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 095 из 4 810
Тэги: Fundamentals, Algorithms, Arrays, Data Science
Оригинальное описание задачи:
You will be given an array of non-negative integers and positive integer bin width.
Your task is to create the Histogram method that will return histogram data corresponding to the input array. The histogram data is an array that stores under index i the count of numbers that belong to bin i. The first bin always starts with zero.
On empty input you should return empty output.
Examples:
For input data [1, 1, 0, 1, 3, 2, 6] and binWidth=1 the result will be [1, 3, 1, 1, 0, 0, 1] as the data contains single element "0", 3 elements "1" etc.
For the same data and binWidth=2 the result will be [4, 2, 0, 1]
For input data [7] and binWidth=1the result will be [0, 0, 0, 0, 0, 0, 0, 1]
Пояснение задачи:
Задача состоит в том, чтобы построить гистограмму частотности значений входного массива относительно заданного размера «ящика» (bin width).
Пояснение:
Нам дан массив неотрицательных целых чисел и ширина «ящика» (bin width).
Нужно сформировать массив, в котором индекс i соответствует количеству элементов исходного массива, попадающих в диапазон от i * {bin width} до (i+1) * {bin width} - 1.
При этом:
- Массив результатов строится так, что индекс i хранит количество элементов, попадающих в интервал [i ... {bin width}, (i + 1) ... {bin width} - 1].
- Если входной массив пуст, результат тоже будет пустой массив.
- Первый «ящик» начинается с нуля, то есть первый элемент результата соответствует интервалу [0, {bin width}-1], второй элемент — интервалу [{bin width}, 2 ... {bin width}-1] и так далее.
Примеры
- Пример 1:
Вход: `[1, 1, 0, 1, 3, 2, 6]`, ширина bins = 1 Результат: `[1, 3, 1, 1, 0, 0, 1]`
Объяснение:
- Элемент 0 попадает в первый ящик (0–0),
- три элемента 1 попадают во второй ящик (1–1),
- один элемент 2 попадает в третий ящик (2–2),
- один элемент 3 попадает в четвёртый ящик (3–3),
- остальные элементы не попадают ни в какой ящик, поэтому последние два ящика пусты.
- Пример 2:
Вход: `[1, 1, 0, 1, 3, 2, 6]`, ширина bins = 2 Результат: `[4, 2, 0, 1]`
Объяснение: -
Четыре элемента (0, 1, 1, 1) попадают в первый ящик (0–1),
- два элемента (2, 3) попадают во второй ящик (2–3),
- третий ящик пуст,
- один элемент (6) попадает в последний
Задача 4
Платформа: CodeWars
Название задачи: Sum The Tree (Суммируем Дерево)
Ссылка на задачу: https://www.codewars.com/kata/5800580f8f7ddaea13000025
Сложность: 6 kyu
Уже решили (На момент написания статьи): 5 385 из 16 379
Тэги: Trees, Recursion, Binary Trees, Binary Search Trees, Data Structures, Fundamentals
Оригинальное описание задачи:
Given a node object representing a binary tree:
example of a node object:
const node ={
value: 1,
left: {value: 2, right: null, left: null},
right: null
};
write a function that returns the sum of all values, including the root.Absence of a node will be indicated with a `null` value.
Examples:
10
| \
1 2
=> 13
1
| \
0 0
\
2 => 3
Пояснение задачи:
Требуется написать функцию, вычисляющую сумму значений всех узлов бинарного дерева, включая корень.
Если узел отсутствует (указатель на него равен `null`, `None`, `nullptr` или `null`), то такой узел игнорируется.
Пояснение:
Для решения задачи используется рекурсивный подход:
1. Базовый случай: Если узел является пустым (`null`), возвращаем 0.
2. Рекурсивная обработка:
Для каждого узла суммируем значение текущего узла и рекурсивно суммируем значения левого и правого поддеревьев.
Таким образом, алгоритм последовательно проходит по всем узлам дерева, складывая их значения, пока не достигнет листьев.
Пример:
Для следующего дерева:
10
/ \
1 2
Сумма будет равна 10 + 1 + 2 = 13.
Или для дерева:
1
| \
0 0
\
2
Сумма равна 1 + 0 + 0 + 2 = 3.
Алгоритм:
- Начинаем с корня дерева.
- Проверяем наличие левого и правого потомков.
- Рекурсивно проходим по левому и правому поддереву, суммируя значения узлов.
- Возвращаем итоговую сумму.
Пример реализации на C++:
int sumTree(node *root)
{ if (!root) return 0; return root->value + sumTree(root->left) + sumTree(root->right); }
Функция принимает указатель на корневой узел дерева и возвращает общую сумму значений всех узлов.
Задача 5
Платформа: CodeWars
Название задачи: Vector class (Векторный класс)
Ссылка на задачу: https://www.codewars.com/kata/526dad7f8c0eb5c4640000a4
Сложность: 5 kyu
Уже решили (На момент написания статьи): 9 671 из 102 962
Тэги: Object-oriented Programming, Algorithms, Linear Algebra
Оригинальное описание задачи:
Create a Vector object that supports addition, subtraction, dot products, and norms.
So, for example:
a = Vector([1, 2, 3])
b = Vector([3, 4, 5])
c = Vector([5, 6, 7, 8])
a.add(b) # should return a new Vector([4, 6, 8])
a.subtract(b) # should return a new Vector([-2, -2, -2])
a.dot(b) # should return 1*3 + 2*4 + 3*5 = 26
a.norm() # should return sqrt(1^2 + 2^2 + 3^2) = sqrt(14)
a.add(c) # raises an exception
If you try to add, subtract, or dot two vectors with different lengths, you must throw an error!
Also provide:
- a `toString` method, so that using the vectors from above, `a.toString() === '(1,2,3)'` (in Python, this is a `__str__` method, so that `str(a) == '(1,2,3)'`. In PHP, this is `__toString` magic method)
- an `equals` method, to check that two vectors that have the same components are equal Note:the test cases will utilize the user-provided `equals` method.
Пояснение задачи:
Необходимо реализовать класс `Vector`, поддерживающий следующие операции:
- Сложение (`add`): возвращает новый вектор, являющийся суммой текущего вектора и переданного аргумента.
- Вычитание (`subtract`): возвращает новый вектор, являющийся разностью текущего вектора и переданного аргумента.
- Умножение скалярное (точка, `dot`): вычисляет скалярное произведение двух векторов.
- Норма (`norm`): возвращает длину вектора (модуль вектора), равную квадратному корню суммы квадратов всех компонент.
Дополнительные требования:
- Операции сложения и вычитания допустимы только между векторами одинаковой длины.
- Если длина векторов различается, операция должна завершаться ошибкой.
- Реализовать метод `toString`, возвращающий строку вида `(x1, x2, ..., xn)` (в Python — метод `__str__`, в PHP — магический метод `__toString`).
- Реализовать метод сравнения `equals`, позволяющий проверить равенство векторов по компонентам.
Примеры:
python
a = Vector([1, 2, 3])
b = Vector([3, 4, 5])
Сложение result = a.add(b) [(1+3, 2+4, 3+5)] -> [4, 6, 8]
Вычитание result = a.subtract(b) [(1-3, 2-4, 3-5)] -> [-2, -2, -2]
Скалярное произведение result = a.dot(b) 1*3 + 2*4 + 3*5 = 26
Норма result = a.norm() √(1² + 2² + 3²) = √14
Строковое представление print(a.to_string()) '1, 2, 3'
Проверка равенства:
print(a.equals(Vector([1, 2, 3]))) True
print(a.equals(Vector([1, 2, 4]))) False
При попытке сложить или вычесть векторы разной длины должно возникать исключение или ошибка.
Заключение:
Платформа: CodeWars
Название задачи: How old will I be in 2099? (Сколько мне будет лет в 2099 году?)
Ссылка на задачу: https://www.codewars.com/kata/5761a717780f8950ce001473
Сложность: 8 kyu
Уже решили (На момент написания статьи): 25 440 из 84 457
Тэги: Fundamentals
Оригинальное описание задачи:
Philip's just turned four and he wants to know how old he will be in various years in the future such as 2090 or 3044. His parents can't keep up calculating this so they've begged you to help them out by writing a programme that can answer Philip's endless questions.
Your task is to write a function that takes two parameters: the year of birth and the year to count years in relation to. As Philip is getting more curious every day he may soon want to know how many years it was until he would be born, so your function needs to work with both dates in the future and in the past.
Provide output in this format: For dates in the future: "You are ... year(s) old." For dates in the past: "You will be born in ... year(s)." If the year of birth equals the year requested return: "You were born this very year!"
"..." are to be replaced by the number, followed and proceeded by a single space. Mind that you need to account for both "year" and "years", depending on the result.
Good Luck!
Пояснение задачи:
Задача состоит в создании функции, которая вычисляет возраст человека на заданную дату либо сообщает, через сколько лет человек родится, если указанная дата находится в будущем. Функция принимает два аргумента:
- Год рождения (`birth_year`)
- Год, к которому нужно посчитать возраст (`target_year`)
Алгоритм решения:
1. Если год рождения больше года запроса, значит, человек еще не родился, и выводим сообщение о том, через сколько лет он родится.
2. Если год рождения меньше года запроса, значит, человек уже родился, и вычисляем его возраст.
3. Если годы равны, выводим сообщение, что человек родился именно в этот год.
Примеры:
age(2000, 2023) # Вычисляем возраст человека, родившегося в 2000 году, в 2023 году
Результат: "You are 23 year(s) old."
age(2000, 1999) # Человек еще не родился, вычисляем, когда он родится
Результат: "You will be born in 1 year(s)." age(2000, 2000)
Человек родился в указанный год
Результат: "You were born this very year!"
Важно учитывать корректное использование слова «год» или «года», в зависимости от результата вычислений.
Платформа: CodeWars
Название задачи: Responsible Drinking (Ответственное употребление алкоголя)
Ссылка на задачу: https://www.codewars.com/kata/5aee86c5783bb432cd000018
Сложность: 7 kyu
Уже решили (На момент написания статьи): 7 624 из 23 727
Тэги: Fundamentals
Оригинальное описание задачи:
Welcome to the Codewars Bar!
Codewars Bar recommends you drink 1 glass of water per standard drink so you're not hungover tomorrow morning.
Your fellow coders have bought you several drinks tonight in the form of a string. Return a string suggesting how many glasses of water you should drink to not be hungover.
Examples "1 beer" --> "1 glass of water"
because you drank one standard drink
"1 shot, 5 beers, 2 shots, 1 glass of wine, 1 beer" --> "10 glasses of water"
because you drank ten standard drinks
Note: To keep the things simple, we'll consider that any "numbered thing" in the string is a drink. Even `"1 bear"` -> `"1 glass of water"`; or `"1 chainsaw and 2 pools"` -> `"3 glasses of water"`...
Пояснение задачи:
Задача формулируется так: Необходимо написать функцию, принимающую строку, представляющую собой перечень напитков, употреблённых человеком.
Каждый напиток обозначается словом, перед которым может стоять число, указывающее количество выпитых порций данного напитка.
Например, строка "1 beer, 2 whiskey" означает, что человек выпил одну порцию пива и две порции виски.
Функция должна подсчитать общее количество стандартных порций алкоголя (одна стандартная порция равна одной единице любого напитка, указанного в строке), и вернуть строку, содержащую рекомендацию выпить соответствующее количество стаканов воды (по одному стакану на каждую порцию алкоголя).
Примеры:
- Вход: "1 beer"
Выход: "1 glass of water"
Объяснение:
одна единица алкоголя требует одного стакана воды.
Вход: "1 shot, 5 beers, 2 shots, 1 glass of wine, 1 beer"
Выход: "10 glasses of water" Объяснение: всего было выпито 10 единиц алкоголя (1+5+2+1+1), значит, рекомендуется выпить 10 стаканов воды. -
Вход: "1 bear"
Выход: "1 glass of water"
Объяснение: даже слово «bear» считается напитком, следовательно, одна порция требует одного стакана воды.
Вход: "1 chainsaw and 2 pools"
Выход: "3 glasses of water"
Объяснение: хотя слова «chainsaw» и «pools» выглядят необычно, каждое из них считается отдельной порцией напитка, соответственно, требуется три стакана воды.
Дополнительное замечание:
Подходящий алгоритм должен учитывать следующие моменты:
- Слова, указанные в строке, рассматриваются как названия напитков, независимо от их реального смысла.
- Перед каждым названием напитка может стоять целое число, обозначающее количество выпитых порций.
- Результат должен быть представлен в виде строки, где указано общее количество стаканов воды, которое нужно выпить, и фраза «glasses of water».
Платформа: CodeWars
Название задачи: Histogram data (Данные гистограммы)
Ссылка на задачу: https://www.codewars.com/kata/5704bf9b38428f1446000a9d
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 095 из 4 810
Тэги: Fundamentals, Algorithms, Arrays, Data Science
Оригинальное описание задачи:
You will be given an array of non-negative integers and positive integer bin width.
Your task is to create the Histogram method that will return histogram data corresponding to the input array. The histogram data is an array that stores under index i the count of numbers that belong to bin i. The first bin always starts with zero.
On empty input you should return empty output.
Examples:
For input data [1, 1, 0, 1, 3, 2, 6] and binWidth=1 the result will be [1, 3, 1, 1, 0, 0, 1] as the data contains single element "0", 3 elements "1" etc.
For the same data and binWidth=2 the result will be [4, 2, 0, 1]
For input data [7] and binWidth=1the result will be [0, 0, 0, 0, 0, 0, 0, 1]
Пояснение задачи:
Задача состоит в том, чтобы построить гистограмму частотности значений входного массива относительно заданного размера «ящика» (bin width).
Пояснение:
Нам дан массив неотрицательных целых чисел и ширина «ящика» (bin width).
Нужно сформировать массив, в котором индекс i соответствует количеству элементов исходного массива, попадающих в диапазон от i * {bin width} до (i+1) * {bin width} - 1.
При этом:
- Массив результатов строится так, что индекс i хранит количество элементов, попадающих в интервал [i ... {bin width}, (i + 1) ... {bin width} - 1].
- Если входной массив пуст, результат тоже будет пустой массив.
- Первый «ящик» начинается с нуля, то есть первый элемент результата соответствует интервалу [0, {bin width}-1], второй элемент — интервалу [{bin width}, 2 ... {bin width}-1] и так далее.
Примеры
- Пример 1:
Вход: `[1, 1, 0, 1, 3, 2, 6]`, ширина bins = 1 Результат: `[1, 3, 1, 1, 0, 0, 1]`
Объяснение:
- Элемент 0 попадает в первый ящик (0–0),
- три элемента 1 попадают во второй ящик (1–1),
- один элемент 2 попадает в третий ящик (2–2),
- один элемент 3 попадает в четвёртый ящик (3–3),
- остальные элементы не попадают ни в какой ящик, поэтому последние два ящика пусты.
- Пример 2:
Вход: `[1, 1, 0, 1, 3, 2, 6]`, ширина bins = 2 Результат: `[4, 2, 0, 1]`
Объяснение: -
Четыре элемента (0, 1, 1, 1) попадают в первый ящик (0–1),
- два элемента (2, 3) попадают во второй ящик (2–3),
- третий ящик пуст,
- один элемент (6) попадает в последний
Платформа: CodeWars
Название задачи: Sum The Tree (Суммируем Дерево)
Ссылка на задачу: https://www.codewars.com/kata/5800580f8f7ddaea13000025
Сложность: 6 kyu
Уже решили (На момент написания статьи): 5 385 из 16 379
Тэги: Trees, Recursion, Binary Trees, Binary Search Trees, Data Structures, Fundamentals
Оригинальное описание задачи:
Given a node object representing a binary tree:
example of a node object:
const node ={
value: 1,
left: {value: 2, right: null, left: null},
right: null
};
write a function that returns the sum of all values, including the root.Absence of a node will be indicated with a `null` value.
Examples:
10
| \
1 2
=> 13
1
| \
0 0
\
2 => 3
Пояснение задачи:
Требуется написать функцию, вычисляющую сумму значений всех узлов бинарного дерева, включая корень.
Если узел отсутствует (указатель на него равен `null`, `None`, `nullptr` или `null`), то такой узел игнорируется.
Пояснение:
Для решения задачи используется рекурсивный подход:
1. Базовый случай: Если узел является пустым (`null`), возвращаем 0.
2. Рекурсивная обработка:
Для каждого узла суммируем значение текущего узла и рекурсивно суммируем значения левого и правого поддеревьев.
Таким образом, алгоритм последовательно проходит по всем узлам дерева, складывая их значения, пока не достигнет листьев.
Пример:
Для следующего дерева:
10
/ \
1 2
Сумма будет равна 10 + 1 + 2 = 13.
Или для дерева:
1
| \
0 0
\
2
Сумма равна 1 + 0 + 0 + 2 = 3.
Алгоритм:
- Начинаем с корня дерева.
- Проверяем наличие левого и правого потомков.
- Рекурсивно проходим по левому и правому поддереву, суммируя значения узлов.
- Возвращаем итоговую сумму.
Пример реализации на C++:
int sumTree(node *root)
{ if (!root) return 0; return root->value + sumTree(root->left) + sumTree(root->right); }
Функция принимает указатель на корневой узел дерева и возвращает общую сумму значений всех узлов.
Платформа: CodeWars
Название задачи: Vector class (Векторный класс)
Ссылка на задачу: https://www.codewars.com/kata/526dad7f8c0eb5c4640000a4
Сложность: 5 kyu
Уже решили (На момент написания статьи): 9 671 из 102 962
Тэги: Object-oriented Programming, Algorithms, Linear Algebra
Оригинальное описание задачи:
Create a Vector object that supports addition, subtraction, dot products, and norms.
So, for example:
a = Vector([1, 2, 3])
b = Vector([3, 4, 5])
c = Vector([5, 6, 7, 8])
a.add(b) # should return a new Vector([4, 6, 8])
a.subtract(b) # should return a new Vector([-2, -2, -2])
a.dot(b) # should return 1*3 + 2*4 + 3*5 = 26
a.norm() # should return sqrt(1^2 + 2^2 + 3^2) = sqrt(14)
a.add(c) # raises an exception
If you try to add, subtract, or dot two vectors with different lengths, you must throw an error!
Also provide:
- a `toString` method, so that using the vectors from above, `a.toString() === '(1,2,3)'` (in Python, this is a `__str__` method, so that `str(a) == '(1,2,3)'`. In PHP, this is `__toString` magic method)
- an `equals` method, to check that two vectors that have the same components are equal Note:the test cases will utilize the user-provided `equals` method.
Пояснение задачи:
Необходимо реализовать класс `Vector`, поддерживающий следующие операции:
- Сложение (`add`): возвращает новый вектор, являющийся суммой текущего вектора и переданного аргумента.
- Вычитание (`subtract`): возвращает новый вектор, являющийся разностью текущего вектора и переданного аргумента.
- Умножение скалярное (точка, `dot`): вычисляет скалярное произведение двух векторов.
- Норма (`norm`): возвращает длину вектора (модуль вектора), равную квадратному корню суммы квадратов всех компонент.
Дополнительные требования:
- Операции сложения и вычитания допустимы только между векторами одинаковой длины.
- Если длина векторов различается, операция должна завершаться ошибкой.
- Реализовать метод `toString`, возвращающий строку вида `(x1, x2, ..., xn)` (в Python — метод `__str__`, в PHP — магический метод `__toString`).
- Реализовать метод сравнения `equals`, позволяющий проверить равенство векторов по компонентам.
Примеры:
python
a = Vector([1, 2, 3])
b = Vector([3, 4, 5])
Сложение result = a.add(b) [(1+3, 2+4, 3+5)] -> [4, 6, 8]
Вычитание result = a.subtract(b) [(1-3, 2-4, 3-5)] -> [-2, -2, -2]
Скалярное произведение result = a.dot(b) 1*3 + 2*4 + 3*5 = 26
Норма result = a.norm() √(1² + 2² + 3²) = √14
Строковое представление print(a.to_string()) '1, 2, 3'
Проверка равенства:
print(a.equals(Vector([1, 2, 3]))) True
print(a.equals(Vector([1, 2, 4]))) False
При попытке сложить или вычесть векторы разной длины должно возникать исключение или ошибка.
На текущий момент я завершаю свой рассказ. Надеюсь, прочитанное материала показалось вам действительно интересным, спасибо за проявленный интерес. Присоединяйтесь к моему пути в освоении алгоритмов, предлагайте свои варианты и высказывайте мысли в комментариях, придерживаясь при этом дружелюбной атмосферы! До встречи в следующем материале!
Вступайте в нашу телеграмм-группу Инфостарт