Добро пожаловать в очередную коллекцию головоломок, связанных с алгоритмами и программированием. В ней собраны разнообразные упражнения, отличающиеся по уровню сложности, что делает их актуальными как для начинающих, так и для опытных специалистов. Этот материал призван служить инструментом для оттачивания навыков решения стандартных проблем, поддержания уровня компетенций в написании эффективного кода и получения удовольствия от процесса усовершенствования своих профессиональных качеств.
Что было раньше:
В предыдущей части мы решили:
- Will there be enough space? (Будет ли достаточно места?)
- Leap Years (Високосные годы)
- Valid Parentheses (Допустимые круглые скобки)
- Word a10n (abbreviation) (Слово а10н (аббревиатура))
- Molecule to atoms (Молекула к атомам)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Maximum Length Difference (Максимальная разница в длине)
Ссылка на задачу: https://www.codewars.com/kata/5663f5305102699bad000056
Сложность: 7 kyu
Уже решили (На момент написания статьи): 31 256 из 193 949
Тэги: Основы
Оригинальное описание задачи:
You are given two arrays `a1` and `a2` of strings. Each string is composed with letters from `a` to `z`. Let `x` be any string in the first array and `y` be any string in the second array.
`Find max(abs(length(x) − length(y)))`
If `a1` and/or `a2` are empty return `-1` in each language except in Haskell (F#) where you will return `Nothing` (None).
Example:
a1 = ["hoqq", "bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"]
a2 = ["cccooommaaqqoxii", "gggqaffhhh", "tttoowwwmmww"]
mxdiflg(a1, a2) --> 13
Bash note:
- input : 2 strings with substrings separated by `,`
- output: number as a string
Пояснение задачи:
Задача состоит в следующем:
Даны два массива строк (`a1` и `a2`), состоящих из букв латинского алфавита от `a` до `z`.
Необходимо найти строку `x`, взятую из первого массива, и строку `y` — из второго массива, такие, чтобы модуль разности длин этих строк был максимальным.
Основные шаги решения:
1. Проверить наличие хотя бы одной строки в каждом массиве. Если хотя бы один из массивов пуст, вернуть специальное значение (-1 или None в зависимости от языка):
- В большинстве языков программирования возвращаем `-
1`. - В языках Haskell и F# (для удобства работы с опциональными типами) возвращаем `Nothing` (или эквивалентный вариант).
2. Перебрать все пары строк из двух массивов и вычислить абсолютную разницу между длинами каждой пары строк.
3. Из полученных значений выбрать максимальное.
Пример:
Для массивов:
a1 = ["hoqq", "bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"]
a2 = ["cccooommaaqqoxii", "gggqaffhhh", "tttoowwwmmww"]
Максимальная разница длин достигается парами строк `"znnnnfqknaz"` и `"gggqaffhhh"`, длины которых равны 11 и 8 соответственно.
Разница равна |11 - 8| = 3. Однако в примере приведена другая максимальная разница — 13. Это значит, что правильный ответ будет найден другой парой строк, либо условие задачи подразумевает работу с другими строками.
Дополнительные комментарии:
- В случае, когда массивы содержат одинаковые строки, необходимо учитывать все возможные комбинации строк.
- Важно аккуратно обработать граничные случаи, особенно когда массивы пусты или содержат одну строку.
Примеры возможных возвращаемых значений:
- Если оба массива пусты, результат должен быть равен -1.
- Если один из массивов пустой, результат также равен -1.
- Если в одном из массивов одна строка, нужно проверить максимальную разницу с единственной строкой другого массива.
Задача 2
Платформа: CodeWars
Название задачи: List Filtering (Фильтрация списка)
Ссылка на задачу: https://www.codewars.com/kata/53dbd5315a3c69eed20002dd
Сложность: 7 kyu
Уже решили (На момент написания статьи): 325 665 из 747 581
Тэги: Списки, фильтрация, структуры данных, основы
Оригинальное описание задачи:
In this kata you will create a function that takes a list of non-negative integers and strings and returns a new list with the strings filtered out.
Example
filter_list([1,2,'a','b']) == [1,2]
filter_list([1,'a','b',0,15]) == [1,0,15]
filter_list([1,2,'aasf','1','123',123]) == [1,2,123]
Пояснение задачи:
Требуется написать функцию, принимающую на вход список произвольных элементов (числа и строки), и возвращающую новый список, содержащий исключительно числовые элементы исходного списка.
Пример:
filter_list([1, 2, 'a', 'b']) → [1, 2]
filter_list([1, 'a', 'b', 0, 15]) → [1, 0, 15]
filter_list([1, 2, 'aasf', '1', '123', 123]) → [1, 2, 123]
Пояснение:
Функция должна пройти по списку и выбрать только те элементы, которые являются числами (целыми или вещественными).
Строки и другие типы данных (например, объекты, булевы значения и т.п.) нужно игнорировать.
Для решения задачи можно воспользоваться стандартными методами фильтрации, доступными в большинстве современных языков программирования:
- Python: `list(filter(lambda x: isinstance(x, int), input_list))`
- C#: `inputList.Where(x => x is int).ToList()`
- Factor: Использовать встроенный метод `filter-seq`, который удаляет неприемлемые элементы
- Java: `stream().filter(x -> x instanceof Integer).collect(Collectors.toList())`
- Scala: `filter(_.isInstanceOf[Int]).map(_.asInstanceOf[Int])`
- Kotlin: `filterIsInstance().toList()`
- Haskell: `filter (\x -> case x of Right _ -> True; Left _ -> False)`
Таким образом, задача сводится к применению функции-фильтра, которая отбирает только числовые элементы из входного списка.
Задача 3
Платформа: CodeWars
Название задачи: Parts of a list (Части списка)
Ссылка на задачу: https://www.codewars.com/kata/56f3a1e899b386da78000732
Сложность: 7 kyu
Уже решили (На момент написания статьи): 19 007 из 61 040
Тэги: Массивы, списки, структуры данных, алгоритмы
Оригинальное описание задачи:
Write a function `partlist` that gives all the ways to divide a list (an array) of at least two elements into two non-empty parts.
- Each two non empty parts will be in a pair (or an array for languages without tuples or a `struct`in C- C: see Examples test Cases-)
- Each part will be in a string - Elements of a pair must be in the same order as in the original array.
Examples of returns in different languages:
a = ["az", "toto", "picaro", "zone", "kiwi"] -->
[["az", "toto picaro zone kiwi"], ["az toto", "picaro zone kiwi"], ["az toto picaro", "zone kiwi"], ["az toto picaro zone", "kiwi"]]
or
a = {"az", "toto", "picaro", "zone", "kiwi"} --> {{"az", "toto picaro zone kiwi"}, {"az toto", "picaro zone kiwi"}, {"az toto picaro", "zone kiwi"}, {"az toto picaro zone", "kiwi"}}
or
a = ["az", "toto", "picaro", "zone", "kiwi"] --> [("az", "toto picaro zone kiwi"), ("az toto", "picaro zone kiwi"), ("az toto picaro", "zone kiwi"), ("az toto picaro zone", "kiwi")]
or
a = [|"az", "toto", "picaro", "zone", "kiwi"|] --> [("az", "toto picaro zone kiwi"), ("az toto", "picaro zone kiwi"), ("az toto picaro", "zone kiwi"), ("az toto picaro zone", "kiwi")]
or
a = ["az", "toto", "picaro", "zone", "kiwi"] --> "(az, toto picaro zone kiwi)(az toto, picaro zone kiwi)(az toto picaro, zone kiwi)(az toto picaro zone, kiwi)"
Note You can see other examples for each language in "Your test cases"
Пояснение задачи:
Функция `partlist` должна принимать список строк (`array`) длиной минимум два элемента и возвращать все возможные способы разбиения списка на две непустые части.
Пояснение:
Основная задача — разбить исходный массив на две части таким образом, чтобы каждая часть содержала хотя бы один элемент. Разбиение происходит последовательным добавлением каждого элемента в первую часть, начиная с первого элемента, и переносом остальных элементов во вторую часть.
Рассмотрим пошагово алгоритм:
1. Итерация по индексам: Начинаем с индекса 1 (второй элемент) и продолжаем до конца списка.
- На каждом шаге берем текущий элемент и добавляем его в первую часть, а оставшиеся элементы формируем во вторую часть.
2. Форматирование результата: Каждый раз, когда мы создаем новую пару частей, результат сохраняется в виде строки, где первая часть соединяется пробелом, а вторая часть выводится отдельно.
3. Обработка последнего элемента: Последний элемент всегда добавляется в отдельную вторую часть, так как иначе она окажется пустой.
Пример работы функции:
Для входного списка: a = ["az", "toto", "picaro", "zone", "kiwi"]
Последовательность шагов:
- Первый проход:
Первая часть: "az" Вторая часть: "toto picaro zone kiwi"
- Второй проход: Первая часть: "az toto"
Вторая часть: "picaro zone kiwi"
- Третий проход:
Первая часть: "az toto picaro"
Вторая часть: "zone kiwi"
- Четвертый проход:
Первая часть: "az toto picaro zone" Вторая часть: "kiwi"
Таким образом, результатом будет:
["az", "toto picaro zone kiwi"], ["az toto", "picaro zone kiwi"], ["az toto picaro", "zone kiwi"], ["az toto picaro zone", "kiwi"]
Дополнительные замечания
- Входной массив всегда содержит минимум два элемента.
- Порядок элементов в каждой паре частей должен строго соответствовать порядку в исходном списке.
- Результат должен возвращаться в виде списка строк или списков строк, в зависимости от используемого языка программирования.
Задача 4
Платформа: CodeWars
Название задачи: Simple Simple Simple String Expansion (Простое Простое Простое расширение строки)
Ссылка на задачу: https://www.codewars.com/kata/5ae326342f8cbc72220000d2
Сложность: 6 kyu
Уже решили (На момент написания статьи): 4 448 из 19 351
Тэги: Строки, регулярные выражения, основы
Оригинальное описание задачи:
Given a string that includes alphanumeric characters ("3a4B2d") return the expansion of that string: The numeric values represent the occurrence of each letter following that numeric value. There should be no numeric characters in the final string.
Notes
The first occurrence of a numeric value should be the number of times each character behind it is repeated, until the next numeric value appears
If there are multiple consecutive numeric characters, only the last one should be used (ignore the previous ones)
Empty strings should return an empty string.
Your code should be able to work for both lower and capital case letters.
"3D2a5d2f" --> "DDDaadddddff" # basic example: 3 * "D" + 2 * "a" + 5 * "d" + 2 * "f"
"3abc" --> "aaabbbccc" # not "aaabc", nor "abcabcabc"; 3 * "a" + 3 * "b" + 3 * "c"
"3d332f2a" --> "dddffaa" # multiple consecutive digits: 3 * "d" + 2 * "f" + 2 * "a"
"abcde" --> "abcde" # no digits
"1111" -->"" # no characters to repeat
"" --> "" # empty string
Пояснение задачи:
Задача состоит в том, чтобы преобразовать строку специального формата в расширенную строку символов.
Описание решения:
На входе — строка, содержащая буквы и цифры. Цифры обозначают количество повторений букв, следующих за ними. Буквы, идущие подряд, рассматриваются как одна группа, и цифра перед группой определяет, сколько раз эта группа будет повторена.
Основные правила:
- Первая встреченная цифра определяет количество повторений следующей буквы.
- Если после цифры идёт несколько букв, каждая буква считается частью одной группы.
- Последующие цифры игнорируются, учитываются только последние цифры перед каждой новой группой букв.
- Если входная строка пустая, выход тоже должен быть пустой строкой.
- Входная строка может содержать как строчные, так и заглавные буквы.
Примеры
- "3D2a5d2f"` → "DDDaadddddff" — первая цифра 3 означает три буквы D, далее 2 буквы a, затем 5 букв d и 2 буквы f.
- "3abc"` → "aaabbbccc" — три буквы a, три буквы b, три буквы c.
- "3d332f2a"` → "dddffaa" — сначала три буквы d, затем две буквы f и две буквы a.
- "abcde" → "abcde" — строки без цифр остаются неизменными.
- "1111" → "" — отсутствие букв приводит к пустой строке.
- "" → "" — пустая строка остаётся пустой.
Таким образом, задача сводится к последовательному разбору входной строки, обработке групп букв и цифр и формированию итогового результата.
Задача 5
Платформа: CodeWars
Название задачи: Square sums (simple) (Квадратные суммы (простые))
Ссылка на задачу: https://www.codewars.com/kata/5a6b24d4e626c59d5b000066
Сложность: 5 kyu
Уже решили (На момент написания статьи): 1 532 из 12 228
Тэги: Алгоритмы, Математика
Оригинальное описание задачи:
This is simple version of harder
Square sums
Write function that, given integer number `N` (in range `2..43`), returns array of integers `1..N` arranged in a way, so sum of each 2 consecutive numbers is a square.
Solution is valid if and only if following two criterias are met:
1. Each number in range `1..N` is used once and only once.
2. Sum of each 2 consecutive numbers is a perfect square.
Example
For N=15 solution could look like this:
`[ 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8 ]`
Verification
1. All numbers are used once and only once. When sorted in ascending order array looks like this:
`[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]`
2. Sum of each 2 consecutive numbers is a perfect square:
16 16 16 16 16 16 16
/+\ /+\ /+\ /+\ /+\ /+\ /+\
[ 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8 ]
\+/ \+/ \+/ \+/ \+/ \+/ \+/
9 25 9 25 9 25 9
9 = 3*3
16 = 4*4
25 = 5*5
If there is no solution, return `false` ( `None` in Scala, `Nothing` in Haskell ). For example if `N=5`, then numbers `1,2,3,4,5` cannot be put into square sums row: `1+3=4`, `4+5=9`, but `2` has no pairs and cannot link `[1,3]` and `[4,5]`.
Have fun!
Harder version of this Kata is [here](/kata/square-sums).
Пояснение задачи:
Задача состоит в следующем:
Необходимо разработать функцию, принимающую целое число N (2 ≤ N ≤ 43) и возвращающую перестановку чисел от 1 до N, удовлетворяющую двум условиям:
1. Уникальность чисел: Все числа от 1 до N используются ровно один раз.
2. Суммы квадратов: Сумма каждого соседнего элемента является полным квадратом (например, 16 = 4^2, 25 = 5^2 и т.п.).
Пример решения для N = 15
Перестановка чисел от 1 до 15: [9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8]
Проверим выполнение условий:
- Все числа от 1 до 15 присутствуют единожды.
- Проверим суммы соседних чисел:
9 + 7 = 16 = 4^2
7 + 2 = 9 = 3^2
2 + 14 = 16 = 4^2
14 + 11 = 25 = 5^2
11 + 5 = 16 = 4^2
5 + 4 = 9 = 3^2
4 + 12 = 16 = 4^2
12 + 13 = 25 = 5^2
13 + 3 = 16 = 4^2
3 + 6 = 9 = 3^2
6 + 10 = 16 = 4^2
10 + 15 = 25 = 5^2
15 + 1 = 16 = 4^2
1 + 8 = 9 = 3^2
Таким образом, условие выполнено.
Сложность задачи:
При отсутствии подходящей перестановки функция должна вернуть специальный маркер (`False` в Python, `None` в Scala, `Nothing` в Haskell), указывающий невозможность нахождения подходящего решения.
Например, для N = 5 нельзя построить такую последовательность, поскольку число 2
Заключение:
Платформа: CodeWars
Название задачи: Maximum Length Difference (Максимальная разница в длине)
Ссылка на задачу: https://www.codewars.com/kata/5663f5305102699bad000056
Сложность: 7 kyu
Уже решили (На момент написания статьи): 31 256 из 193 949
Тэги: Основы
Оригинальное описание задачи:
You are given two arrays `a1` and `a2` of strings. Each string is composed with letters from `a` to `z`. Let `x` be any string in the first array and `y` be any string in the second array.
`Find max(abs(length(x) − length(y)))`
If `a1` and/or `a2` are empty return `-1` in each language except in Haskell (F#) where you will return `Nothing` (None).
Example:
a1 = ["hoqq", "bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"]
a2 = ["cccooommaaqqoxii", "gggqaffhhh", "tttoowwwmmww"]
mxdiflg(a1, a2) --> 13
Bash note:
- input : 2 strings with substrings separated by `,`
- output: number as a string
Пояснение задачи:
Задача состоит в следующем:
Даны два массива строк (`a1` и `a2`), состоящих из букв латинского алфавита от `a` до `z`.
Необходимо найти строку `x`, взятую из первого массива, и строку `y` — из второго массива, такие, чтобы модуль разности длин этих строк был максимальным.
Основные шаги решения:
1. Проверить наличие хотя бы одной строки в каждом массиве. Если хотя бы один из массивов пуст, вернуть специальное значение (-1 или None в зависимости от языка):
- В большинстве языков программирования возвращаем `-
1`. - В языках Haskell и F# (для удобства работы с опциональными типами) возвращаем `Nothing` (или эквивалентный вариант).
2. Перебрать все пары строк из двух массивов и вычислить абсолютную разницу между длинами каждой пары строк.
3. Из полученных значений выбрать максимальное.
Пример:
Для массивов:
a1 = ["hoqq", "bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"]
a2 = ["cccooommaaqqoxii", "gggqaffhhh", "tttoowwwmmww"]
Максимальная разница длин достигается парами строк `"znnnnfqknaz"` и `"gggqaffhhh"`, длины которых равны 11 и 8 соответственно.
Разница равна |11 - 8| = 3. Однако в примере приведена другая максимальная разница — 13. Это значит, что правильный ответ будет найден другой парой строк, либо условие задачи подразумевает работу с другими строками.
Дополнительные комментарии:
- В случае, когда массивы содержат одинаковые строки, необходимо учитывать все возможные комбинации строк.
- Важно аккуратно обработать граничные случаи, особенно когда массивы пусты или содержат одну строку.
Примеры возможных возвращаемых значений:
- Если оба массива пусты, результат должен быть равен -1.
- Если один из массивов пустой, результат также равен -1.
- Если в одном из массивов одна строка, нужно проверить максимальную разницу с единственной строкой другого массива.
Платформа: CodeWars
Название задачи: List Filtering (Фильтрация списка)
Ссылка на задачу: https://www.codewars.com/kata/53dbd5315a3c69eed20002dd
Сложность: 7 kyu
Уже решили (На момент написания статьи): 325 665 из 747 581
Тэги: Списки, фильтрация, структуры данных, основы
Оригинальное описание задачи:
In this kata you will create a function that takes a list of non-negative integers and strings and returns a new list with the strings filtered out.
Example
filter_list([1,2,'a','b']) == [1,2]
filter_list([1,'a','b',0,15]) == [1,0,15]
filter_list([1,2,'aasf','1','123',123]) == [1,2,123]
Пояснение задачи:
Требуется написать функцию, принимающую на вход список произвольных элементов (числа и строки), и возвращающую новый список, содержащий исключительно числовые элементы исходного списка.
Пример:
filter_list([1, 2, 'a', 'b']) → [1, 2]
filter_list([1, 'a', 'b', 0, 15]) → [1, 0, 15]
filter_list([1, 2, 'aasf', '1', '123', 123]) → [1, 2, 123]
Пояснение:
Функция должна пройти по списку и выбрать только те элементы, которые являются числами (целыми или вещественными).
Строки и другие типы данных (например, объекты, булевы значения и т.п.) нужно игнорировать.
Для решения задачи можно воспользоваться стандартными методами фильтрации, доступными в большинстве современных языков программирования:
- Python: `list(filter(lambda x: isinstance(x, int), input_list))`
- C#: `inputList.Where(x => x is int).ToList()`
- Factor: Использовать встроенный метод `filter-seq`, который удаляет неприемлемые элементы
- Java: `stream().filter(x -> x instanceof Integer).collect(Collectors.toList())`
- Scala: `filter(_.isInstanceOf[Int]).map(_.asInstanceOf[Int])`
- Kotlin: `filterIsInstance().toList()`
- Haskell: `filter (\x -> case x of Right _ -> True; Left _ -> False)`
Таким образом, задача сводится к применению функции-фильтра, которая отбирает только числовые элементы из входного списка.
Платформа: CodeWars
Название задачи: Parts of a list (Части списка)
Ссылка на задачу: https://www.codewars.com/kata/56f3a1e899b386da78000732
Сложность: 7 kyu
Уже решили (На момент написания статьи): 19 007 из 61 040
Тэги: Массивы, списки, структуры данных, алгоритмы
Оригинальное описание задачи:
Write a function `partlist` that gives all the ways to divide a list (an array) of at least two elements into two non-empty parts.
- Each two non empty parts will be in a pair (or an array for languages without tuples or a `struct`in C- C: see Examples test Cases-)
- Each part will be in a string - Elements of a pair must be in the same order as in the original array.
Examples of returns in different languages:
a = ["az", "toto", "picaro", "zone", "kiwi"] -->
[["az", "toto picaro zone kiwi"], ["az toto", "picaro zone kiwi"], ["az toto picaro", "zone kiwi"], ["az toto picaro zone", "kiwi"]]
or
a = {"az", "toto", "picaro", "zone", "kiwi"} --> {{"az", "toto picaro zone kiwi"}, {"az toto", "picaro zone kiwi"}, {"az toto picaro", "zone kiwi"}, {"az toto picaro zone", "kiwi"}}
or
a = ["az", "toto", "picaro", "zone", "kiwi"] --> [("az", "toto picaro zone kiwi"), ("az toto", "picaro zone kiwi"), ("az toto picaro", "zone kiwi"), ("az toto picaro zone", "kiwi")]
or
a = [|"az", "toto", "picaro", "zone", "kiwi"|] --> [("az", "toto picaro zone kiwi"), ("az toto", "picaro zone kiwi"), ("az toto picaro", "zone kiwi"), ("az toto picaro zone", "kiwi")]
or
a = ["az", "toto", "picaro", "zone", "kiwi"] --> "(az, toto picaro zone kiwi)(az toto, picaro zone kiwi)(az toto picaro, zone kiwi)(az toto picaro zone, kiwi)"
Note You can see other examples for each language in "Your test cases"
Пояснение задачи:
Функция `partlist` должна принимать список строк (`array`) длиной минимум два элемента и возвращать все возможные способы разбиения списка на две непустые части.
Пояснение:
Основная задача — разбить исходный массив на две части таким образом, чтобы каждая часть содержала хотя бы один элемент. Разбиение происходит последовательным добавлением каждого элемента в первую часть, начиная с первого элемента, и переносом остальных элементов во вторую часть.
Рассмотрим пошагово алгоритм:
1. Итерация по индексам: Начинаем с индекса 1 (второй элемент) и продолжаем до конца списка.
- На каждом шаге берем текущий элемент и добавляем его в первую часть, а оставшиеся элементы формируем во вторую часть.
2. Форматирование результата: Каждый раз, когда мы создаем новую пару частей, результат сохраняется в виде строки, где первая часть соединяется пробелом, а вторая часть выводится отдельно.
3. Обработка последнего элемента: Последний элемент всегда добавляется в отдельную вторую часть, так как иначе она окажется пустой.
Пример работы функции:
Для входного списка: a = ["az", "toto", "picaro", "zone", "kiwi"]
Последовательность шагов:
- Первый проход:
Первая часть: "az" Вторая часть: "toto picaro zone kiwi"
- Второй проход: Первая часть: "az toto"
Вторая часть: "picaro zone kiwi"
- Третий проход:
Первая часть: "az toto picaro"
Вторая часть: "zone kiwi"
- Четвертый проход:
Первая часть: "az toto picaro zone" Вторая часть: "kiwi"
Таким образом, результатом будет:
["az", "toto picaro zone kiwi"], ["az toto", "picaro zone kiwi"], ["az toto picaro", "zone kiwi"], ["az toto picaro zone", "kiwi"]
Дополнительные замечания
- Входной массив всегда содержит минимум два элемента.
- Порядок элементов в каждой паре частей должен строго соответствовать порядку в исходном списке.
- Результат должен возвращаться в виде списка строк или списков строк, в зависимости от используемого языка программирования.
Платформа: CodeWars
Название задачи: Simple Simple Simple String Expansion (Простое Простое Простое расширение строки)
Ссылка на задачу: https://www.codewars.com/kata/5ae326342f8cbc72220000d2
Сложность: 6 kyu
Уже решили (На момент написания статьи): 4 448 из 19 351
Тэги: Строки, регулярные выражения, основы
Оригинальное описание задачи:
Given a string that includes alphanumeric characters ("3a4B2d") return the expansion of that string: The numeric values represent the occurrence of each letter following that numeric value. There should be no numeric characters in the final string.
Notes
The first occurrence of a numeric value should be the number of times each character behind it is repeated, until the next numeric value appears
If there are multiple consecutive numeric characters, only the last one should be used (ignore the previous ones)
Empty strings should return an empty string.
Your code should be able to work for both lower and capital case letters.
"3D2a5d2f" --> "DDDaadddddff" # basic example: 3 * "D" + 2 * "a" + 5 * "d" + 2 * "f"
"3abc" --> "aaabbbccc" # not "aaabc", nor "abcabcabc"; 3 * "a" + 3 * "b" + 3 * "c"
"3d332f2a" --> "dddffaa" # multiple consecutive digits: 3 * "d" + 2 * "f" + 2 * "a"
"abcde" --> "abcde" # no digits
"1111" -->"" # no characters to repeat
"" --> "" # empty string
Пояснение задачи:
Задача состоит в том, чтобы преобразовать строку специального формата в расширенную строку символов.
Описание решения:
На входе — строка, содержащая буквы и цифры. Цифры обозначают количество повторений букв, следующих за ними. Буквы, идущие подряд, рассматриваются как одна группа, и цифра перед группой определяет, сколько раз эта группа будет повторена.
Основные правила:
- Первая встреченная цифра определяет количество повторений следующей буквы.
- Если после цифры идёт несколько букв, каждая буква считается частью одной группы.
- Последующие цифры игнорируются, учитываются только последние цифры перед каждой новой группой букв.
- Если входная строка пустая, выход тоже должен быть пустой строкой.
- Входная строка может содержать как строчные, так и заглавные буквы.
Примеры
- "3D2a5d2f"` → "DDDaadddddff" — первая цифра 3 означает три буквы D, далее 2 буквы a, затем 5 букв d и 2 буквы f.
- "3abc"` → "aaabbbccc" — три буквы a, три буквы b, три буквы c.
- "3d332f2a"` → "dddffaa" — сначала три буквы d, затем две буквы f и две буквы a.
- "abcde" → "abcde" — строки без цифр остаются неизменными.
- "1111" → "" — отсутствие букв приводит к пустой строке.
- "" → "" — пустая строка остаётся пустой.
Таким образом, задача сводится к последовательному разбору входной строки, обработке групп букв и цифр и формированию итогового результата.
Платформа: CodeWars
Название задачи: Square sums (simple) (Квадратные суммы (простые))
Ссылка на задачу: https://www.codewars.com/kata/5a6b24d4e626c59d5b000066
Сложность: 5 kyu
Уже решили (На момент написания статьи): 1 532 из 12 228
Тэги: Алгоритмы, Математика
Оригинальное описание задачи:
This is simple version of harder
Square sums
Write function that, given integer number `N` (in range `2..43`), returns array of integers `1..N` arranged in a way, so sum of each 2 consecutive numbers is a square.
Solution is valid if and only if following two criterias are met:
1. Each number in range `1..N` is used once and only once.
2. Sum of each 2 consecutive numbers is a perfect square.
Example
For N=15 solution could look like this:
`[ 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8 ]`
Verification
1. All numbers are used once and only once. When sorted in ascending order array looks like this:
`[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]`
2. Sum of each 2 consecutive numbers is a perfect square:
16 16 16 16 16 16 16
/+\ /+\ /+\ /+\ /+\ /+\ /+\
[ 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8 ]
\+/ \+/ \+/ \+/ \+/ \+/ \+/
9 25 9 25 9 25 9
9 = 3*3
16 = 4*4
25 = 5*5
If there is no solution, return `false` ( `None` in Scala, `Nothing` in Haskell ). For example if `N=5`, then numbers `1,2,3,4,5` cannot be put into square sums row: `1+3=4`, `4+5=9`, but `2` has no pairs and cannot link `[1,3]` and `[4,5]`.
Have fun!
Harder version of this Kata is [here](/kata/square-sums).
Пояснение задачи:
Задача состоит в следующем:
Необходимо разработать функцию, принимающую целое число N (2 ≤ N ≤ 43) и возвращающую перестановку чисел от 1 до N, удовлетворяющую двум условиям:
1. Уникальность чисел: Все числа от 1 до N используются ровно один раз.
2. Суммы квадратов: Сумма каждого соседнего элемента является полным квадратом (например, 16 = 4^2, 25 = 5^2 и т.п.).
Пример решения для N = 15
Перестановка чисел от 1 до 15: [9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8]
Проверим выполнение условий:
- Все числа от 1 до 15 присутствуют единожды.
- Проверим суммы соседних чисел:
9 + 7 = 16 = 4^2
7 + 2 = 9 = 3^2
2 + 14 = 16 = 4^2
14 + 11 = 25 = 5^2
11 + 5 = 16 = 4^2
5 + 4 = 9 = 3^2
4 + 12 = 16 = 4^2
12 + 13 = 25 = 5^2
13 + 3 = 16 = 4^2
3 + 6 = 9 = 3^2
6 + 10 = 16 = 4^2
10 + 15 = 25 = 5^2
15 + 1 = 16 = 4^2
1 + 8 = 9 = 3^2
Таким образом, условие выполнено.
Сложность задачи:
При отсутствии подходящей перестановки функция должна вернуть специальный маркер (`False` в Python, `None` в Scala, `Nothing` в Haskell), указывающий невозможность нахождения подходящего решения.
Например, для N = 5 нельзя построить такую последовательность, поскольку число 2
Благодарю за уделенное время и надеюсь, что представленные материалы были вам интересны! Я приглашаю вас к диалогу, чтобы вместе разобрать предлагаемые алгоритмы и найти оптимальные решения. Буду рад вашим отзывам и комментариям, и предлагаю нам вместе поддерживать конструктивную и позитивную атмосферу. До новых встреч в будущих публикациях!
Вступайте в нашу телеграмм-группу Инфостарт