Приветствую читателей этой подборки интересных задачек по программированию — здесь собраны разнообразные задания различной сложности, подходящие как новичкам, так и опытным разработчикам. Статья поможет вам потренировать умение решать алгоритмические головоломки, поддерживать навыки написания качественного кода и весело провести время, погружаясь в увлекательный мир программирования.
Что было раньше:
В предыдущей части мы решили:
- Be Concise III - Sum Squares (Будьте лаконичны III - Суммируйте квадраты)
- Freudian translator (Переводчик-фрейдист)
- Music 1: How Many Quarter Notes? (Музыка 1: Сколько четвертных нот?)
- Sum of odd numbers (Сумма нечетных чисел)
- Find the missing letter (Найдите пропавшую букву)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Sort and Star (Сортировка и звездочка)
Ссылка на задачу: https://www.codewars.com/kata/57cfdf34902f6ba3d300001e
Сложность: 8 kyu
Уже решили (На момент написания статьи): 58 060 из 159 317
Тэги: Основы, строки, массивы, сортировка
Оригинальное описание задачи:
You will be given a list of strings. You must sort it alphabetically (case-sensitive, and based on the ASCII values of the chars) and then return the first value.
The returned value must be a string, and have `"***"` between each of its letters.
You should not remove or add elements from/to the array.
Пояснение задачи:
Задача требует:
- Принять на вход список строк.
- Отсортировать строки алфавитно (учитывая регистр букв и порядок ASCII-кодов символов).
- Вернуть первую строку из отсортированного списка, преобразованную таким образом, чтобы между каждой буквой вставлялась последовательность `"***"`.
Например:
вход: ["apple", "banana", "cherry"]
выход: "a***p***p***l***e"
вход: ["Zebra", "Ant", "Camel"]
выход: "A***n***t"
Решение предполагает:
1. Сортировка списка строк по возрастанию (по умолчанию сортировка учитывает регистр и ASCII-код символов).
2. Преобразование первой строки после сортировки в строку, где каждая буква разделена последовательностью "***".
Задача 2
Платформа: CodeWars
Название задачи: Simple consecutive pairs (Простые последовательные пары)
Ссылка на задачу: https://www.codewars.com/kata/5a3e1319b6486ac96f000049
Сложность: 7 kyu
Уже решили (На момент написания статьи): 11 897 из 30 373
Тэги: Массивы, основы
Оригинальное описание задачи:
In this Kata your task will be to return the count of pairs that have consecutive numbers. The first pair consists of the first and second element of the input, the second pair is the next two elements (3rd and 4th), etc. If the input ends with an element without a pair, it should be ignored.
For example, `[1,2,5,8,-4,-3,7,6,5]` has 3 such pairs. Candidate pairs are selected as follows: `[(1,2), (5,8), (-4,-3), (7,6), 5]`.
- the first pair is `(1,2)` and the numbers in the pair are consecutive; Count = 1
- the second pair is `(5,8)` and the numbers are not consecutive.
- the third pair is `(-4,-3)`, consecutive. Count = 2.
- the fourth pair is `(7,6)`, also consecutive. Count = 3.
- the last element has no pair, so we ignore.
Good luck!
Пояснение задачи:
Задача состоит в том, чтобы найти количество последовательных пар чисел в списке, где каждая пара соседних элементов считается последовательной, если разница между ними равна единице.
Пояснение:
- Входная последовательность разбивается на пары соседних элементов.
- Каждая пара сравнивается: если разница между элементами пары равна 1, пара считается последовательной и учитывается в итоговом результате.
- Последняя одиночная элемент списка игнорируется, поскольку он не образует пару.
Пример:
Вход: `[1, 2, 5, 8, -4, -3, 7, 6, 5]`
Пары:
- Первая пара: (1, 2) → разница 2 - 1 = 1 → последовательная пара, счетчик увеличивается на 1.
- Вторая пара: (5, 8) → разница 8 - 5 = 3 → не последовательная пара.
- Третья пара: (-4, -3) → разница -3 - (-4) = 1 → последовательная пара, счетчик увеличивается еще на 1.
- Четвертая пара: (7, 6) → разница 6 - 7 = -1 → последовательная пара, счетчик увеличивается еще на 1.
Итоговый результат:
Последовательных пар найдено три.
Алгоритм:
1. Проходим по списку элементов, начиная с первого и второго элемента.
2. Проверяем каждую следующую пару элементов на разницу в один.
3. Если разница равна 1, увеличиваем счётчик последовательных пар.
4. Игнорируем последний элемент, если он остался без пары.
Примеры:
- Вход: `[1, 2, 3, 4, 5, 6]` Выход: 5 последовательных пар.
- Вход: `[1, 3, 5, 7, 9]` Выход: 0 последовательных пар.
- Вход: `[1, 2, 4, 5, 6, 8]` Выход: 2 последовательных пары.
Задача 3
Платформа: CodeWars
Название задачи: Simple Fun #384: Is Turing's Equation? (Простое развлечение)
Ссылка на задачу: https://www.codewars.com/kata/5a1e6323ffe75f71ae000026
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 946 из 6 491
Тэги: Основы, строки, математика
Оригинальное описание задачи:
Story
Joe Stoy, in his book "Denotational Semantics", tells following story:
The decision which way round the digits run is, of course, mathematically trivial. Indeed, one early British computer had numbers running from right to left (because the spot on an oscilloscope tube runs from left to right, but in serial logic the least significant digits are dealt with first).
Turing used to mystify audiences at public lectures when, quite by accident, he would slip into this mode even for decimal arithmetic, and write things like 73+42=16.
The next version of the machine was made more conventional simply by crossing the x-deflection wires: this, however, worried the engineers, whose waveforms were all backwards. That problem was in turn solved by providing a little window so that the engineers (who tended to be behind the computer anyway) could view the oscilloscope screen from the back.
[C. Strachey - private communication.]
You will play the role of the audience and judge on the truth value of Turing's equations.
Task
You are given a string `s`. It's an equation such as "a+b=c", where `a`, `b`, `c` are numbers made up of digits 0 to 9. This includes possible leading or trailing zeros. The equations will not contain any spaces.
Your task is to determine whether `s` is a valid Turing equation. Return `true` or `false`, respectively, in Turing's interpretation, i.e. the numbers being read backwards.
Examples
For `s = "73+42=16"`, the output should be `true`:
73 -> 37
42 -> 24
16 -> 61
37+24==61
For `s = "5+8=13"`, the output should be `false`:
5 -> 5
8 -> 8
13 -> 31
5+8!=31
For `s = "10+20=30"`, the output should be `true`:
10 -> 01 -> 1
20 -> 02 -> 2
30 -> 03 -> 3
1+2==3
Note:
- All the numbers `a`, `b`, `c` have no more than 10 digits, excluding leading zeros (read backwards).
- `s` contains only digits, `+`, and `=`. Characters like `-`, `*`, or `/` will not appear in the string.
Пояснение задачи:
Задача заключается в проверке корректности арифметического выражения, записанного в необычной форме, где числа представлены задом наперёд (от младшего значащего разряда к старшему).
Нам дано выражение вида "a+b=c", где `a`, `b`, `c` — это десятичные числа, состоящие из цифр от 0 до 9, записанные в обратном порядке.
Основные шаги решения:
1. Разделим строку на три части: левую часть (`a`), правую часть (`b`) и итоговое число (`c`).
2. Преобразуем каждую часть выражения в обратную форму (перевернём цифры числа):
- Например, число `123` превращается в `321`.
3. Переведём перевернутые числа обратно в десятичную систему счисления.
4. Проверим равенство суммы левой и правой частей выражению, представленному в обратной записи.
Примеры:
- Для строки "73+42=16": - Число `73` переворачивается в `37`, число `42` — в `24`, итоговое число `16` — в `61`.
-Проверяем: 37 + 24 = 61 — верно.
- Для строки "5+8=13": - Число `5` остаётся `5`, число `8` остаётся `8`, итоговое число `13` переворачивается в `31`.
- Проверяем: 5 + 8 ≠ 31 — неверно.
- Для строки "10+20=30": - Число `10` переворачивается в `01`, число `20` — в `02`, итоговое число `30` — в `03`.
- Проверяем: 01 + 02 = 03 — верно.
Таким образом, задача сводится к переворачиванию чисел, представлению их в обычной десятичной системе и проверке арифметического равенства.
Задача 4
Платформа: CodeWars
Название задачи: Single character palindromes (Односимвольные палиндромы)
Ссылка на задачу: https://www.codewars.com/kata/5a2c22271f7f709eaa0005d3
Сложность: 6 kyu
Уже решили (На момент написания статьи): 2 447 из 11 101
Тэги: Алгоритмы
Оригинальное описание задачи:
You will be given a string and you task is to check if it is possible to convert that string into a palindrome by removing a single character. If the string is already a palindrome, return `"OK"`. If it is not, and we can convert it to a palindrome by removing one character, then return `"remove one"`, otherwise return `"not possible"`. The order of the characters should not be changed.
For example:
"abba" -> "OK" - this is a palindrome
"abbaa" -> "remove one" - remove the 'a' at the extreme right
"abbaab" -> "not possible" - cannot be made a palindrome Good luck!
Пояснение задачи:
Задача заключается в проверке возможности преобразования строки в палиндром путём удаления ровно одного символа.
Основные шаги решения:
1. Проверка исходной строки на палиндром Если строка уже является палиндромом, сразу возвращаем "OK".
2. Поиск первого несоответствия Проходим строку слева направо и ищем первое несоответствие между символом и зеркальным символом справа от центра строки. Это значит, что мы находим первую пару символов, которые отличаются друг от друга.
3. Удаление символа и проверка нового состояния Удаляем один из отличающихся символов и проверяем, стала ли строка палиндромом после этого удаления. Если да, возвращаем "remove one".
4. Проверка второго символа Аналогично проверяем второй отличающийся символ, удаляя его и проверяя результат.
5. Отсутствие возможности сделать палиндром Если оба символа удалить нельзя (или ни одно удаление не даёт палиндром), возвращаем "not possible".
Примеры:
- Строка "abba" — палиндром, возвращаем "OK"
- Строка "abbaa" — можно удалить крайний правый символ `a`, получится "abb" (палиндром), возвращаем "remove one"
- Строка "abbaab" — невозможно получить палиндром даже после удаления одного символа, возвращаем "not possible"
Таким образом, задача сводится к поиску первой пары отличающихся символов и проверке, можно ли удалить один из них, чтобы получить палиндром.
Задача 5
Платформа: CodeWars
Название задачи: Simple Fun #128: Doubly Not Less (Простое развлечение)
Ссылка на задачу: https://www.codewars.com/kata/58a3ea0a8bdda5093800000e
Сложность: 5 kyu
Уже решили (На момент написания статьи): 135 из 1 342
Тэги: Пазлы
Оригинальное описание задачи:
Task You are given an integer `n`(in string format). Find the smallest integer `m` such that both `m` and its reversed version (a number that is obtained by reversing the order of its digits) are not less than `n`.
Note: After reversing all leading zeros are omitted.
Examples
For `n = "5314", the result should be "5316".
Because both numbers `5316` and `6135` are not less than 5314.
The result is not `5315` because `5135`(5315 reversed) < `5314`.
For `n = "23456", the result is also "23456".
Input/Output
- `[input]` string `n`
string representation of a positive integer n. `0 < n < 10^100`
- `[output]` a string
string representation of an integer `m`
Пояснение задачи:
Задача состоит в поиске минимального целого числа m , удовлетворяющего двум условиям:
1. Число m само по себе не меньше исходного числа n.
2. Перевернутое число (число, полученное путем переворачивания цифр исходного числа) также не меньше n.
При этом необходимо учитывать, что после переворота отбрасываются ведущие нули — то есть число 00123 превращается в 123 , а не в 321.
Примеры:
- Если n = "5314", наименьшее подходящее число — 5316 .
Перевёрнутое число 6135 больше или равно 5314, и это минимальное такое число.
- Если n = "23456", само число уже подходит под условие, поскольку перевернутое число 65432 тоже больше 23456.
Важные моменты:
- Входное число представлено строкой, а не целым числом, что подразумевает необходимость работы со строковыми операциями.
- Необходимо проверять оба условия одновременно, чтобы найти минимальное число, удовлетворяющее обоим требованиям. - Важно правильно обрабатывать ведущие нули после переворота числа.
Заключение:
Платформа: CodeWars
Название задачи: Sort and Star (Сортировка и звездочка)
Ссылка на задачу: https://www.codewars.com/kata/57cfdf34902f6ba3d300001e
Сложность: 8 kyu
Уже решили (На момент написания статьи): 58 060 из 159 317
Тэги: Основы, строки, массивы, сортировка
Оригинальное описание задачи:
You will be given a list of strings. You must sort it alphabetically (case-sensitive, and based on the ASCII values of the chars) and then return the first value.
The returned value must be a string, and have `"***"` between each of its letters.
You should not remove or add elements from/to the array.
Пояснение задачи:
Задача требует:
- Принять на вход список строк.
- Отсортировать строки алфавитно (учитывая регистр букв и порядок ASCII-кодов символов).
- Вернуть первую строку из отсортированного списка, преобразованную таким образом, чтобы между каждой буквой вставлялась последовательность `"***"`.
Например:
вход: ["apple", "banana", "cherry"]
выход: "a***p***p***l***e"
вход: ["Zebra", "Ant", "Camel"]
выход: "A***n***t"
Решение предполагает:
1. Сортировка списка строк по возрастанию (по умолчанию сортировка учитывает регистр и ASCII-код символов).
2. Преобразование первой строки после сортировки в строку, где каждая буква разделена последовательностью "***".
Платформа: CodeWars
Название задачи: Simple consecutive pairs (Простые последовательные пары)
Ссылка на задачу: https://www.codewars.com/kata/5a3e1319b6486ac96f000049
Сложность: 7 kyu
Уже решили (На момент написания статьи): 11 897 из 30 373
Тэги: Массивы, основы
Оригинальное описание задачи:
In this Kata your task will be to return the count of pairs that have consecutive numbers. The first pair consists of the first and second element of the input, the second pair is the next two elements (3rd and 4th), etc. If the input ends with an element without a pair, it should be ignored.
For example, `[1,2,5,8,-4,-3,7,6,5]` has 3 such pairs. Candidate pairs are selected as follows: `[(1,2), (5,8), (-4,-3), (7,6), 5]`.
- the first pair is `(1,2)` and the numbers in the pair are consecutive; Count = 1
- the second pair is `(5,8)` and the numbers are not consecutive.
- the third pair is `(-4,-3)`, consecutive. Count = 2.
- the fourth pair is `(7,6)`, also consecutive. Count = 3.
- the last element has no pair, so we ignore.
Good luck!
Пояснение задачи:
Задача состоит в том, чтобы найти количество последовательных пар чисел в списке, где каждая пара соседних элементов считается последовательной, если разница между ними равна единице.
Пояснение:
- Входная последовательность разбивается на пары соседних элементов.
- Каждая пара сравнивается: если разница между элементами пары равна 1, пара считается последовательной и учитывается в итоговом результате.
- Последняя одиночная элемент списка игнорируется, поскольку он не образует пару.
Пример:
Вход: `[1, 2, 5, 8, -4, -3, 7, 6, 5]`
Пары:
- Первая пара: (1, 2) → разница 2 - 1 = 1 → последовательная пара, счетчик увеличивается на 1.
- Вторая пара: (5, 8) → разница 8 - 5 = 3 → не последовательная пара.
- Третья пара: (-4, -3) → разница -3 - (-4) = 1 → последовательная пара, счетчик увеличивается еще на 1.
- Четвертая пара: (7, 6) → разница 6 - 7 = -1 → последовательная пара, счетчик увеличивается еще на 1.
Итоговый результат:
Последовательных пар найдено три.
Алгоритм:
1. Проходим по списку элементов, начиная с первого и второго элемента.
2. Проверяем каждую следующую пару элементов на разницу в один.
3. Если разница равна 1, увеличиваем счётчик последовательных пар.
4. Игнорируем последний элемент, если он остался без пары.
Примеры:
- Вход: `[1, 2, 3, 4, 5, 6]` Выход: 5 последовательных пар.
- Вход: `[1, 3, 5, 7, 9]` Выход: 0 последовательных пар.
- Вход: `[1, 2, 4, 5, 6, 8]` Выход: 2 последовательных пары.
Платформа: CodeWars
Название задачи: Simple Fun #384: Is Turing's Equation? (Простое развлечение)
Ссылка на задачу: https://www.codewars.com/kata/5a1e6323ffe75f71ae000026
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 946 из 6 491
Тэги: Основы, строки, математика
Оригинальное описание задачи:
Story
Joe Stoy, in his book "Denotational Semantics", tells following story:
The decision which way round the digits run is, of course, mathematically trivial. Indeed, one early British computer had numbers running from right to left (because the spot on an oscilloscope tube runs from left to right, but in serial logic the least significant digits are dealt with first).
Turing used to mystify audiences at public lectures when, quite by accident, he would slip into this mode even for decimal arithmetic, and write things like 73+42=16.
The next version of the machine was made more conventional simply by crossing the x-deflection wires: this, however, worried the engineers, whose waveforms were all backwards. That problem was in turn solved by providing a little window so that the engineers (who tended to be behind the computer anyway) could view the oscilloscope screen from the back.
[C. Strachey - private communication.]
You will play the role of the audience and judge on the truth value of Turing's equations.
Task
You are given a string `s`. It's an equation such as "a+b=c", where `a`, `b`, `c` are numbers made up of digits 0 to 9. This includes possible leading or trailing zeros. The equations will not contain any spaces.
Your task is to determine whether `s` is a valid Turing equation. Return `true` or `false`, respectively, in Turing's interpretation, i.e. the numbers being read backwards.
Examples
For `s = "73+42=16"`, the output should be `true`:
73 -> 37
42 -> 24
16 -> 61
37+24==61
For `s = "5+8=13"`, the output should be `false`:
5 -> 5
8 -> 8
13 -> 31
5+8!=31
For `s = "10+20=30"`, the output should be `true`:
10 -> 01 -> 1
20 -> 02 -> 2
30 -> 03 -> 3
1+2==3
Note:
- All the numbers `a`, `b`, `c` have no more than 10 digits, excluding leading zeros (read backwards).
- `s` contains only digits, `+`, and `=`. Characters like `-`, `*`, or `/` will not appear in the string.
Пояснение задачи:
Задача заключается в проверке корректности арифметического выражения, записанного в необычной форме, где числа представлены задом наперёд (от младшего значащего разряда к старшему).
Нам дано выражение вида "a+b=c", где `a`, `b`, `c` — это десятичные числа, состоящие из цифр от 0 до 9, записанные в обратном порядке.
Основные шаги решения:
1. Разделим строку на три части: левую часть (`a`), правую часть (`b`) и итоговое число (`c`).
2. Преобразуем каждую часть выражения в обратную форму (перевернём цифры числа):
- Например, число `123` превращается в `321`.
3. Переведём перевернутые числа обратно в десятичную систему счисления.
4. Проверим равенство суммы левой и правой частей выражению, представленному в обратной записи.
Примеры:
- Для строки "73+42=16": - Число `73` переворачивается в `37`, число `42` — в `24`, итоговое число `16` — в `61`.
-Проверяем: 37 + 24 = 61 — верно.
- Для строки "5+8=13": - Число `5` остаётся `5`, число `8` остаётся `8`, итоговое число `13` переворачивается в `31`.
- Проверяем: 5 + 8 ≠ 31 — неверно.
- Для строки "10+20=30": - Число `10` переворачивается в `01`, число `20` — в `02`, итоговое число `30` — в `03`.
- Проверяем: 01 + 02 = 03 — верно.
Таким образом, задача сводится к переворачиванию чисел, представлению их в обычной десятичной системе и проверке арифметического равенства.
Платформа: CodeWars
Название задачи: Single character palindromes (Односимвольные палиндромы)
Ссылка на задачу: https://www.codewars.com/kata/5a2c22271f7f709eaa0005d3
Сложность: 6 kyu
Уже решили (На момент написания статьи): 2 447 из 11 101
Тэги: Алгоритмы
Оригинальное описание задачи:
You will be given a string and you task is to check if it is possible to convert that string into a palindrome by removing a single character. If the string is already a palindrome, return `"OK"`. If it is not, and we can convert it to a palindrome by removing one character, then return `"remove one"`, otherwise return `"not possible"`. The order of the characters should not be changed.
For example:
"abba" -> "OK" - this is a palindrome
"abbaa" -> "remove one" - remove the 'a' at the extreme right
"abbaab" -> "not possible" - cannot be made a palindrome Good luck!
Пояснение задачи:
Задача заключается в проверке возможности преобразования строки в палиндром путём удаления ровно одного символа.
Основные шаги решения:
1. Проверка исходной строки на палиндром Если строка уже является палиндромом, сразу возвращаем "OK".
2. Поиск первого несоответствия Проходим строку слева направо и ищем первое несоответствие между символом и зеркальным символом справа от центра строки. Это значит, что мы находим первую пару символов, которые отличаются друг от друга.
3. Удаление символа и проверка нового состояния Удаляем один из отличающихся символов и проверяем, стала ли строка палиндромом после этого удаления. Если да, возвращаем "remove one".
4. Проверка второго символа Аналогично проверяем второй отличающийся символ, удаляя его и проверяя результат.
5. Отсутствие возможности сделать палиндром Если оба символа удалить нельзя (или ни одно удаление не даёт палиндром), возвращаем "not possible".
Примеры:
- Строка "abba" — палиндром, возвращаем "OK"
- Строка "abbaa" — можно удалить крайний правый символ `a`, получится "abb" (палиндром), возвращаем "remove one"
- Строка "abbaab" — невозможно получить палиндром даже после удаления одного символа, возвращаем "not possible"
Таким образом, задача сводится к поиску первой пары отличающихся символов и проверке, можно ли удалить один из них, чтобы получить палиндром.
Платформа: CodeWars
Название задачи: Simple Fun #128: Doubly Not Less (Простое развлечение)
Ссылка на задачу: https://www.codewars.com/kata/58a3ea0a8bdda5093800000e
Сложность: 5 kyu
Уже решили (На момент написания статьи): 135 из 1 342
Тэги: Пазлы
Оригинальное описание задачи:
Task You are given an integer `n`(in string format). Find the smallest integer `m` such that both `m` and its reversed version (a number that is obtained by reversing the order of its digits) are not less than `n`.
Note: After reversing all leading zeros are omitted.
Examples
For `n = "5314", the result should be "5316".
Because both numbers `5316` and `6135` are not less than 5314.
The result is not `5315` because `5135`(5315 reversed) < `5314`.
For `n = "23456", the result is also "23456".
Input/Output
- `[input]` string `n`
string representation of a positive integer n. `0 < n < 10^100`
- `[output]` a string
string representation of an integer `m`
Пояснение задачи:
Задача состоит в поиске минимального целого числа m , удовлетворяющего двум условиям:
1. Число m само по себе не меньше исходного числа n.
2. Перевернутое число (число, полученное путем переворачивания цифр исходного числа) также не меньше n.
При этом необходимо учитывать, что после переворота отбрасываются ведущие нули — то есть число 00123 превращается в 123 , а не в 321.
Примеры:
- Если n = "5314", наименьшее подходящее число — 5316 .
Перевёрнутое число 6135 больше или равно 5314, и это минимальное такое число.
- Если n = "23456", само число уже подходит под условие, поскольку перевернутое число 65432 тоже больше 23456.
Важные моменты:
- Входное число представлено строкой, а не целым числом, что подразумевает необходимость работы со строковыми операциями.
- Необходимо проверять оба условия одновременно, чтобы найти минимальное число, удовлетворяющее обоим требованиям. - Важно правильно обрабатывать ведущие нули после переворота числа.
Итак, на этом завершим наш обзор. Надеюсь, вам было интересно и полезно прочитать статью. Спасибо за внимание! > Жду вас снова в следующих заданиях — будем решать алгоритмы вместе, обмениваться мыслями и решениями в комментариях, оставаясь доброжелательными и конструктивными. До встречи в новых материалах!
Вступайте в нашу телеграмм-группу Инфостарт