Привет! Новая подборка задач по программированию: от базовых упражнений до сложных алгоритмов. Тренируйтесь, развивайтесь и получайте удовольствие от процесса!
Что было раньше:
В предыдущей части мы решили:
- Count the Digit (Подсчитать цифру)
- Speed Control (Контроль скорости)
- Easy wallpaper (Простые обои)
- Sort by binary ones (Сортировка по двоичным единицам)
- How Many Lonely Letters? (Сколько одиноких писем?)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Drying Potatoes (Сушка картофеля)
Ссылка на задачу: https://www.codewars.com/kata/58ce8725c835848ad6000007
Сложность: 7 kyu
Уже решили (На момент написания статьи): 11 169 из 71 584
Тэги: Fundamentals, Puzzles
Оригинальное описание задачи:
All we eat is water and dry matter.
Let us begin with an example:
John bought potatoes: their weight is 100 kilograms. Potatoes contain water and dry matter.The water content is 99 percent of the total weight. He thinks they are too wet and puts them in an oven - at low temperature - for them to lose some water.
At the output the water content is only 98%.
What is the total weight in kilograms (water content plus dry matter) coming out of the oven?
He finds 50 kilograms and he thinks he made a mistake: "So much weight lost for such a small change in water content!"
Can you help him?
Task
Write function `potatoes` with
- int parameter `p0` - initial percent of water-
- int parameter `w0` - initial weight -
- int parameter `p1` - final percent of water
- potatoes`should return the final weight coming out of the oven `w1` truncated as an int. Example: potatoes(99, 100, 98) --> 50
Пояснение задачи:
Для данной задачи нам даны начальное содержание воды (`p0`), исходный вес (`w0`) и конечное содержание воды (`p1`).
Требуется:
рассчитать итоговый вес после испарения части воды, сохранив процентное соотношение между водой и сухим веществом.
Решение требует следующих шагов:
1. Рассчитать массу сухого вещества (dry matter) исходя из начальной массы и содержания воды.
2. Найти новую массу сухого вещества после изменения процента воды.
3. Вычислить новый общий вес, зная, что масса сухого вещества остаётся неизменной.
4. Округлить полученный вес до целого числа.
Формула расчёта выглядит следующим образом: dry_matter = w0 * (1 - p0 / 100) new_weight = dry_matter / (1 - p1 / 100) result = round(new_weight)
Задача 2
Платформа: CodeWars
Название задачи: How Broke Are You? (Насколько ты разорен?)
Ссылка на задачу: https://www.codewars.com/kata/699583ba5ca289725b496ad4
Сложность: 6 kyu
Уже решили (На момент написания статьи): 35 из 158
Тэги: Arrays, Algorithms, Logic
Оригинальное описание задачи:
You are tracking your "broke level" based on daily expenditures.
A broke event is counted under the following conditions:
1. If a single day's expenditure is less than or equal to 3 dollars.
2. If daily expenditure is less than or equal to 7 dollars for 3 consecutive days.
3. If daily expenditure is less than or equal to 10 dollars for 7 consecutive days.
Important:
- A broke event can either be a day long, 3 days or 7 days long.Otherwise a new broke event is started.
- If a smaller threshold event occurs inside a larger qualifying streak, it does NOT count separately.
- Overlapping streaks count as a single broke event. eg, [7,3,7] would only be one broke event
Example: [5,6,7,20,3] returns 2, ie 5,6,7 and 3
Given a list of daily expenditures, return the total number of broke events.
Пояснение задачи:
Задача заключается в подсчёте количества периодов (событий) наступления состояния «финансового краха» («разорения») на основе ежедневных расходов.
Состояние разорения определяется тремя условиями:
1. Один день: расход меньше либо равен 3 долларам.
2. Три дня подряд: расход каждого дня меньше либо равен 7 долларов.
3. Семь дней подряд: расход каждого дня меньше либо равен 10 долларов.
Правила:
- Разорение считается одним событием, даже если оно состоит из нескольких дней подряд, удовлетворяющих одному из условий.
- Если меньший период разорения входит внутрь большего периода, этот меньший период не учитывается отдельно.
- Несколько пересекающихся разорительных периодов считаются единым случаем разорения.
Пример: [5,6,7,20,3]
Здесь два события разорения:
- первый период: дни 5, 6, 7
- второй период: день 3
Таким образом, результат будет равен 2.
Решение задачи требует отслеживания текущих серий подряд идущих дней, удовлетворяющих условиям разорения, и правильного учёта пересечения серий.
Задача 3
Платформа: CodeWars
Название задачи: Vowel Recognition (Распознавание гласных)
Ссылка на задачу: https://www.codewars.com/kata/5bed96b9a68c19d394000b1d
Сложность: 6 kyu
Уже решили (На момент написания статьи): 1 244 из 7 488
Тэги: Algorithms, Performance
Оригинальное описание задачи:
`{a, e, i, o, u, A, E, I, O, U}`
Natural Language Understanding is the subdomain of Natural Language Processing where people used to design AI based applications have ability to understand the human languages. HashInclude Speech Processing team has a project named Virtual Assistant. For this project they appointed you as a data engineer (who has good knowledge of creating clean datasets by writing efficient code). As a data engineer your first task is to make vowel recognition dataset. In this task you have to find the presence of vowels in all possible substrings of the given string. For each given string you have to return the total number of vowels.
Example
Given a string `"baceb"` you can split it into substrings: `b, ba, bac, bace, baceb, a, ac, ace, aceb, c, ce, ceb, e, eb, b`. The number of vowels in each of these substrings is `0, 1, 1, 2, 2, 1, 1, 2, 2, 0, 1, 1, 1, 1, 0`; if you sum up these number, you get `16` - the expected output.
Note: your solution should have linear time complexity.
Пояснение задачи:
Задача состоит в том, чтобы разработать алгоритм, определяющий количество гласных букв (`a`, `e`, `i`, `o`, `u`) во всех возможных подстроках заданной строки.
Основные шаги решения:
1. Определение гласных: Гласными считаются буквы `a`, `e`, `i`, `o`, `u` (как строчные, так и заглавные).
2. Подстроки: Нужно перебрать все возможные подстроки исходной строки. Подстрокой считается любая непрерывная последовательность символов, начиная от начала строки до любого её конца.
3. Счётчик гласных: Для каждой подстроки подсчитывается количество гласных букв.
4. Сумма итоговых значений: После обработки всех подстрок, суммируются результаты подсчёта гласных.
Пример работы алгоритма:
Для строки "baceb":
- Возможные подстроки: `b, ba, bac, bace, baceb, a, ac, ace, aceb, c, ce, ceb, e, eb, b`
- Количество гласных в каждой подстроке: `0, 1, 1, 2, 2, 1, 1, 2, 2, 0, 1, 1, 1, 1, 0`
- Итоговая сумма: 0 + 1 + 1 + 2 + 2 + 1 + 1 + 2 + 2 + 0 + 1 + 1 + 1 + 1 + 0 = 16
Дополнительное требование:
Алгоритм должен иметь линейную временную сложность (O(n)), где "n" — длина входной строки.
Это значит, что решение должно эффективно обрабатывать строку за один проход, используя оптимальные структуры данных и методы подсчёта.
Примеры: - Вход: "baceb" → Выход: `16` - Вход: "aeiou" → Выход: `15` - Вход: "bbccc" → Выход: `0`
Задача 4
Платформа: CodeWars
Название задачи: Feed Kahumolings! (Накорми Кахумолингов!)
Ссылка на задачу: https://www.codewars.com/kata/557b75579b03996942000061
Сложность: 6 kyu
Уже решили (На момент написания статьи): 719 из 2 459
Тэги: Algorithms
Оригинальное описание задачи:
Story You are a cook in an alien restaurant at a distant planet called Kahumo.
These aliens have some specific physiology features:
Aliens eat only one type of food in one day.
Each food has a special factor called `flavour` (let's designate it as "k" hereafter). Each alien has several mouths of different size. The amount of food each mouth eats depends on mouth number.Second mouth must eat exactly "k" times more than the first, third mouth must eat exactly "k" times more than the second, and so on.
For example: if "k" is 2, and the first mouth ate 1 kg of food, second mouth must eat `2 * 1 = 2` kg of food, third eats `2 * 2 = 4` kg of food, fourth eats `2 * 4 = 8` kg and so on.
Food on Kahumo is very valuable and spoils fast.
This means that if a client orders a certain amount of food, you have to serve it all in the exact proportions required for each of your client's mouths. If any of client's mouths eats less or more than requested, client will feel pain in his stomach, and may spray your eyes with his mildly acidic emotion fluid (which also is kahumoling saliva) as a sign of disrespect.
(Please, not again, this juice in my eyes makes me sick!)
Kahumolings have very sensitive tongues, but not absolutely sensitive. They can feel deviations within 9 grams.
This means that if you serve your client 100.005 kg of food instead of 100.000, kahumoling will probably not notice.
Function features
Arguments
`food` is the amount of food your client has ordered.
`flavour` is the *k* factor of the food your client ordered.
`mouths` is the amount of mouths of your client.
Return format
Serve the result in the following format: `[x, y, z, ...]`, where values correspond to the amount of food served to a certain mouth (float; you can round it to 3 decimal places) in ascending order (low to high).
Tests
Number of served mouths must correspond to the number of mouths your client has.
Total amount of food must correspond to the amount ordered by your client.
Each next mouth must receive exactly *k* times more food than the previous.
Examples
Input: (31, 2, 5)
Output: [1.0, 2.0, 4.0, 8.0, 16.0]
Input: (728, 3, 6)
Output: [2.0, 6.0, 18.0, 54.0, 162.0, 486.0]
Input: (100, 1.5, 3)
Output: [21.053, 31.579, 47.368]
Пояснение задачи:
Задача заключается в приготовлении порции еды для клиента-пришельца с необычной физиологией.
Клиент обладает несколькими ртами разного размера, каждый из которых ест строго определённое количество пищи в зависимости от размера рта и специфического вкуса блюда (фактор "k").
Основные условия:
- Каждый клиент заказывает конкретное количество пищи (`food`), которое необходимо разделить между своими ртами.
- Каждый последующий рот ест ровно в "k" раз больше предыдущего.
- Физиология клиента позволяет допускать небольшие отклонения в весе порции (до ±9 граммов), однако суммарный вес порций должен точно соответствовать заказу.
- Необходимо округлять порции до трёх знаков после запятой.
Пример:
Исходные данные:
Заказано 31 кг пищи с фактором "k" = 2, клиент имеет 5 ртов.
Расчёт порции:
- Первый рот получает 1 кг.
- Второй рот получает 2 кг (1 × 2).
- Третий рот получает 4 кг (2 × 2).
- Четвёртый рот получает 8 кг (4 × 2).
- Пятый рот получает 16 кг (8 × 2).
Результат: [1.0, 2.0, 4.0, 8.0, 16.0]
Подходы к решению:
- Нужно вычислить порции для каждого рта последовательно, начиная с первой порции равной единице, умножая её на фактор "k" для каждого последующего рта.
- Важно соблюдать баланс между общей суммой порций и допустимыми отклонениями веса.
- Итоговый результат должен быть отсортирован по возрастанию и округлён до трёх знаков после запятой.
Задача 5
Платформа: CodeWars
Название задачи: up AND down (вверх И вниз)
Ссылка на задачу: https://www.codewars.com/kata/56cac350145912e68b0006f0
Сложность: 6 kyu
Уже решили (На момент написания статьи): 3 435 из 17 346
Тэги: Fundamentals, Strings
Оригинальное описание задачи:
Don't be afraid, the description is rather long but - hopefully - it is in order that the process be well understood.
You are given a string `s` made up of substring s(1), s(2), s(n) separated by whitespaces.
Example:
"after be arrived two My so"
Task:
Return a string `t` having the following property: `length t(O) <= length t(1) >= length t(2) <= length t(3) >= length t(4) .... (P)`
where the `t(i)` are the substring of `s`; you must respect the following rule:
at each step from left to right, you can only move either already consecutive strings or strings that became consecutive after a previous move. The number of moves should be minimum.
Let us go with our example:
The length of "after" is greater than the length of "be". Let us move them ->"be after arrived two My so"
The length of "after" is smaller than the length of "arrived". Let us move them -> "be arrived after two My so"
The length of "after" is greater than the length of "two" ->"be arrived two after My so"
The length of "after" is greater than the length of "My". Good! Finally the length of "My" and "so" are the same, nothing to do. At the end of the process, the substrings s(i) verify:
`length s(0) <= length s(1) >= length s(2) <= length s(3) >= length (s4) <= length (s5)`
Hence given a string s of substrings `s(i)` the function `arrange` with the previous process should return a *unique* string `t` having the property (P).
It is kind of roller coaster or up and down.
When you have property (P), to make the result more "up and down" visible t(0), t(2), ... will be lower cases and the others upper cases.
arrange("after be arrived two My so") should return "be ARRIVED two AFTER my SO"
Notes:
- The string "My after be arrived so two" has the property (P) but can't be obtained by the described process so it won't be accepted as a result.The property (P) doesn't give unicity by itself.
- Process: go from left to right, move only consecutive strings when needed.
- For the first fixed tests the needed number of moves to get property (P) is given as a comment so that you can know if your process follows the rule.
Пояснение задачи:
Задача состоит в перестановке подстрок строки таким образом, чтобы длины последовательных подстрок чередовались между собой по принципу «возрастание — убывание».
Перестановка должна выполняться минимально возможным количеством шагов, при которых каждая следующая перемещаемая пара подстрок должна быть либо уже смежной, либо сделанной таковой предыдущими шагами.
Пример работы алгоритма:
Дана строка: "after be arrived two My so"
1. Сравниваем длины соседних подстрок: `after` > `be` → меняем местами: `be after arrived two My so`
2. Далее сравниваем длины следующих подстрок: `after` < `arrived` → снова меняем местами: `be arrived after two My so`
3. Снова сравниваем: `after` > `two` → меняем местами: `be arrived two after My so`
4. Последнее сравнение: `after` > `My` → всё правильно, дальше ничего менять не нужно.
Таким образом, получаем строку, удовлетворяющую условию чередования длин подстрок: `be arrived two after My so`
Дополнительное требование:
Для наглядности результата буквы с чётными индексами (0, 2, 4, …) будут записаны строчными буквами, а с нечётными индексами (1, 3, 5, …) — заглавными. Формальное описание:
- Вход: строка, состоящая из нескольких подстрок, разделённых пробелами.
- Выход: строка, удовлетворяющая правилу чередования длин подстрок и соответствующая указанному формату записи букв.
- Шаги:
1. Начинаем слева направо сравнивать длины соседних подстрок.
2. Если очередная пара подстрок нарушает порядок чередования, меняем их местами.
3. Повторяем шаги до тех пор, пока не достигнем конца строки.
4. Применяем форматирование результата, переводя буквы с чётными индексами в нижний регистр, а с нечётными — в верхний.
Задача 6
Платформа: CodeWars
Название задачи: Ratio of Bouncy Numbers (Соотношение прыгучих чисел)
Ссылка на задачу: https://www.codewars.com/kata/562b099becfe844f3800000a
Сложность: 5 kyu
Уже решили (На момент написания статьи): 403 из 1 333
Тэги: Mathematics, Puzzles
Оригинальное описание задачи:
Working from left-to-right if no digit is exceeded by the digit to its left it is called an increasing number; for example, `134468`. Similarly if no digit is exceeded by the digit to its right it is called a decreasing number;
for example: `66420`.
We shall call a positive integer that is neither increasing nor decreasing a "bouncy" number; for example, `155349`.
Clearly there cannot be any bouncy numbers below one-hundred, but just over half of the numbers below one-thousand (`525`) are bouncy. In fact, the least number for which the proportion of bouncy numbers first reaches 50% is `538`.
Surprisingly, bouncy numbers become more and more common and by the time we reach `21780` the proportion of bouncy numbers is equal to 90%.
Your Task Complete the `bouncyRatio` function.
The input will be the target ratio.
The output should be the smallest number such that the proportion of bouncy numbers reaches the target ratio.
You should throw an `Error` for a ratio less than 0% or greater than 99%. .
Пояснение задачи:
Задача состоит в следующем:
Необходимо реализовать функцию `bouncyRatio`, принимающую целочисленный процент (целое число от 0 до 99) — целевой уровень доли «подскакивающих» (bouncy) чисел среди всех положительных целых чисел.
Основные определения:
- Увеличивающее число: число, в котором каждый последующий разряд строго больше предыдущего (например, `134468`). - Уменьшающее число: число, в котором каждый последующий разряд строго меньше предыдущего (например, `66420`).
Подскакивающее число (bouncy): число, которое не является ни увеличивающим, ни уменьшающим (например, `155349`).
Требуется найти минимальное целое число, начиная с которого доля подскакивающих чисел достигает указанного уровня.
Пример:
Для входного параметра 50%, функция должна вернуть число 538, поскольку именно с этого числа ровно половина чисел становятся подскакивающими.
Ограничения:
- Входное значение должно находиться в диапазоне от 0 до 99 включительно.
- Если переданное значение выходит за указанные пределы, необходимо выбросить ошибку.
Подход к решению:
1. Проверяем корректность входного значения.
2. Используем перебор чисел, начиная с единицы, проверяя каждое число на соответствие критериям увеличения, уменьшения или подскакивания.
3. Считаем долю подскакивающих чисел и сравниваем её с заданным уровнем.
4. Как только найден минимальный номер, при котором доля достигнет или превысит указанный уровень, возвращаем этот номер.
Заключение:
Платформа: CodeWars
Название задачи: Drying Potatoes (Сушка картофеля)
Ссылка на задачу: https://www.codewars.com/kata/58ce8725c835848ad6000007
Сложность: 7 kyu
Уже решили (На момент написания статьи): 11 169 из 71 584
Тэги: Fundamentals, Puzzles
Оригинальное описание задачи:
All we eat is water and dry matter.
Let us begin with an example:
John bought potatoes: their weight is 100 kilograms. Potatoes contain water and dry matter.The water content is 99 percent of the total weight. He thinks they are too wet and puts them in an oven - at low temperature - for them to lose some water.
At the output the water content is only 98%.
What is the total weight in kilograms (water content plus dry matter) coming out of the oven?
He finds 50 kilograms and he thinks he made a mistake: "So much weight lost for such a small change in water content!"
Can you help him?
Task
Write function `potatoes` with
- int parameter `p0` - initial percent of water-
- int parameter `w0` - initial weight -
- int parameter `p1` - final percent of water
- potatoes`should return the final weight coming out of the oven `w1` truncated as an int. Example: potatoes(99, 100, 98) --> 50
Пояснение задачи:
Для данной задачи нам даны начальное содержание воды (`p0`), исходный вес (`w0`) и конечное содержание воды (`p1`).
Требуется:
рассчитать итоговый вес после испарения части воды, сохранив процентное соотношение между водой и сухим веществом.
Решение требует следующих шагов:
1. Рассчитать массу сухого вещества (dry matter) исходя из начальной массы и содержания воды.
2. Найти новую массу сухого вещества после изменения процента воды.
3. Вычислить новый общий вес, зная, что масса сухого вещества остаётся неизменной.
4. Округлить полученный вес до целого числа.
Формула расчёта выглядит следующим образом: dry_matter = w0 * (1 - p0 / 100) new_weight = dry_matter / (1 - p1 / 100) result = round(new_weight)
Платформа: CodeWars
Название задачи: How Broke Are You? (Насколько ты разорен?)
Ссылка на задачу: https://www.codewars.com/kata/699583ba5ca289725b496ad4
Сложность: 6 kyu
Уже решили (На момент написания статьи): 35 из 158
Тэги: Arrays, Algorithms, Logic
Оригинальное описание задачи:
You are tracking your "broke level" based on daily expenditures.
A broke event is counted under the following conditions:
1. If a single day's expenditure is less than or equal to 3 dollars.
2. If daily expenditure is less than or equal to 7 dollars for 3 consecutive days.
3. If daily expenditure is less than or equal to 10 dollars for 7 consecutive days.
Important:
- A broke event can either be a day long, 3 days or 7 days long.Otherwise a new broke event is started.
- If a smaller threshold event occurs inside a larger qualifying streak, it does NOT count separately.
- Overlapping streaks count as a single broke event. eg, [7,3,7] would only be one broke event
Example: [5,6,7,20,3] returns 2, ie 5,6,7 and 3
Given a list of daily expenditures, return the total number of broke events.
Пояснение задачи:
Задача заключается в подсчёте количества периодов (событий) наступления состояния «финансового краха» («разорения») на основе ежедневных расходов.
Состояние разорения определяется тремя условиями:
1. Один день: расход меньше либо равен 3 долларам.
2. Три дня подряд: расход каждого дня меньше либо равен 7 долларов.
3. Семь дней подряд: расход каждого дня меньше либо равен 10 долларов.
Правила:
- Разорение считается одним событием, даже если оно состоит из нескольких дней подряд, удовлетворяющих одному из условий.
- Если меньший период разорения входит внутрь большего периода, этот меньший период не учитывается отдельно.
- Несколько пересекающихся разорительных периодов считаются единым случаем разорения.
Пример: [5,6,7,20,3]
Здесь два события разорения:
- первый период: дни 5, 6, 7
- второй период: день 3
Таким образом, результат будет равен 2.
Решение задачи требует отслеживания текущих серий подряд идущих дней, удовлетворяющих условиям разорения, и правильного учёта пересечения серий.
Платформа: CodeWars
Название задачи: Vowel Recognition (Распознавание гласных)
Ссылка на задачу: https://www.codewars.com/kata/5bed96b9a68c19d394000b1d
Сложность: 6 kyu
Уже решили (На момент написания статьи): 1 244 из 7 488
Тэги: Algorithms, Performance
Оригинальное описание задачи:
`{a, e, i, o, u, A, E, I, O, U}`
Natural Language Understanding is the subdomain of Natural Language Processing where people used to design AI based applications have ability to understand the human languages. HashInclude Speech Processing team has a project named Virtual Assistant. For this project they appointed you as a data engineer (who has good knowledge of creating clean datasets by writing efficient code). As a data engineer your first task is to make vowel recognition dataset. In this task you have to find the presence of vowels in all possible substrings of the given string. For each given string you have to return the total number of vowels.
Example
Given a string `"baceb"` you can split it into substrings: `b, ba, bac, bace, baceb, a, ac, ace, aceb, c, ce, ceb, e, eb, b`. The number of vowels in each of these substrings is `0, 1, 1, 2, 2, 1, 1, 2, 2, 0, 1, 1, 1, 1, 0`; if you sum up these number, you get `16` - the expected output.
Note: your solution should have linear time complexity.
Пояснение задачи:
Задача состоит в том, чтобы разработать алгоритм, определяющий количество гласных букв (`a`, `e`, `i`, `o`, `u`) во всех возможных подстроках заданной строки.
Основные шаги решения:
1. Определение гласных: Гласными считаются буквы `a`, `e`, `i`, `o`, `u` (как строчные, так и заглавные).
2. Подстроки: Нужно перебрать все возможные подстроки исходной строки. Подстрокой считается любая непрерывная последовательность символов, начиная от начала строки до любого её конца.
3. Счётчик гласных: Для каждой подстроки подсчитывается количество гласных букв.
4. Сумма итоговых значений: После обработки всех подстрок, суммируются результаты подсчёта гласных.
Пример работы алгоритма:
Для строки "baceb":
- Возможные подстроки: `b, ba, bac, bace, baceb, a, ac, ace, aceb, c, ce, ceb, e, eb, b`
- Количество гласных в каждой подстроке: `0, 1, 1, 2, 2, 1, 1, 2, 2, 0, 1, 1, 1, 1, 0`
- Итоговая сумма: 0 + 1 + 1 + 2 + 2 + 1 + 1 + 2 + 2 + 0 + 1 + 1 + 1 + 1 + 0 = 16
Дополнительное требование:
Алгоритм должен иметь линейную временную сложность (O(n)), где "n" — длина входной строки.
Это значит, что решение должно эффективно обрабатывать строку за один проход, используя оптимальные структуры данных и методы подсчёта.
Примеры: - Вход: "baceb" → Выход: `16` - Вход: "aeiou" → Выход: `15` - Вход: "bbccc" → Выход: `0`
Платформа: CodeWars
Название задачи: Feed Kahumolings! (Накорми Кахумолингов!)
Ссылка на задачу: https://www.codewars.com/kata/557b75579b03996942000061
Сложность: 6 kyu
Уже решили (На момент написания статьи): 719 из 2 459
Тэги: Algorithms
Оригинальное описание задачи:
Story You are a cook in an alien restaurant at a distant planet called Kahumo.
These aliens have some specific physiology features:
Aliens eat only one type of food in one day.
Each food has a special factor called `flavour` (let's designate it as "k" hereafter). Each alien has several mouths of different size. The amount of food each mouth eats depends on mouth number.Second mouth must eat exactly "k" times more than the first, third mouth must eat exactly "k" times more than the second, and so on.
For example: if "k" is 2, and the first mouth ate 1 kg of food, second mouth must eat `2 * 1 = 2` kg of food, third eats `2 * 2 = 4` kg of food, fourth eats `2 * 4 = 8` kg and so on.
Food on Kahumo is very valuable and spoils fast.
This means that if a client orders a certain amount of food, you have to serve it all in the exact proportions required for each of your client's mouths. If any of client's mouths eats less or more than requested, client will feel pain in his stomach, and may spray your eyes with his mildly acidic emotion fluid (which also is kahumoling saliva) as a sign of disrespect.
(Please, not again, this juice in my eyes makes me sick!)
Kahumolings have very sensitive tongues, but not absolutely sensitive. They can feel deviations within 9 grams.
This means that if you serve your client 100.005 kg of food instead of 100.000, kahumoling will probably not notice.
Function features
Arguments
`food` is the amount of food your client has ordered.
`flavour` is the *k* factor of the food your client ordered.
`mouths` is the amount of mouths of your client.
Return format
Serve the result in the following format: `[x, y, z, ...]`, where values correspond to the amount of food served to a certain mouth (float; you can round it to 3 decimal places) in ascending order (low to high).
Tests
Number of served mouths must correspond to the number of mouths your client has.
Total amount of food must correspond to the amount ordered by your client.
Each next mouth must receive exactly *k* times more food than the previous.
Examples
Input: (31, 2, 5)
Output: [1.0, 2.0, 4.0, 8.0, 16.0]
Input: (728, 3, 6)
Output: [2.0, 6.0, 18.0, 54.0, 162.0, 486.0]
Input: (100, 1.5, 3)
Output: [21.053, 31.579, 47.368]
Пояснение задачи:
Задача заключается в приготовлении порции еды для клиента-пришельца с необычной физиологией.
Клиент обладает несколькими ртами разного размера, каждый из которых ест строго определённое количество пищи в зависимости от размера рта и специфического вкуса блюда (фактор "k").
Основные условия:
- Каждый клиент заказывает конкретное количество пищи (`food`), которое необходимо разделить между своими ртами.
- Каждый последующий рот ест ровно в "k" раз больше предыдущего.
- Физиология клиента позволяет допускать небольшие отклонения в весе порции (до ±9 граммов), однако суммарный вес порций должен точно соответствовать заказу.
- Необходимо округлять порции до трёх знаков после запятой.
Пример:
Исходные данные:
Заказано 31 кг пищи с фактором "k" = 2, клиент имеет 5 ртов.
Расчёт порции:
- Первый рот получает 1 кг.
- Второй рот получает 2 кг (1 × 2).
- Третий рот получает 4 кг (2 × 2).
- Четвёртый рот получает 8 кг (4 × 2).
- Пятый рот получает 16 кг (8 × 2).
Результат: [1.0, 2.0, 4.0, 8.0, 16.0]
Подходы к решению:
- Нужно вычислить порции для каждого рта последовательно, начиная с первой порции равной единице, умножая её на фактор "k" для каждого последующего рта.
- Важно соблюдать баланс между общей суммой порций и допустимыми отклонениями веса.
- Итоговый результат должен быть отсортирован по возрастанию и округлён до трёх знаков после запятой.
Платформа: CodeWars
Название задачи: up AND down (вверх И вниз)
Ссылка на задачу: https://www.codewars.com/kata/56cac350145912e68b0006f0
Сложность: 6 kyu
Уже решили (На момент написания статьи): 3 435 из 17 346
Тэги: Fundamentals, Strings
Оригинальное описание задачи:
Don't be afraid, the description is rather long but - hopefully - it is in order that the process be well understood.
You are given a string `s` made up of substring s(1), s(2), s(n) separated by whitespaces.
Example:
"after be arrived two My so"
Task:
Return a string `t` having the following property: `length t(O) <= length t(1) >= length t(2) <= length t(3) >= length t(4) .... (P)`
where the `t(i)` are the substring of `s`; you must respect the following rule:
at each step from left to right, you can only move either already consecutive strings or strings that became consecutive after a previous move. The number of moves should be minimum.
Let us go with our example:
The length of "after" is greater than the length of "be". Let us move them ->"be after arrived two My so"
The length of "after" is smaller than the length of "arrived". Let us move them -> "be arrived after two My so"
The length of "after" is greater than the length of "two" ->"be arrived two after My so"
The length of "after" is greater than the length of "My". Good! Finally the length of "My" and "so" are the same, nothing to do. At the end of the process, the substrings s(i) verify:
`length s(0) <= length s(1) >= length s(2) <= length s(3) >= length (s4) <= length (s5)`
Hence given a string s of substrings `s(i)` the function `arrange` with the previous process should return a *unique* string `t` having the property (P).
It is kind of roller coaster or up and down.
When you have property (P), to make the result more "up and down" visible t(0), t(2), ... will be lower cases and the others upper cases.
arrange("after be arrived two My so") should return "be ARRIVED two AFTER my SO"
Notes:
- The string "My after be arrived so two" has the property (P) but can't be obtained by the described process so it won't be accepted as a result.The property (P) doesn't give unicity by itself.
- Process: go from left to right, move only consecutive strings when needed.
- For the first fixed tests the needed number of moves to get property (P) is given as a comment so that you can know if your process follows the rule.
Пояснение задачи:
Задача состоит в перестановке подстрок строки таким образом, чтобы длины последовательных подстрок чередовались между собой по принципу «возрастание — убывание».
Перестановка должна выполняться минимально возможным количеством шагов, при которых каждая следующая перемещаемая пара подстрок должна быть либо уже смежной, либо сделанной таковой предыдущими шагами.
Пример работы алгоритма:
Дана строка: "after be arrived two My so"
1. Сравниваем длины соседних подстрок: `after` > `be` → меняем местами: `be after arrived two My so`
2. Далее сравниваем длины следующих подстрок: `after` < `arrived` → снова меняем местами: `be arrived after two My so`
3. Снова сравниваем: `after` > `two` → меняем местами: `be arrived two after My so`
4. Последнее сравнение: `after` > `My` → всё правильно, дальше ничего менять не нужно.
Таким образом, получаем строку, удовлетворяющую условию чередования длин подстрок: `be arrived two after My so`
Дополнительное требование:
Для наглядности результата буквы с чётными индексами (0, 2, 4, …) будут записаны строчными буквами, а с нечётными индексами (1, 3, 5, …) — заглавными. Формальное описание:
- Вход: строка, состоящая из нескольких подстрок, разделённых пробелами.
- Выход: строка, удовлетворяющая правилу чередования длин подстрок и соответствующая указанному формату записи букв.
- Шаги:
1. Начинаем слева направо сравнивать длины соседних подстрок.
2. Если очередная пара подстрок нарушает порядок чередования, меняем их местами.
3. Повторяем шаги до тех пор, пока не достигнем конца строки.
4. Применяем форматирование результата, переводя буквы с чётными индексами в нижний регистр, а с нечётными — в верхний.
Платформа: CodeWars
Название задачи: Ratio of Bouncy Numbers (Соотношение прыгучих чисел)
Ссылка на задачу: https://www.codewars.com/kata/562b099becfe844f3800000a
Сложность: 5 kyu
Уже решили (На момент написания статьи): 403 из 1 333
Тэги: Mathematics, Puzzles
Оригинальное описание задачи:
Working from left-to-right if no digit is exceeded by the digit to its left it is called an increasing number; for example, `134468`. Similarly if no digit is exceeded by the digit to its right it is called a decreasing number;
for example: `66420`.
We shall call a positive integer that is neither increasing nor decreasing a "bouncy" number; for example, `155349`.
Clearly there cannot be any bouncy numbers below one-hundred, but just over half of the numbers below one-thousand (`525`) are bouncy. In fact, the least number for which the proportion of bouncy numbers first reaches 50% is `538`.
Surprisingly, bouncy numbers become more and more common and by the time we reach `21780` the proportion of bouncy numbers is equal to 90%.
Your Task Complete the `bouncyRatio` function.
The input will be the target ratio.
The output should be the smallest number such that the proportion of bouncy numbers reaches the target ratio.
You should throw an `Error` for a ratio less than 0% or greater than 99%. .
Пояснение задачи:
Задача состоит в следующем:
Необходимо реализовать функцию `bouncyRatio`, принимающую целочисленный процент (целое число от 0 до 99) — целевой уровень доли «подскакивающих» (bouncy) чисел среди всех положительных целых чисел.
Основные определения:
- Увеличивающее число: число, в котором каждый последующий разряд строго больше предыдущего (например, `134468`). - Уменьшающее число: число, в котором каждый последующий разряд строго меньше предыдущего (например, `66420`).
Подскакивающее число (bouncy): число, которое не является ни увеличивающим, ни уменьшающим (например, `155349`).
Требуется найти минимальное целое число, начиная с которого доля подскакивающих чисел достигает указанного уровня.
Пример:
Для входного параметра 50%, функция должна вернуть число 538, поскольку именно с этого числа ровно половина чисел становятся подскакивающими.
Ограничения:
- Входное значение должно находиться в диапазоне от 0 до 99 включительно.
- Если переданное значение выходит за указанные пределы, необходимо выбросить ошибку.
Подход к решению:
1. Проверяем корректность входного значения.
2. Используем перебор чисел, начиная с единицы, проверяя каждое число на соответствие критериям увеличения, уменьшения или подскакивания.
3. Считаем долю подскакивающих чисел и сравниваем её с заданным уровнем.
4. Как только найден минимальный номер, при котором доля достигнет или превысит указанный уровень, возвращаем этот номер.
На этом я заканчиваю. Надеюсь, вам было интересно. Спасибо за уделенное время. Если у вас есть вопросы или пожелания, не стесняйтесь задавать их в комментариях. До новых встреч в следующих статьях, где мы продолжим решать интересные задачи!
Вступайте в нашу телеграмм-группу Инфостарт