Платформа: 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"]
Дополнительные замечания
- Входной массив всегда содержит минимум два элемента.
- Порядок элементов в каждой паре частей должен строго соответствовать порядку в исходном списке.
- Результат должен возвращаться в виде списка строк или списков строк, в зависимости от используемого языка программирования.