Приветствую! В этой статье представлен сборник алгоритмических задач разного уровня сложности. Мы собрали лучшие упражнения из различных источников, чтобы вы могли отточить свои навыки программирования и проверить умение писать эффективный код. Это отличная возможность потренироваться, освежить знания и сменить фокус с повседневных задач на решение интеллектуальных головоломок
Что было раньше:
В предыдущей части мы решили:
- Alphabet war (Алфавитная война)
- Matrix Weight (Вес матрицы)
- Find Nearest square number (Найдите ближайшее число квадрата)
- Merge two sorted arrays into one (Объединить два отсортированных массива в один.)
- Alphabet war - airstrike - letters massacre (Алфавитная война - авиаудар - резня букв)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Counting sheep... (Подсчет овец...)
Ссылка на задачу: https://www.codewars.com/kata/54edbc7200b811e956000556
Сложность: 8 kyu
Уже решили (На момент написания статьи): 311 252 из 787 353
Тэги: Arrays, Fundamentals
Оригинальное описание задачи:
Consider an array/list of sheep where some sheep may be missing from their place.
We need a function that counts the number of sheep present in the array (true means present).
For example,
[true, true, true, false, true, true, true, true , true, false, true, false, true, false, false, true , true, true, true, true , false, false, true, true]
The correct answer would be `17`.
Hint: Don't forget to check for bad values like `null`/`undefined`
Пояснение задачи:
Задача состоит в подсчёте количества «живых» овец (представленных значением `true`) в массиве, где некоторые овцы могут отсутствовать (`false` или другие значения, не являющиеся `true`).
Основные моменты:
- Массив содержит элементы типа boolean (логические значения).
- Необходимо посчитать количество элементов, равное `true`, игнорируя любые другие значения.
- Важно учитывать, что элементы массива могут иметь произвольный тип, отличный от boolean (например, `null`, `undefined`, пустые строки и т.п.), такие элементы не считаются овцами.
Пример:
Вход: [true, true, true, false, true, true, true, true, true, false, true, false, true, false, false, true, true, true, true, false, false, true, true]
Выход: 17
Здесь присутствуют 17 овец (`true`), остальные элементы массива игнорируются.
Подход к решению:
- Проходим по каждому элементу массива.
- Проверяем значение элемента на равенство `true`.
- Если условие выполняется, увеличиваем счётчик овец.
- Возвращаем итоговое количество овец после обработки всего массива.
Задача 2
Платформа: CodeWars
Название задачи: get character from ASCII Value (извлечение символа из значения ASCII)
Ссылка на задачу: https://www.codewars.com/kata/55ad04714f0b468e8200001c
Сложность: 8 kyu
Уже решили (На момент написания статьи): 54 069 из 86 240
Тэги: Fundamentals
Оригинальное описание задачи:
Write a function which takes a number and returns the corresponding ASCII char for that value.
Example:
65 --> 'A'
97 --> 'a'
48 --> '0
For ASCII table, you can refer to http://www.asciitable.com/
Пояснение задачи:
Функция принимает на вход числовое значение и возвращает соответствующий символ из таблицы ASCII.
Пояснение:
- Задача состоит в преобразовании числового значения в символьное представление согласно таблице ASCII.
- Числа в диапазоне от 0 до 127 соответствуют уникальным символам ASCII.
- Для получения символа по числу используется встроенная операция приведения типа (`chr()` в Python, `char` в
C-подобных языках, `String.from_char_code()` в JavaScript и др.), позволяющая получить символ по его коду.
Пример:
| Вход | Выход | |------|-------|
| 65 | 'A' |
| 97 | 'a' |
| 48 | '0' |
| 33 | '!' |
| 90 | 'Z' |
| 122 | 'z' |
Таким образом, функция преобразует числовой код символа в сам символ, используя стандартную таблицу ASCII.
Задача 3
Платформа: CodeWars
Название задачи: The First Non Repeated Character In A String (Первый неповторяющийся символ в строке)
Ссылка на задачу: https://www.codewars.com/kata/570f6436b29c708a32000826
Сложность: 7 kyu
Уже решили (На момент написания статьи): 4 091 из 13 141
Тэги: Algorithms, Strings, Fundamentals
Оригинальное описание задачи:
You need to write a function, that returns the first non-repeated character in the given string.
If all the characters are unique, return the first character of the string.
If there is no unique character, return `null` in JS or Java, `None` in Python, `'\0'` in C.
You can assume, that the input string has always non-zero length.
Examples
"test" returns "e"
"teeter" returns "r"
"trend" returns "t" (all the characters are unique)
"aabbcc" returns null (all the characters are repeated)
Пояснение задачи:
Задача состоит в том, чтобы найти первый символ строки, который встречается ровно один раз.
Основные шаги решения:
1. Подсчет частоты символов: Проходим по строке и считаем количество вхождений каждого символа.
2. Поиск первого уникального символа: Проверяем символы строки слева направо и возвращаем первый символ, частота которого равна единице.
3. Обработка случая отсутствия уникальных символов: Если ни один символ не повторяется, возвращаем специальный маркер (`null`, `None`, `'\0'`), обозначающий отсутствие уникального символа.
Примеры:
- Для строки "test" первым уникальным символом является буква `е`.
- Для строки "teeter" первым уникальным символом будет буква `r`.
- Для строки "trend" все символы уникальные, поэтому возвращается первый символ — `t`.
- Для строки "aabbcc" нет уникальных символов, поэтому возвращаем маркер отсутствия уникальности (`null` или эквивалент).
Пример реализации:
def first_unique_char(s): char_count = {}
Подсчитываем частоту символов
for ch in s: if ch in char_count: char_count[ch] += 1 else: char_count[ch] = 1
Ищем первый уникальный символ
for ch in s: if char_count[ch] == 1: return ch
Если уникальных символов нет return None
Задача 4
Платформа: CodeWars
Название задачи: Dead Ants (Мертвые муравьи)
Ссылка на задачу: https://www.codewars.com/kata/57d5e850bfcdc545870000b7
Сложность: 6 kyu
Уже решили (На момент написания статьи): 2 898 из 21 497
Тэги: Algorithms, Strings, Puzzles
Оригинальное описание задачи:
An orderly trail of ants is marching across the park picnic area.
It looks something like this:
ant..ant.ant...ant.ant..ant.ant....ant..ant.ant.ant...ant..
But suddenly there is a rumour that a dropped chicken sandwich has been spotted on the ground ahead.
The ants surge forward! Oh No, it's an ant stampede!!
Some of the slower ants are trampled, and their poor little ant bodies are broken up into scattered bits.
The resulting carnage looks like this:
...ant...ant...ant...ant...ant..ant..ant.
Can you find how many ants have died?
Notes
When in doubt, assume that the scattered bits are from the same ant. e.g. 2 heads and 1 body = 2 dead ants, not 3
Пояснение задачи:
Задача состоит в следующем: Нам дана строка, изображающая колонну марширующих муравьев, где символ `.` обозначает пустое пространство, а символы `a`, `n` и `t` — части тела муравья («голова», «грудь» и «живот»).
После внезапного панического бегства муравьи сталкиваются друг с другом, ломаются и распадаются на отдельные фрагменты.
Необходимо определить количество погибших муравьев.
Основные моменты:
- Каждая целая ант имеет три части: голова (`a`), грудь (`n`) и живот (`t`).
- Любая комбинация частей одного муравья считается одним погибшим муравьем.
- Важно учитывать, что несколько фрагментов одной и той же ант считаются одной жертвой, даже если они разбросаны далеко друг от друга.
- Фрагменты одного муравья могут встречаться в любом порядке и количестве, главное — наличие всех трёх частей.
Пример:
Исходная строка:
...ant...ant.nat.an.t..ant...ant..ant..ant.anant.t
Фрагменты разбитых муравьев:
- `nat`: голова и грудь одной ант - `t`: хвост другой ант - `an`: голова и живот третьей ант - `t`: хвост четвертой ант
Всего погибших муравьев: 4.
Подход к решению:
1. Разделим строку на группы символов одинаковой природы (одинаковые символы подряд).
2. Проверим каждую группу на наличие полного набора частей муравья (a, n, t).
3. Если группа содержит полный набор, считаем её одним погибшим муравьем.
4. Если хотя бы одна часть отсутствует, игнорируем эту группу.
5. Суммируем количество полных наборов.
Пример:
Строка: ...ant...ant.nat.an.t..ant...ant..ant..ant.anant.t
Группы: - `.` - `ant` - `nat` - `an` - `t` - `.` - `ant` - `..` - `ant` - `..` - `ant` - `anant` - `t` Из них только `nat`, `an`, `anant`
содержат полный набор частей муравья, значит, погибло 3 муравья.
Задача 5
Платформа: CodeWars
Название задачи: The Clockwise Spiral (Спираль по часовой стрелке)
Ссылка на задачу: https://www.codewars.com/kata/536a155256eb459b8700077e
Сложность: 5 kyu
Уже решили (На момент написания статьи): 4 375 из 30 783
Тэги: Arrays, Puzzles
Оригинальное описание задачи:
Do you know how to make a spiral?Let's test it!
Classic definition:
A spiral is a curve which emanates from a central point, getting progressively farther away as it revolves around the point.
Your objective is to complete a function `createSpiral(N)` that receives an integer `N` and returns an `NxN` two-dimensional array with numbers `1` through `NxN` represented as a clockwise spiral.
Return an empty array if `N < 1` or `N` is not int / number
Examples:
`N = 3`
`Output: [[1,2,3],[8,9,4],[7,6,5]]`
1 2 3
8 9 4
7 6 5
`N = 4``Output: [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]`
1 2 3
4 12 13 14
5 11 16 15
6 10 9 8 7
`N = 5` `Output: [[1,2,3,4,5],[16,17,18,19,6],[15,24,25,20,7],[14,23,22,21,8],[13,12,11,10,9]]`
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Пояснение задачи:
Задача заключается в формировании двумерного массива размером NxN, заполненного числами от 1 до N×N, расположенными по спирали, идущей по часовой стрелке.
Пояснение:
- Входное значение `N` определяет размер квадратной матрицы.
- Числа располагаются последовательно по спирали, начиная с центра (угла) и двигаясь по часовой стрелке наружу.
- Необходимо вернуть пустую матрицу, если входное значение некорректно (`N < 1` или тип данных неверный). Примеры:
Пример 1:
Для N = 3 Матрица будет выглядеть следующим образом: 1 2 3 8 9 4 7 6 5
Пример 2:
Для N = 4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
Пример 3:
Для N = 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
Алгоритм решения:
1. Проверить корректность входного параметра:
- Если N < 1 или N не является целым числом, вернуть пустой массив.
2. Создать матрицу размера N * N , заполнив её нулями.
3. Определить начальные координаты и направления движения (вверх, вправо, вниз, влево):
- Использовать переменные для отслеживания текущей позиции и направления.
4. Заполнить матрицу числами от 1 до N^2 по спирали, следуя следующим правилам:
- Начинать движение по часовой стрелке из верхнего левого угла.
- После каждого полного круга менять направление движения.
5. Вернуть сформированную матрицу.
Заключение:
Платформа: CodeWars
Название задачи: Counting sheep... (Подсчет овец...)
Ссылка на задачу: https://www.codewars.com/kata/54edbc7200b811e956000556
Сложность: 8 kyu
Уже решили (На момент написания статьи): 311 252 из 787 353
Тэги: Arrays, Fundamentals
Оригинальное описание задачи:
Consider an array/list of sheep where some sheep may be missing from their place.
We need a function that counts the number of sheep present in the array (true means present).
For example,
[true, true, true, false, true, true, true, true , true, false, true, false, true, false, false, true , true, true, true, true , false, false, true, true]
The correct answer would be `17`.
Hint: Don't forget to check for bad values like `null`/`undefined`
Пояснение задачи:
Задача состоит в подсчёте количества «живых» овец (представленных значением `true`) в массиве, где некоторые овцы могут отсутствовать (`false` или другие значения, не являющиеся `true`).
Основные моменты:
- Массив содержит элементы типа boolean (логические значения).
- Необходимо посчитать количество элементов, равное `true`, игнорируя любые другие значения.
- Важно учитывать, что элементы массива могут иметь произвольный тип, отличный от boolean (например, `null`, `undefined`, пустые строки и т.п.), такие элементы не считаются овцами.
Пример:
Вход: [true, true, true, false, true, true, true, true, true, false, true, false, true, false, false, true, true, true, true, false, false, true, true]
Выход: 17
Здесь присутствуют 17 овец (`true`), остальные элементы массива игнорируются.
Подход к решению:
- Проходим по каждому элементу массива.
- Проверяем значение элемента на равенство `true`.
- Если условие выполняется, увеличиваем счётчик овец.
- Возвращаем итоговое количество овец после обработки всего массива.
Платформа: CodeWars
Название задачи: get character from ASCII Value (извлечение символа из значения ASCII)
Ссылка на задачу: https://www.codewars.com/kata/55ad04714f0b468e8200001c
Сложность: 8 kyu
Уже решили (На момент написания статьи): 54 069 из 86 240
Тэги: Fundamentals
Оригинальное описание задачи:
Write a function which takes a number and returns the corresponding ASCII char for that value.
Example:
65 --> 'A'
97 --> 'a'
48 --> '0
For ASCII table, you can refer to http://www.asciitable.com/
Пояснение задачи:
Функция принимает на вход числовое значение и возвращает соответствующий символ из таблицы ASCII.
Пояснение:
- Задача состоит в преобразовании числового значения в символьное представление согласно таблице ASCII.
- Числа в диапазоне от 0 до 127 соответствуют уникальным символам ASCII.
- Для получения символа по числу используется встроенная операция приведения типа (`chr()` в Python, `char` в
C-подобных языках, `String.from_char_code()` в JavaScript и др.), позволяющая получить символ по его коду.
Пример:
| Вход | Выход | |------|-------|
| 65 | 'A' |
| 97 | 'a' |
| 48 | '0' |
| 33 | '!' |
| 90 | 'Z' |
| 122 | 'z' |
Таким образом, функция преобразует числовой код символа в сам символ, используя стандартную таблицу ASCII.
Платформа: CodeWars
Название задачи: The First Non Repeated Character In A String (Первый неповторяющийся символ в строке)
Ссылка на задачу: https://www.codewars.com/kata/570f6436b29c708a32000826
Сложность: 7 kyu
Уже решили (На момент написания статьи): 4 091 из 13 141
Тэги: Algorithms, Strings, Fundamentals
Оригинальное описание задачи:
You need to write a function, that returns the first non-repeated character in the given string.
If all the characters are unique, return the first character of the string.
If there is no unique character, return `null` in JS or Java, `None` in Python, `'\0'` in C.
You can assume, that the input string has always non-zero length.
Examples
"test" returns "e"
"teeter" returns "r"
"trend" returns "t" (all the characters are unique)
"aabbcc" returns null (all the characters are repeated)
Пояснение задачи:
Задача состоит в том, чтобы найти первый символ строки, который встречается ровно один раз.
Основные шаги решения:
1. Подсчет частоты символов: Проходим по строке и считаем количество вхождений каждого символа.
2. Поиск первого уникального символа: Проверяем символы строки слева направо и возвращаем первый символ, частота которого равна единице.
3. Обработка случая отсутствия уникальных символов: Если ни один символ не повторяется, возвращаем специальный маркер (`null`, `None`, `'\0'`), обозначающий отсутствие уникального символа.
Примеры:
- Для строки "test" первым уникальным символом является буква `е`.
- Для строки "teeter" первым уникальным символом будет буква `r`.
- Для строки "trend" все символы уникальные, поэтому возвращается первый символ — `t`.
- Для строки "aabbcc" нет уникальных символов, поэтому возвращаем маркер отсутствия уникальности (`null` или эквивалент).
Пример реализации:
def first_unique_char(s): char_count = {}
Подсчитываем частоту символов
for ch in s: if ch in char_count: char_count[ch] += 1 else: char_count[ch] = 1
Ищем первый уникальный символ
for ch in s: if char_count[ch] == 1: return ch
Если уникальных символов нет return None
Платформа: CodeWars
Название задачи: Dead Ants (Мертвые муравьи)
Ссылка на задачу: https://www.codewars.com/kata/57d5e850bfcdc545870000b7
Сложность: 6 kyu
Уже решили (На момент написания статьи): 2 898 из 21 497
Тэги: Algorithms, Strings, Puzzles
Оригинальное описание задачи:
An orderly trail of ants is marching across the park picnic area.
It looks something like this:
ant..ant.ant...ant.ant..ant.ant....ant..ant.ant.ant...ant..
But suddenly there is a rumour that a dropped chicken sandwich has been spotted on the ground ahead.
The ants surge forward! Oh No, it's an ant stampede!!
Some of the slower ants are trampled, and their poor little ant bodies are broken up into scattered bits.
The resulting carnage looks like this:
...ant...ant...ant...ant...ant..ant..ant.
Can you find how many ants have died?
Notes
When in doubt, assume that the scattered bits are from the same ant. e.g. 2 heads and 1 body = 2 dead ants, not 3
Пояснение задачи:
Задача состоит в следующем: Нам дана строка, изображающая колонну марширующих муравьев, где символ `.` обозначает пустое пространство, а символы `a`, `n` и `t` — части тела муравья («голова», «грудь» и «живот»).
После внезапного панического бегства муравьи сталкиваются друг с другом, ломаются и распадаются на отдельные фрагменты.
Необходимо определить количество погибших муравьев.
Основные моменты:
- Каждая целая ант имеет три части: голова (`a`), грудь (`n`) и живот (`t`).
- Любая комбинация частей одного муравья считается одним погибшим муравьем.
- Важно учитывать, что несколько фрагментов одной и той же ант считаются одной жертвой, даже если они разбросаны далеко друг от друга.
- Фрагменты одного муравья могут встречаться в любом порядке и количестве, главное — наличие всех трёх частей.
Пример:
Исходная строка:
...ant...ant.nat.an.t..ant...ant..ant..ant.anant.t
Фрагменты разбитых муравьев:
- `nat`: голова и грудь одной ант - `t`: хвост другой ант - `an`: голова и живот третьей ант - `t`: хвост четвертой ант
Всего погибших муравьев: 4.
Подход к решению:
1. Разделим строку на группы символов одинаковой природы (одинаковые символы подряд).
2. Проверим каждую группу на наличие полного набора частей муравья (a, n, t).
3. Если группа содержит полный набор, считаем её одним погибшим муравьем.
4. Если хотя бы одна часть отсутствует, игнорируем эту группу.
5. Суммируем количество полных наборов.
Пример:
Строка: ...ant...ant.nat.an.t..ant...ant..ant..ant.anant.t
Группы: - `.` - `ant` - `nat` - `an` - `t` - `.` - `ant` - `..` - `ant` - `..` - `ant` - `anant` - `t` Из них только `nat`, `an`, `anant`
содержат полный набор частей муравья, значит, погибло 3 муравья.
Платформа: CodeWars
Название задачи: The Clockwise Spiral (Спираль по часовой стрелке)
Ссылка на задачу: https://www.codewars.com/kata/536a155256eb459b8700077e
Сложность: 5 kyu
Уже решили (На момент написания статьи): 4 375 из 30 783
Тэги: Arrays, Puzzles
Оригинальное описание задачи:
Do you know how to make a spiral?Let's test it!
Classic definition:
A spiral is a curve which emanates from a central point, getting progressively farther away as it revolves around the point.
Your objective is to complete a function `createSpiral(N)` that receives an integer `N` and returns an `NxN` two-dimensional array with numbers `1` through `NxN` represented as a clockwise spiral.
Return an empty array if `N < 1` or `N` is not int / number
Examples:
`N = 3`
`Output: [[1,2,3],[8,9,4],[7,6,5]]`
1 2 3
8 9 4
7 6 5
`N = 4``Output: [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]`
1 2 3
4 12 13 14
5 11 16 15
6 10 9 8 7
`N = 5` `Output: [[1,2,3,4,5],[16,17,18,19,6],[15,24,25,20,7],[14,23,22,21,8],[13,12,11,10,9]]`
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Пояснение задачи:
Задача заключается в формировании двумерного массива размером NxN, заполненного числами от 1 до N×N, расположенными по спирали, идущей по часовой стрелке.
Пояснение:
- Входное значение `N` определяет размер квадратной матрицы.
- Числа располагаются последовательно по спирали, начиная с центра (угла) и двигаясь по часовой стрелке наружу.
- Необходимо вернуть пустую матрицу, если входное значение некорректно (`N < 1` или тип данных неверный). Примеры:
Пример 1:
Для N = 3 Матрица будет выглядеть следующим образом: 1 2 3 8 9 4 7 6 5
Пример 2:
Для N = 4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
Пример 3:
Для N = 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
Алгоритм решения:
1. Проверить корректность входного параметра:
- Если N < 1 или N не является целым числом, вернуть пустой массив.
2. Создать матрицу размера N * N , заполнив её нулями.
3. Определить начальные координаты и направления движения (вверх, вправо, вниз, влево):
- Использовать переменные для отслеживания текущей позиции и направления.
4. Заполнить матрицу числами от 1 до N^2 по спирали, следуя следующим правилам:
- Начинать движение по часовой стрелке из верхнего левого угла.
- После каждого полного круга менять направление движения.
5. Вернуть сформированную матрицу.
Статья подошла к финалу, и я надеюсь, что вы провели время с пользой. Спасибо, что были со мной! Теперь ваша очередь: как бы вы решили эти задачи? Пишите свои идеи в комментариях, давайте учиться друг у друга в приятной и уважительной обстановке. Увидимся в обсуждениях!
Вступайте в нашу телеграмм-группу Инфостарт