Приветствую читателей этой статьи, в которой собраны интересные и разнообразные задачи по алгоритмам и структурам данных, подходящие для разных уровней подготовки. Здесь вы найдете задания из проверенных источников — от простых до сложных, чтобы каждый мог проверить свои силы и навыки в программировании. Статья направлена на развитие практических умений в решении типовых задач, поддержание активного мышления и, конечно, на приятное времяпрепровождение за увлекательным процессом написания кода.
Что было раньше:
В предыдущей части мы решили:
- How old will I be in 2099? (Сколько мне будет лет в 2099 году?)
- Responsible Drinking (Ответственное употребление алкоголя)
- Histogram data (Данные гистограммы)
- Sum The Tree (Суммируем Дерево)
- Vector class (Векторный класс)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Alphabet war (Алфавитная война)
Ссылка на задачу: https://www.codewars.com/kata/59377c53e66267c8f6000027
Сложность: 7 kyu
Уже решили (На момент написания статьи): 20 859 из 56 093
Тэги: Fundamentals, Strings
Оригинальное описание задачи:
Introduction
There is a war and nobody knows
- the alphabet war! There are two groups of hostile letters.
The tension between left side letters and right side letters was too high and the war began.
Task
Write a function that accepts `fight` string consists of only small letters and return who wins the fight.
When the left side wins return `Left side wins!`, when the right side wins return `Right side wins!`, in other case return `Let's fight again!`.
The left side letters and their power:
w - 4
p - 3
b - 2
s - 1
The right side letters and their power:
m - 4
q - 3
d - 2
z - 1
The other letters don't have power and are only victims.
Sum up each side's letters' power values to determine which side wins.
Example
AlphabetWar("z"); //=> Right side wins!
AlphabetWar("zdqmwpbs"); //=> Let's fight again!
AlphabetWar("zzzzs"); //=> Right side wins!
AlphabetWar("wwwwwwz"); //=> Left side wins!
Пояснение задачи:
Пояснение задачи «Алфавитная война»
Есть конфликт между двумя сторонами букв алфавита — левой и правой.
Каждая сторона имеет набор букв с определённой силой (балльной оценкой):
Силы сторон:
Левая сторона:
- w: сила = 4
- p: сила = 3
- b: сила = 2
- s: сила = 1
Правая сторона:
- m: сила = 4
- q: сила = 3
- d: сила = 2
- z: сила =1
Все остальные буквы считаются нейтральными и не участвуют в подсчёте силы.
Необходимо написать функцию, принимающую строку, состоящую только из маленьких букв английского алфавита, и определить победителя в «алфавитной войне». Если победила левая сторона, возвращаем сообщение «Left side wins!»; если правая — «Right side wins!»; в противном случае («ничья») — «Let's fight again!».
Пример работы функции:
def alphabet_war(fight: str) -> str:
Определим силы каждой стороны
left_side = {'w': 4, 'p': 3, 'b': 2, 's': 1}
right_side = {'m': 4, 'q': 3, 'd': 2, 'z': 1}
Подсчитаем суммарную силу каждой стороны
left_power = sum(left_side.get(char, 0) for char in fight)
right_power = sum(right_side.get(char, 0) for char in fight)
if left_power > right_power: return "Left side wins!"
lif right_power > left_power: return "Right side wins!"
else: return "Let's fight again!"
Примеры:
Левая сторона побеждает
print(alphabet_war("wwwwwwz"))
Output: "Left side wins!"
Правая сторона побеждает print(alphabet_war("zzzzs"))
Output: "Right side wins!"
Ничья print(alphabet_war("zdqmwpbs"))
Output: "Let's fight again!"
Задача 2
Платформа: CodeWars
Название задачи: Matrix Weight (Вес матрицы)
Ссылка на задачу: https://www.codewars.com/kata/6347f9715467f0001b434936
Сложность: 7 kyu
Уже решили (На момент написания статьи): 643 из 2 582
Тэги: Matrix
Оригинальное описание задачи:
A matrix is "fat" when the sum of the roots of its "Widths" is greater than the sum of the roots of its "Heights". Otherwise, we call it as a "thin" matrix.
But what is the meaning of that?
A Width of a matrix is the sum of all the elements in a row.
Similarly, a Height of a matrix is the sum of all the elements in a column.
Difficult to assimilate? Let's look at an example.
The matrix [ [1, 3] , [5, 7] ] :
- Sum of rooted Widths: √(1+3) + √(5+7) = √4 + √12
- Sum of rooted Heights: √(1+5) + √(3+7) = √6 + √10
Since "width" is smaller than "height", we determine this matrix is "thin".
The matrix [ [1, 4, 7], [2, 5, 8], [3, 6, 9] ] :
- Sum of rooted Widths:√(1+4+7) + √(2+5+8) + √(3+6+9) = √12 + √15 + √18 = 11.57972565...
- Sum of rooted Heights: √(1+2+3) + √(4+5+6) + √(7+8+9) = √6 + √15 + √24 = 11.22145257...
Since "height" is smaller than "width", we determine this matrix is "fat".
TASK:
Your task is to return "thin", "fat" or "perfect" depending on the results obtained.
NOTES:
- All matrices will be squared
- In case that both sums are equal, the matrix will be considered as "perfect".
- DON'T round the roots... every digit matters ;)
Since the results of the roots may have a slight variation, to determine that a matrix is "perfect", I suggest you use an approximate error of 1E- 10.
- If a Width or a Height is negative, return None
Пояснение задачи:
Задача заключается в определении типа матрицы по её ширине и высоте, вычисленных специальным образом. Описание матрицы:
Матрица считается:
- «Тонкой» (thin) — если сумма корней квадратного корня ширины матрицы больше суммы корней высоты.
- «Толстой» (fat) — если наоборот, сумма корней высоты больше суммы корней ширины.
- «Идеальной» (perfect) — когда суммы корней ширины и высоты равны с точностью до погрешности 10^{-10}.
Определение ширины и высоты:
- Ширина матрицы (Width) — это сумма всех элементов строки.
- Высота матрицы (Height) — это сумма всех элементов столбца.
Алгоритм решения:
1. Для каждой строки и каждого столбца вычисляем сумму элементов.
2. Вычисляем квадратный корень от суммы элементов строки и столбца.
3. Суммируем полученные корни для ширины и высоты матрицы.
4. Сравниваем суммы: - Если ширина больше высоты — матрица тонкая («thin»).
- Если высота больше ширины — матрица толстая («fat»).
- Если разница между суммами меньше погрешности 10^{-10} — матрица идеальная («perfect»).
5. Если при вычислении квадратного корня получаем отрицательное значение (например, при сумме элементов строки или столбца меньше нуля), возвращаем `None`.
Примеры:
Для матрицы:
\begin{bmatrix}
1 , 3
5 , 7 \end{bmatrix}
Суммы корней ширины: √{1+3}+√{5+7} = √{4}+√{12}
Суммы корней высоты: √{1+5}+√{3+7} = √{6}+√{10}
Поскольку √{4}+√{12} < √{6}+√{10}, матрица является тонкой («thin»).
Для матрицы:
\begin{bmatrix}
1 , 4 ,7
2 ,5 , 8
3 , 6 , 9
\end{bmatrix}
Суммы корней ширины: √{1+4+7}+√{2+5+8}+√{3+6+9} = √{12}+√{15}+√{18}
Суммы корней высоты: {1+2+3}
Задача 3
Платформа: CodeWars
Название задачи: Find Nearest square number (Найдите ближайшее число квадрата)
Ссылка на задачу: https://www.codewars.com/kata/5a805d8cafa10f8b930005ba
Сложность: 8 kyu
Уже решили (На момент написания статьи): 26 812 из 63 506
Тэги: Fundamentals, Mathematics
Оригинальное описание задачи:
Your task is to find the nearest square number of a positive integer `n`. In mathematics, a square number or perfect square is an integer that is the square of an integer; in other words, it is the product of some integer with itself.
For example, if `n = 111`, then the nearest square number equals 121, since 111 is closer to 121, the square of 11, than 100, the square of 10.
If `n` is already a perfect square (e.g. `n = 144`, `n = 81`, etc.), you need to just return `n`.
Good luck :)
Пояснение задачи:
Задача заключается в поиске ближайшего квадрата целого числа к заданному числу n .
Пояснение:
Для решения задачи необходимо:
1. Найти ближайший квадрат:
- Если число n само является квадратом целого числа, возвращаем его.
- Иначе ищем ближайшие меньший и больший квадраты от n, проверяя, какое из них ближе.
2. Алгоритм поиска:
- Для нахождения ближайшего квадрата используем следующий подход:
- Сначала находим наименьшее целое число m, такое что m^2 > n .
- Затем сравниваем расстояние от n до m^2 и до (m-1)^2 .
- Возвращаем тот квадрат, который ближе к n .
Примеры
- Пример 1:
n = 111
- Ближайшие квадраты:10^2 = 100 и 11^2 = 121
- Расстояние до 100: |111 - 100| = 11
- Расстояние до 121: |111 - 121| = 10
- Ответ:121 (так как оно ближе)
- Пример 2:
n = 144
- Число 144 само является квадратом 12^2 , возвращаем 144.
- Пример 3:
n = 81
- Число 81 само является квадратом 9^2, возвращаем 81.
Подход к решению:
Можно использовать простой алгоритм, который последовательно увеличивает целые числа m и вычисляет их квадраты, пока не найдём первый квадрат больше n.
После этого сравниваем расстояния до текущего и предыдущего квадрата и возвращаем ближайший.
Таким образом, задача сводится к нахождению ближайших квадратов и выбору наиболее подходящего из них.
Задача 4
Платформа: CodeWars
Название задачи: Merge two sorted arrays into one (Объединить два отсортированных массива в один.)
Ссылка на задачу: https://www.codewars.com/kata/5899642f6e1b25935d000161
Сложность: 8 kyu
Уже решили (На момент написания статьи): 44 813 из 130 033
Тэги: Fundamentals, Arrays
Оригинальное описание задачи:
You are given two sorted arrays that contain only integers. These arrays may be sorted in either ascending or descending order. Your task is to merge them into a single array, ensuring that:
The resulting array is sorted in ascending order.
Any duplicate values are removed, so each integer appears only once.
If both input arrays are empty, return an empty array.
No input validation is needed, as both arrays are guaranteed to contain zero or more integers.
Examples:
(input -> output)
[1, 2, 3, 4, 5], [6, 7, 8, 9, 10] -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 3, 5, 7, 9], [10, 8, 6, 4, 2] -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 3, 5, 7, 9, 11, 12], [1, 2, 3, 4, 5, 10, 12] -> [1, 2, 3, 4, 5, 7, 9, 10, 11, 12]
Happy coding!
Пояснение задачи:
Задача состоит в объединении двух отсортированных массивов целых чисел в один отсортированный массив, соблюдая следующие условия:
- Массивы могут быть отсортированы либо в порядке возрастания, либо убывания.
- Результат должен быть отсортирован строго по возрастанию.
- Из результата должны быть удалены дублирующиеся элементы.
- Если оба массива пусты, результатом будет пустой массив.
Пояснение к решению:
1.Слияние отсортированных массивов Поскольку исходные массивы уже отсортированы, задача сводится к эффективному слиянию этих массивов в один, сохраняя порядок сортировки и исключая повторяющиеся элементы.
2.Удаление дубликатов Для удаления дубликатов удобно использовать метод работы с множествами (`set`), поскольку множества автоматически удаляют повторяющиеся элементы.
3.Обработка пустых массивов Если хотя бы один из массивов пуст, результатом будет пустой массив.
Пример реализации:
Пусть даны два массива:
array1 = [1, 3, 5, 7, 9, 11, 12] array2 = [1, 2, 3, 4, 5, 10, 12]
Объединяем их, получаем:
[1, 1, 2, 3, 3, 4, 5, 5, 7, 9, 10, 11, 12]
Используя множества, получаем:
{1, 2, 3, 4, 5, 7, 9, 10, 11, 12}
Затем сортируем полученный набор и получаем финальный результат:
[1, 2, 3, 4, 5, 7, 9, 10, 11, 12]
Таким образом, результат получается корректный и удовлетворяет условиям задачи.
Задача 5
Платформа: CodeWars
Название задачи: Alphabet war - airstrike - letters massacre (Алфавитная война - авиаудар - резня букв)
Ссылка на задачу: https://www.codewars.com/kata/5938f5b606c3033f4700015a
Сложность: 6 kyu
Уже решили (На момент написания статьи): 4 721 из 27 723
Тэги: Fundamentals, Strings
Оригинальное описание задачи:
Introduction
There is a war... between alphabets! There are two groups of hostile letters.
The tension between left side letters and right side letters was too high and the war began. The letters called airstrike to help them in war - dashes and dots are spread throughout the battlefield. Who will win?
Task
Write a function that accepts a `fight` string which consists of only small letters and `*` which represents a bomb drop place. Return who wins the fight after bombs are exploded. When the left side wins return `Left side wins!`, and when the right side wins return `Right side wins!`. In other cases, return `Let's fight again!`.
The left side letters and their power:
w - 4
p - 3
b - 2
s - 1
The right side letters and their power:
m - 4
q - 3
d - 2
z - 1
The other letters don't have power and are only victims. Sum up each side's letters' power values to determine which side wins. The `*` bombs kill the adjacent letters ( i.e. `aa*aa` => `a___a`, `**aa**` => `______` )
Example
(Input --> Output)
"s*zz" --> "Right side wins!"
"*zd*qm*wp*bs*" --> "Let's fight again!"
"zzzz*s*" --> "Right side wins!"
"www*www****z" --> "Left side wins!"
Пояснение задачи:
На поле боя столкнулись две враждующие группы букв: буквы слева и буквы справа.
Между ними разгорелась ожесточённая битва, во время которой были сброшены бомбы («*»), уничтожающие соседние буквы. Каждая буква имеет определённую боевую силу, и задача состоит в том, чтобы определить победителя после взрыва бомб.
Задача:
Реализуйте функцию, принимающую строку-сражение (`fight`), состоящую из маленьких букв латинского алфавита и символов `*`, обозначающих места падения бомб. Функция должна возвратить сообщение о победителе сражения:
- Если побеждает левая сторона, выводится строка `"Left side wins!"`
- Если побеждает правая сторона, выводится `"Right side wins!"`
- Если сражение продолжается и ничья невозможна, выводится `"Let's fight again!"`
Правила битвы:
- Буквы имеют следующие боевые силы:
- Левая сторона: `w → 4`, `p → 3`, `b → 2`, `s → 1`
- Правая сторона: `m → 4`, `q → 3`, `d → 2`, `z → 1`
- Остальные буквы не обладают силой и считаются жертвами.
- Бомба `*` уничтожает обе соседние буквы (например, `aa*aa` превращается в `a___a`, `aa` становится `______`). - Суммируются силы букв каждой стороны, чтобы определить победителя.
Примеры:
"s*zz" Победа правой стороны: "Right side wins!"
"*zd*qm*wp*bs*" Ничья: "Let's fight again!"
"zzzz*s*" Победа правой стороны: "Right side wins!"
"www*www****z" Победа левой стороны: "Left side wins!"
Дополнительные детали
- Нужно аккуратно обрабатывать строки с бомбами, учитывая их влияние на соседние буквы.
- Необходимо эффективно вычислять суммарную силу каждой стороны и определять победителя.
Заключение:
Платформа: CodeWars
Название задачи: Alphabet war (Алфавитная война)
Ссылка на задачу: https://www.codewars.com/kata/59377c53e66267c8f6000027
Сложность: 7 kyu
Уже решили (На момент написания статьи): 20 859 из 56 093
Тэги: Fundamentals, Strings
Оригинальное описание задачи:
Introduction
There is a war and nobody knows
- the alphabet war! There are two groups of hostile letters.
The tension between left side letters and right side letters was too high and the war began.
Task
Write a function that accepts `fight` string consists of only small letters and return who wins the fight.
When the left side wins return `Left side wins!`, when the right side wins return `Right side wins!`, in other case return `Let's fight again!`.
The left side letters and their power:
w - 4
p - 3
b - 2
s - 1
The right side letters and their power:
m - 4
q - 3
d - 2
z - 1
The other letters don't have power and are only victims.
Sum up each side's letters' power values to determine which side wins.
Example
AlphabetWar("z"); //=> Right side wins!
AlphabetWar("zdqmwpbs"); //=> Let's fight again!
AlphabetWar("zzzzs"); //=> Right side wins!
AlphabetWar("wwwwwwz"); //=> Left side wins!
Пояснение задачи:
Пояснение задачи «Алфавитная война»
Есть конфликт между двумя сторонами букв алфавита — левой и правой.
Каждая сторона имеет набор букв с определённой силой (балльной оценкой):
Силы сторон:
Левая сторона:
- w: сила = 4
- p: сила = 3
- b: сила = 2
- s: сила = 1
Правая сторона:
- m: сила = 4
- q: сила = 3
- d: сила = 2
- z: сила =1
Все остальные буквы считаются нейтральными и не участвуют в подсчёте силы.
Необходимо написать функцию, принимающую строку, состоящую только из маленьких букв английского алфавита, и определить победителя в «алфавитной войне». Если победила левая сторона, возвращаем сообщение «Left side wins!»; если правая — «Right side wins!»; в противном случае («ничья») — «Let's fight again!».
Пример работы функции:
def alphabet_war(fight: str) -> str:
Определим силы каждой стороны
left_side = {'w': 4, 'p': 3, 'b': 2, 's': 1}
right_side = {'m': 4, 'q': 3, 'd': 2, 'z': 1}
Подсчитаем суммарную силу каждой стороны
left_power = sum(left_side.get(char, 0) for char in fight)
right_power = sum(right_side.get(char, 0) for char in fight)
if left_power > right_power: return "Left side wins!"
lif right_power > left_power: return "Right side wins!"
else: return "Let's fight again!"
Примеры:
Левая сторона побеждает
print(alphabet_war("wwwwwwz"))
Output: "Left side wins!"
Правая сторона побеждает print(alphabet_war("zzzzs"))
Output: "Right side wins!"
Ничья print(alphabet_war("zdqmwpbs"))
Output: "Let's fight again!"
Платформа: CodeWars
Название задачи: Matrix Weight (Вес матрицы)
Ссылка на задачу: https://www.codewars.com/kata/6347f9715467f0001b434936
Сложность: 7 kyu
Уже решили (На момент написания статьи): 643 из 2 582
Тэги: Matrix
Оригинальное описание задачи:
A matrix is "fat" when the sum of the roots of its "Widths" is greater than the sum of the roots of its "Heights". Otherwise, we call it as a "thin" matrix.
But what is the meaning of that?
A Width of a matrix is the sum of all the elements in a row.
Similarly, a Height of a matrix is the sum of all the elements in a column.
Difficult to assimilate? Let's look at an example.
The matrix [ [1, 3] , [5, 7] ] :
- Sum of rooted Widths: √(1+3) + √(5+7) = √4 + √12
- Sum of rooted Heights: √(1+5) + √(3+7) = √6 + √10
Since "width" is smaller than "height", we determine this matrix is "thin".
The matrix [ [1, 4, 7], [2, 5, 8], [3, 6, 9] ] :
- Sum of rooted Widths:√(1+4+7) + √(2+5+8) + √(3+6+9) = √12 + √15 + √18 = 11.57972565...
- Sum of rooted Heights: √(1+2+3) + √(4+5+6) + √(7+8+9) = √6 + √15 + √24 = 11.22145257...
Since "height" is smaller than "width", we determine this matrix is "fat".
TASK:
Your task is to return "thin", "fat" or "perfect" depending on the results obtained.
NOTES:
- All matrices will be squared
- In case that both sums are equal, the matrix will be considered as "perfect".
- DON'T round the roots... every digit matters ;)
Since the results of the roots may have a slight variation, to determine that a matrix is "perfect", I suggest you use an approximate error of 1E- 10.
- If a Width or a Height is negative, return None
Пояснение задачи:
Задача заключается в определении типа матрицы по её ширине и высоте, вычисленных специальным образом. Описание матрицы:
Матрица считается:
- «Тонкой» (thin) — если сумма корней квадратного корня ширины матрицы больше суммы корней высоты.
- «Толстой» (fat) — если наоборот, сумма корней высоты больше суммы корней ширины.
- «Идеальной» (perfect) — когда суммы корней ширины и высоты равны с точностью до погрешности 10^{-10}.
Определение ширины и высоты:
- Ширина матрицы (Width) — это сумма всех элементов строки.
- Высота матрицы (Height) — это сумма всех элементов столбца.
Алгоритм решения:
1. Для каждой строки и каждого столбца вычисляем сумму элементов.
2. Вычисляем квадратный корень от суммы элементов строки и столбца.
3. Суммируем полученные корни для ширины и высоты матрицы.
4. Сравниваем суммы: - Если ширина больше высоты — матрица тонкая («thin»).
- Если высота больше ширины — матрица толстая («fat»).
- Если разница между суммами меньше погрешности 10^{-10} — матрица идеальная («perfect»).
5. Если при вычислении квадратного корня получаем отрицательное значение (например, при сумме элементов строки или столбца меньше нуля), возвращаем `None`.
Примеры:
Для матрицы:
\begin{bmatrix}
1 , 3
5 , 7 \end{bmatrix}
Суммы корней ширины: √{1+3}+√{5+7} = √{4}+√{12}
Суммы корней высоты: √{1+5}+√{3+7} = √{6}+√{10}
Поскольку √{4}+√{12} < √{6}+√{10}, матрица является тонкой («thin»).
Для матрицы:
\begin{bmatrix}
1 , 4 ,7
2 ,5 , 8
3 , 6 , 9
\end{bmatrix}
Суммы корней ширины: √{1+4+7}+√{2+5+8}+√{3+6+9} = √{12}+√{15}+√{18}
Суммы корней высоты: {1+2+3}
Платформа: CodeWars
Название задачи: Find Nearest square number (Найдите ближайшее число квадрата)
Ссылка на задачу: https://www.codewars.com/kata/5a805d8cafa10f8b930005ba
Сложность: 8 kyu
Уже решили (На момент написания статьи): 26 812 из 63 506
Тэги: Fundamentals, Mathematics
Оригинальное описание задачи:
Your task is to find the nearest square number of a positive integer `n`. In mathematics, a square number or perfect square is an integer that is the square of an integer; in other words, it is the product of some integer with itself.
For example, if `n = 111`, then the nearest square number equals 121, since 111 is closer to 121, the square of 11, than 100, the square of 10.
If `n` is already a perfect square (e.g. `n = 144`, `n = 81`, etc.), you need to just return `n`.
Good luck :)
Пояснение задачи:
Задача заключается в поиске ближайшего квадрата целого числа к заданному числу n .
Пояснение:
Для решения задачи необходимо:
1. Найти ближайший квадрат:
- Если число n само является квадратом целого числа, возвращаем его.
- Иначе ищем ближайшие меньший и больший квадраты от n, проверяя, какое из них ближе.
2. Алгоритм поиска:
- Для нахождения ближайшего квадрата используем следующий подход:
- Сначала находим наименьшее целое число m, такое что m^2 > n .
- Затем сравниваем расстояние от n до m^2 и до (m-1)^2 .
- Возвращаем тот квадрат, который ближе к n .
Примеры
- Пример 1:
n = 111
- Ближайшие квадраты:10^2 = 100 и 11^2 = 121
- Расстояние до 100: |111 - 100| = 11
- Расстояние до 121: |111 - 121| = 10
- Ответ:121 (так как оно ближе)
- Пример 2:
n = 144
- Число 144 само является квадратом 12^2 , возвращаем 144.
- Пример 3:
n = 81
- Число 81 само является квадратом 9^2, возвращаем 81.
Подход к решению:
Можно использовать простой алгоритм, который последовательно увеличивает целые числа m и вычисляет их квадраты, пока не найдём первый квадрат больше n.
После этого сравниваем расстояния до текущего и предыдущего квадрата и возвращаем ближайший.
Таким образом, задача сводится к нахождению ближайших квадратов и выбору наиболее подходящего из них.
Платформа: CodeWars
Название задачи: Merge two sorted arrays into one (Объединить два отсортированных массива в один.)
Ссылка на задачу: https://www.codewars.com/kata/5899642f6e1b25935d000161
Сложность: 8 kyu
Уже решили (На момент написания статьи): 44 813 из 130 033
Тэги: Fundamentals, Arrays
Оригинальное описание задачи:
You are given two sorted arrays that contain only integers. These arrays may be sorted in either ascending or descending order. Your task is to merge them into a single array, ensuring that:
The resulting array is sorted in ascending order.
Any duplicate values are removed, so each integer appears only once.
If both input arrays are empty, return an empty array.
No input validation is needed, as both arrays are guaranteed to contain zero or more integers.
Examples:
(input -> output)
[1, 2, 3, 4, 5], [6, 7, 8, 9, 10] -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 3, 5, 7, 9], [10, 8, 6, 4, 2] -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 3, 5, 7, 9, 11, 12], [1, 2, 3, 4, 5, 10, 12] -> [1, 2, 3, 4, 5, 7, 9, 10, 11, 12]
Happy coding!
Пояснение задачи:
Задача состоит в объединении двух отсортированных массивов целых чисел в один отсортированный массив, соблюдая следующие условия:
- Массивы могут быть отсортированы либо в порядке возрастания, либо убывания.
- Результат должен быть отсортирован строго по возрастанию.
- Из результата должны быть удалены дублирующиеся элементы.
- Если оба массива пусты, результатом будет пустой массив.
Пояснение к решению:
1.Слияние отсортированных массивов Поскольку исходные массивы уже отсортированы, задача сводится к эффективному слиянию этих массивов в один, сохраняя порядок сортировки и исключая повторяющиеся элементы.
2.Удаление дубликатов Для удаления дубликатов удобно использовать метод работы с множествами (`set`), поскольку множества автоматически удаляют повторяющиеся элементы.
3.Обработка пустых массивов Если хотя бы один из массивов пуст, результатом будет пустой массив.
Пример реализации:
Пусть даны два массива:
array1 = [1, 3, 5, 7, 9, 11, 12] array2 = [1, 2, 3, 4, 5, 10, 12]
Объединяем их, получаем:
[1, 1, 2, 3, 3, 4, 5, 5, 7, 9, 10, 11, 12]
Используя множества, получаем:
{1, 2, 3, 4, 5, 7, 9, 10, 11, 12}
Затем сортируем полученный набор и получаем финальный результат:
[1, 2, 3, 4, 5, 7, 9, 10, 11, 12]
Таким образом, результат получается корректный и удовлетворяет условиям задачи.
Платформа: CodeWars
Название задачи: Alphabet war - airstrike - letters massacre (Алфавитная война - авиаудар - резня букв)
Ссылка на задачу: https://www.codewars.com/kata/5938f5b606c3033f4700015a
Сложность: 6 kyu
Уже решили (На момент написания статьи): 4 721 из 27 723
Тэги: Fundamentals, Strings
Оригинальное описание задачи:
Introduction
There is a war... between alphabets! There are two groups of hostile letters.
The tension between left side letters and right side letters was too high and the war began. The letters called airstrike to help them in war - dashes and dots are spread throughout the battlefield. Who will win?
Task
Write a function that accepts a `fight` string which consists of only small letters and `*` which represents a bomb drop place. Return who wins the fight after bombs are exploded. When the left side wins return `Left side wins!`, and when the right side wins return `Right side wins!`. In other cases, return `Let's fight again!`.
The left side letters and their power:
w - 4
p - 3
b - 2
s - 1
The right side letters and their power:
m - 4
q - 3
d - 2
z - 1
The other letters don't have power and are only victims. Sum up each side's letters' power values to determine which side wins. The `*` bombs kill the adjacent letters ( i.e. `aa*aa` => `a___a`, `**aa**` => `______` )
Example
(Input --> Output)
"s*zz" --> "Right side wins!"
"*zd*qm*wp*bs*" --> "Let's fight again!"
"zzzz*s*" --> "Right side wins!"
"www*www****z" --> "Left side wins!"
Пояснение задачи:
На поле боя столкнулись две враждующие группы букв: буквы слева и буквы справа.
Между ними разгорелась ожесточённая битва, во время которой были сброшены бомбы («*»), уничтожающие соседние буквы. Каждая буква имеет определённую боевую силу, и задача состоит в том, чтобы определить победителя после взрыва бомб.
Задача:
Реализуйте функцию, принимающую строку-сражение (`fight`), состоящую из маленьких букв латинского алфавита и символов `*`, обозначающих места падения бомб. Функция должна возвратить сообщение о победителе сражения:
- Если побеждает левая сторона, выводится строка `"Left side wins!"`
- Если побеждает правая сторона, выводится `"Right side wins!"`
- Если сражение продолжается и ничья невозможна, выводится `"Let's fight again!"`
Правила битвы:
- Буквы имеют следующие боевые силы:
- Левая сторона: `w → 4`, `p → 3`, `b → 2`, `s → 1`
- Правая сторона: `m → 4`, `q → 3`, `d → 2`, `z → 1`
- Остальные буквы не обладают силой и считаются жертвами.
- Бомба `*` уничтожает обе соседние буквы (например, `aa*aa` превращается в `a___a`, `aa` становится `______`). - Суммируются силы букв каждой стороны, чтобы определить победителя.
Примеры:
"s*zz" Победа правой стороны: "Right side wins!"
"*zd*qm*wp*bs*" Ничья: "Let's fight again!"
"zzzz*s*" Победа правой стороны: "Right side wins!"
"www*www****z" Победа левой стороны: "Left side wins!"
Дополнительные детали
- Нужно аккуратно обрабатывать строки с бомбами, учитывая их влияние на соседние буквы.
- Необходимо эффективно вычислять суммарную силу каждой стороны и определять победителя.
На этом у меня всё! Надеюсь, вам было интересно погрузиться в эту тему. Спасибо, что дочитали до конца! Буду рад увидеть вас в комментариях: делитесь своими мыслями, предлагайте решения и давайте поддерживать здесь уютную атмосферу. До встречи в новых постах!
Вступайте в нашу телеграмм-группу Инфостарт