Доброго времени суток, уважаемые ценители кода! Представляю вашему вниманию свежий сборник головоломок для программистов. В нем собраны интересные задачи, варьирующиеся по уровню сложности, отобранные из надежных источников. Этот материал послужит вам отличным инструментом для оттачивания мастерства в решении алгоритмических вызовов, поддержания высокого качества вашего программного продукта и, несомненно, для получения удовольствия от исследования захватывающей вселенной кодирования.
Что было раньше:
В предыдущей части мы решили:
- Maximum Length Difference (Максимальная разница в длине)
- List Filtering (Фильтрация списка)
- Parts of a list (Части списка)
- Simple Simple Simple String Expansion (Простое Простое Простое расширение строки)
- Square sums (simple) (Квадратные суммы (простые))
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: altERnaTIng cAsE <=> ALTerNAtiNG CaSe (ПЕРЕМЕННЫЙ СЛУЧАЙ <=> ПЕРЕМЕННЫЙ СЛУЧАЙ)
Ссылка на задачу: https://www.codewars.com/kata/56efc695740d30f963000557
Сложность: 8 kyu
Уже решили (На момент написания статьи): 74 512 из 173 860
Тэги: Основы
Оригинальное описание задачи:
altERnaTIng cAsE <=> ALTerNAtiNG CaSe
Define `String.prototype.toAlternatingCase` (or a similar function/method such as
`to_alternating_case`/`toAlternatingCase`/`ToAlternatingCase` in your selected language; see the initial solution for details) such that each
lowercase letter becomes uppercase and each uppercase letter becomes lowercase. For example:
"hello world".toAlternatingCase() === "HELLO WORLD"
"HELLO WORLD".toAlternatingCase() === "hello world"
"hello WORLD".toAlternatingCase() === "HELLO world"
"HeLLo WoRLD".toAlternatingCase() === "hEllO wOrld"
"12345".toAlternatingCase() === "12345" // Non-alphabetical characters are unaffected
"1a2b3c4d5e".toAlternatingCase() === "1A2B3C4D5E"
"String.prototype.toAlternatingCase".toAlternatingCase() === "sTRING.PROTOTYPE.TOaLTERNATINGcASE"
As usual, your function/method should be pure, i.e. it should not mutate the original string.
Пояснение задачи:
Задача состоит в создании функции, преобразующей строку таким образом, чтобы каждая буква меняла регистр на противоположный:
заглавные буквы становятся строчными, а строчные — заглавными.
Символы, не являющиеся буквами (цифры, знаки препинания и пробелы), остаются неизменными.
Пример работы функции:
| Исходная строка | Преобразованная строка |
|-----------------|-------------------------|
| hello world | HELLO WORLD |
| HELLO WORLD | hello world |
| hello WORLD | HELLO world |
| HeLLo WoRLD | hEllO wOrld |
| 12345 | 12345 |
| 1a2b3c4d5e | 1A2B3C4D5E |
| String.prototype.toAlternatingCase | sTRING.PROTOTYPE.TOaLTERNATINGcASE |
Основные шаги решения:
1. Проходим по каждой букве исходной строки.
2. Проверяем регистр текущей буквы:
- Если буква заглавная, заменяем её на строчную.
- Если буква строчная, заменяем её на заглавную.
3. Оставляем остальные символы без изменений. Функция должна возвращать новую строку, не изменяя исходную.
Задача 2
Платформа: CodeWars
Название задачи: L1: Set Alarm (L1: установка будильника)
Ссылка на задачу: https://www.codewars.com/kata/568dcc3c7f12767a62000038
Сложность: 8 kyu
Уже решили (На момент написания статьи): 121 290 из 194 879
Тэги: Основы, Логика
Оригинальное описание задачи:
Write a function named `setAlarm`/`set_alarm`/`set-alarm`/`setalarm` (depending on language) which receives two parameters. The first parameter, `employed`, is true whenever you are employed and the second parameter, `vacation` is true whenever you are on vacation.
The function should return true if you are employed and not on vacation (because these are the circumstances under which you need to set an alarm). It should return false otherwise. Examples:
employed | vacation
true |true => false
true | false => true
false | true => false
false | false => false
Пояснение задачи:
Функция `set_alarm` должна принимать два логических параметра:
- `employed`: указывает, работает ли человек (истина — работает, ложь — не работает);
- `vacation`: указывает, находится ли человек в отпуске (истина — отдыхает, ложь — нет отпуска).
Функция возвращает:
- Истину (`true`), если человек работает и не находится в отпуске (нужно установить будильник);
- Ложь (`false`) во всех остальных случаях (не нужно устанавливать будильник).
Пример работы функции:
| employed | vacation | result |
|----------|----------|--------|
| true | true | false |
| true | false | true |
| false | true | false |
| false | false | false |
Таким образом, функция проверяет одновременно два условия: наличие занятости и отсутствие отпуска, возвращая результат в зависимости от их комбинации.
Задача 3
Платформа: CodeWars
Название задачи: Categorize New Member (Классифицировать нового участника)
Ссылка на задачу: https://www.codewars.com/kata/5502c9e7b3216ec63c0001aa
Сложность: 7 kyu
Уже решили (На момент написания статьи): 190 215 из 451 420
Тэги: Основы
Оригинальное описание задачи:
The Western Suburbs Croquet Club has two categories of membership, Senior and Open. They would like your help with an application form that will tell prospective members which category they will be placed.
To be a senior, a member must be at least 55 years old and have a handicap greater than 7. In this croquet club, handicaps range from -2 to +26; the better the player the lower the handicap.
Input
Input will consist of a list of pairs. Each pair contains information for a single potential member. Information consists of an integer for the person's age and an integer for the person's handicap.
Output
Output will consist of a list of string values (in Haskell and C: `Open` or `Senior`) stating whether the respective member is to be placed in the senior or open category.
Example:
input = [[18, 20], [45, 2], [61, 12], [37, 6], [21, 21], [78, 9]]
output = ["Open", "Open", "Senior", "Open", "Open", "Senior"]
Пояснение задачи:
Задача состоит в написании программы, определяющей категорию членства («Senior» или «Open») для потенциальных членов клуба гольфа (крокета) Западных пригородов.
Входные данные:
Входной список представляет собой набор пар, каждая пара содержит возраст и рейтинг игрока (handicap):
- Возраст — целое число, указывающее возраст человека.
- Рейтинг (handicap) — целое число от -2 до 26, где меньший рейтинг означает лучшего игрока.
Выходные данные:
Выходной список должен содержать строки, обозначающие категорию членства для каждого потенциального члена:
- «Senior» — для участников старше 55 лет с рейтингом больше 7.
- «Open» — для остальных участников.
Пример работы программы:
Пример 1:
Вход: `[[18, 20], [45, 2], [61, 12], [37, 6], [21, 21], [78, 9]]`
Выход: `["Open", "Open", "Senior", "Open", "Open", "Senior"]`
Пояснение:
- Возраст 18 и рейтинг 20 → категория «Open»
- Возраст 45 и рейтинг 2 → категория «Open»
- Возраст 61 и рейтинг 12 → категория «Senior»
- Возраст 37 и рейтинг 6 → категория «Open»
- Возраст 21 и рейтинг 21 → категория «Open»
- Возраст 78 и рейтинг 9 → категория «Senior»
Решение-подход:
Для определения категории членства необходимо проверить два условия:
1. Возраст участника должен быть не менее 55 лет.
2. Рейтинг участника должен превышать 7.
Если оба условия выполнены, участник относится к категории «Senior». Иначе — к категории «Open».
Алгоритм:
1. Перебрать каждую пару (возраст, рейтинг).
2. Проверить, соответствует ли участник условиям принадлежности к категории «Senior».
3. Если условие выполнено, присвоить строку «Senior», иначе — «Open».
4. Добавить результат в выходной список.
Примеры: def determine_membership(age_and_handicap_list):
result = []
for age, handicap in age_and_handicap_list:
if age >= 5
Задача 4
Платформа: CodeWars
Название задачи: Fibonacci, Tribonacci and friends (Фибоначчи, Трибоначчи и друзья)
Ссылка на задачу: https://www.codewars.com/kata/556e0fccc392c527f20000c5
Сложность: 6 kyu
Уже решили (На момент написания статьи): 14 546 из 80 369
Тэги: Массивы, списки, теория чисел, основы
Оригинальное описание задачи:
If you have completed the Tribonacci sequence kata, you would know by now that mister Fibonacci has at least a bigger brother. If not, give it a quick look to get how things work.
Well, time to expand the family a little more: think of a Quadribonacci starting with a signature of 4 elements and each following element is the sum of the 4 previous, a Pentabonacci (well Cinquebonacci would probably sound a bit more italian, but it would also sound really awful) with a signature of 5 elements and each following element is the sum of the 5 previous, and so on.
Well, guess what? You have to build a Xbonacci function that takes a signature of X elements - and remember each next element is the sum of the last X elements - and returns the first n elements of the so seeded sequence.
xbonacci {1,1,1,1} 10 = {1,1,1,1,4,7,13,25,49,94}
xbonacci {0,0,0,0,1} 10 = {0,0,0,0,1,1,2,4,8,16}
xbonacci {1,0,0,0,0,0,1} 10 = {1,0,0,0,0,0,1,2,3,6}
xbonacci {1,1} produces the Fibonacci sequence
Пояснение задачи:
Задача состоит в реализации функции `Xbonacci`, принимающей два параметра:
- Signature: массив целых чисел длиной X, представляющий начальные элементы последовательности.
- N: целое число, определяющее длину результирующей последовательности.
Основные шаги алгоритма:
1. Инициализация:
- Создаём массив, содержащий первые X элементов сигнатуры.
2. Формирование последовательности:
- Начиная с индекса X, каждый новый элемент последовательности является суммой предыдущих X элементов.
- Продолжаем добавлять новые элементы до тех пор, пока не достигнем длины N.
Пример:
Сигнатура: `{1,1,1,1}`
- Первые четыре элемента — это сигнатура.
- Пятый элемент будет равен сумме последних четырёх элементов:1 + 1 + 1 + 1 = 4
- Шестой элемент:1 + 1 + 1 + 4 = 7
- И так далее.
Результат: `xbonacci({1,1,1,1}, 10)` возвращает `[1,1,1,1,4,7,13,25,49,94]`.
Дополнительные примеры:
- Сигнатура: `{0,0,0,0,1}`
Результат: `[0,0,0,0,1,1,2,4,8,16]`
- Сигнатура: `{1,0,0,0,0,0,1}`
Результат: `[1,0,0,0,0,0,1,2,3,6]`
Алгоритм пошагово:
1. Проверяем входные данные.
2. Если длина сигнатуры равна нулю, возвращаем пустой список.
3. Формируем начальный фрагмент последовательности, состоящий из сигнатуры.
4. Продолжаем вычислять последующие элементы, используя накопленную сумму предыдущих X элементов.
5. Возвращаем результат, содержащий первые N элементов последовательности.
Примечания:
- Если N меньше длины сигнатуры, возвращаем первые N элементов сигнатуры.
- Если длина сигнатуры меньше 2, возвращаем пустую последовательность.
Заключение: Функция должна эффективно обрабатывать различные входные параметры, формируя последовательность заданной
Задача 5
Платформа: CodeWars
Название задачи: Pete, the baker (Пит, пекарь)
Ссылка на задачу: https://www.codewars.com/kata/525c65e51bf619685c000059
Сложность: 5 kyu
Уже решили (На момент написания статьи): 90 379 из 301 134
Тэги: Алгоритмы
Оригинальное описание задачи:
Pete likes to bake some cakes. He has some recipes and ingredients. Unfortunately he is not good in maths. Can you help him to find out, how many cakes he could bake considering his recipes?
Write a function `cakes()`, which takes two parameters:
the recipe ingredients (a dictionary)
the available ingredients (also a dictionary)
and returns the maximum number of cakes Pete can bake (integer).For simplicity there are no units for the amounts (e.g. 1 lb of flour or 200 g of sugar are simply 1 or 200). Ingredients that are not present in the objects, can be considered as 0.
Examples:
must return 2
cakes({flour: 500, sugar: 200, eggs: 1}, {flour: 1200, sugar: 1200, eggs: 5, milk: 200});
must return 0
cakes({apples: 3, flour: 300, sugar: 150, milk: 100, oil: 100}, {sugar: 500, flour: 2000, milk: 2000});
Пояснение задачи:
Задача формулируется следующим образом: Пете нужно испечь максимальное количество тортов, исходя из доступных ингредиентов и рецептов.
Каждый рецепт содержит набор необходимых ингредиентов и их количества, а также количество тортов, которое можно приготовить из данного набора.
Нам необходимо определить, сколько тортов сможет испечь Петя, учитывая доступные ингредиенты и рецепты.
Пояснение:
- Исходные данные представлены двумя структурами данных: рецептом и доступными ингредиентами.
- Рецепт описывает необходимое количество каждого ингредиента для приготовления одного торта.
- Доступные ингредиенты содержат информацию о количестве каждого ингредиента, которым располагает Петя.
- Для каждого рецепта считаем, сколько тортов можно испечь, исходя из имеющихся ингредиентов.
- Ограничение на количество тортов определяется минимальным количеством ингредиентов, которого хватит для выпечки всех тортов по рецепту.
- Итоговое количество тортов вычисляется как минимальное количество тортов, которое можно испечь по каждому рецепту, и выбирается наибольшее из возможных значений.
Пример:
Рецепт: "flour": 500, "sugar": 200, "eggs":
1 Доступные ингредиенты:
"flour": 1200,
"sugar": 1200,
"eggs": 5,
"milk": 200
Для данного рецепта мы можем испечь 2 торта, потому что:
- У нас есть достаточно муки (1200/500=2),
- Достаточно сахара (1200/200=6),
- Достаточно яиц (5/1=5).
Таким образом, ограничение накладывает количество яиц, и итоговый результат равен 2.
Второй пример:
"apples": 3,
"flour": 300,
"sugar": 150,
"milk": 100,
"oil": 100
Доступные ингредиенты:
"sugar": 500,
"flour": 2000,
"milk": 2000
Здесь невозможно испечь ни одного торта, поскольку отсутствуют яблоки.
Заключение:
Платформа: CodeWars
Название задачи: altERnaTIng cAsE <=> ALTerNAtiNG CaSe (ПЕРЕМЕННЫЙ СЛУЧАЙ <=> ПЕРЕМЕННЫЙ СЛУЧАЙ)
Ссылка на задачу: https://www.codewars.com/kata/56efc695740d30f963000557
Сложность: 8 kyu
Уже решили (На момент написания статьи): 74 512 из 173 860
Тэги: Основы
Оригинальное описание задачи:
altERnaTIng cAsE <=> ALTerNAtiNG CaSe
Define `String.prototype.toAlternatingCase` (or a similar function/method such as
`to_alternating_case`/`toAlternatingCase`/`ToAlternatingCase` in your selected language; see the initial solution for details) such that each
lowercase letter becomes uppercase and each uppercase letter becomes lowercase. For example:
"hello world".toAlternatingCase() === "HELLO WORLD"
"HELLO WORLD".toAlternatingCase() === "hello world"
"hello WORLD".toAlternatingCase() === "HELLO world"
"HeLLo WoRLD".toAlternatingCase() === "hEllO wOrld"
"12345".toAlternatingCase() === "12345" // Non-alphabetical characters are unaffected
"1a2b3c4d5e".toAlternatingCase() === "1A2B3C4D5E"
"String.prototype.toAlternatingCase".toAlternatingCase() === "sTRING.PROTOTYPE.TOaLTERNATINGcASE"
As usual, your function/method should be pure, i.e. it should not mutate the original string.
Пояснение задачи:
Задача состоит в создании функции, преобразующей строку таким образом, чтобы каждая буква меняла регистр на противоположный:
заглавные буквы становятся строчными, а строчные — заглавными.
Символы, не являющиеся буквами (цифры, знаки препинания и пробелы), остаются неизменными.
Пример работы функции:
| Исходная строка | Преобразованная строка |
|-----------------|-------------------------|
| hello world | HELLO WORLD |
| HELLO WORLD | hello world |
| hello WORLD | HELLO world |
| HeLLo WoRLD | hEllO wOrld |
| 12345 | 12345 |
| 1a2b3c4d5e | 1A2B3C4D5E |
| String.prototype.toAlternatingCase | sTRING.PROTOTYPE.TOaLTERNATINGcASE |
Основные шаги решения:
1. Проходим по каждой букве исходной строки.
2. Проверяем регистр текущей буквы:
- Если буква заглавная, заменяем её на строчную.
- Если буква строчная, заменяем её на заглавную.
3. Оставляем остальные символы без изменений. Функция должна возвращать новую строку, не изменяя исходную.
Платформа: CodeWars
Название задачи: L1: Set Alarm (L1: установка будильника)
Ссылка на задачу: https://www.codewars.com/kata/568dcc3c7f12767a62000038
Сложность: 8 kyu
Уже решили (На момент написания статьи): 121 290 из 194 879
Тэги: Основы, Логика
Оригинальное описание задачи:
Write a function named `setAlarm`/`set_alarm`/`set-alarm`/`setalarm` (depending on language) which receives two parameters. The first parameter, `employed`, is true whenever you are employed and the second parameter, `vacation` is true whenever you are on vacation.
The function should return true if you are employed and not on vacation (because these are the circumstances under which you need to set an alarm). It should return false otherwise. Examples:
employed | vacation
true |true => false
true | false => true
false | true => false
false | false => false
Пояснение задачи:
Функция `set_alarm` должна принимать два логических параметра:
- `employed`: указывает, работает ли человек (истина — работает, ложь — не работает);
- `vacation`: указывает, находится ли человек в отпуске (истина — отдыхает, ложь — нет отпуска).
Функция возвращает:
- Истину (`true`), если человек работает и не находится в отпуске (нужно установить будильник);
- Ложь (`false`) во всех остальных случаях (не нужно устанавливать будильник).
Пример работы функции:
| employed | vacation | result |
|----------|----------|--------|
| true | true | false |
| true | false | true |
| false | true | false |
| false | false | false |
Таким образом, функция проверяет одновременно два условия: наличие занятости и отсутствие отпуска, возвращая результат в зависимости от их комбинации.
Платформа: CodeWars
Название задачи: Categorize New Member (Классифицировать нового участника)
Ссылка на задачу: https://www.codewars.com/kata/5502c9e7b3216ec63c0001aa
Сложность: 7 kyu
Уже решили (На момент написания статьи): 190 215 из 451 420
Тэги: Основы
Оригинальное описание задачи:
The Western Suburbs Croquet Club has two categories of membership, Senior and Open. They would like your help with an application form that will tell prospective members which category they will be placed.
To be a senior, a member must be at least 55 years old and have a handicap greater than 7. In this croquet club, handicaps range from -2 to +26; the better the player the lower the handicap.
Input
Input will consist of a list of pairs. Each pair contains information for a single potential member. Information consists of an integer for the person's age and an integer for the person's handicap.
Output
Output will consist of a list of string values (in Haskell and C: `Open` or `Senior`) stating whether the respective member is to be placed in the senior or open category.
Example:
input = [[18, 20], [45, 2], [61, 12], [37, 6], [21, 21], [78, 9]]
output = ["Open", "Open", "Senior", "Open", "Open", "Senior"]
Пояснение задачи:
Задача состоит в написании программы, определяющей категорию членства («Senior» или «Open») для потенциальных членов клуба гольфа (крокета) Западных пригородов.
Входные данные:
Входной список представляет собой набор пар, каждая пара содержит возраст и рейтинг игрока (handicap):
- Возраст — целое число, указывающее возраст человека.
- Рейтинг (handicap) — целое число от -2 до 26, где меньший рейтинг означает лучшего игрока.
Выходные данные:
Выходной список должен содержать строки, обозначающие категорию членства для каждого потенциального члена:
- «Senior» — для участников старше 55 лет с рейтингом больше 7.
- «Open» — для остальных участников.
Пример работы программы:
Пример 1:
Вход: `[[18, 20], [45, 2], [61, 12], [37, 6], [21, 21], [78, 9]]`
Выход: `["Open", "Open", "Senior", "Open", "Open", "Senior"]`
Пояснение:
- Возраст 18 и рейтинг 20 → категория «Open»
- Возраст 45 и рейтинг 2 → категория «Open»
- Возраст 61 и рейтинг 12 → категория «Senior»
- Возраст 37 и рейтинг 6 → категория «Open»
- Возраст 21 и рейтинг 21 → категория «Open»
- Возраст 78 и рейтинг 9 → категория «Senior»
Решение-подход:
Для определения категории членства необходимо проверить два условия:
1. Возраст участника должен быть не менее 55 лет.
2. Рейтинг участника должен превышать 7.
Если оба условия выполнены, участник относится к категории «Senior». Иначе — к категории «Open».
Алгоритм:
1. Перебрать каждую пару (возраст, рейтинг).
2. Проверить, соответствует ли участник условиям принадлежности к категории «Senior».
3. Если условие выполнено, присвоить строку «Senior», иначе — «Open».
4. Добавить результат в выходной список.
Примеры: def determine_membership(age_and_handicap_list):
result = []
for age, handicap in age_and_handicap_list:
if age >= 5
Платформа: CodeWars
Название задачи: Fibonacci, Tribonacci and friends (Фибоначчи, Трибоначчи и друзья)
Ссылка на задачу: https://www.codewars.com/kata/556e0fccc392c527f20000c5
Сложность: 6 kyu
Уже решили (На момент написания статьи): 14 546 из 80 369
Тэги: Массивы, списки, теория чисел, основы
Оригинальное описание задачи:
If you have completed the Tribonacci sequence kata, you would know by now that mister Fibonacci has at least a bigger brother. If not, give it a quick look to get how things work.
Well, time to expand the family a little more: think of a Quadribonacci starting with a signature of 4 elements and each following element is the sum of the 4 previous, a Pentabonacci (well Cinquebonacci would probably sound a bit more italian, but it would also sound really awful) with a signature of 5 elements and each following element is the sum of the 5 previous, and so on.
Well, guess what? You have to build a Xbonacci function that takes a signature of X elements - and remember each next element is the sum of the last X elements - and returns the first n elements of the so seeded sequence.
xbonacci {1,1,1,1} 10 = {1,1,1,1,4,7,13,25,49,94}
xbonacci {0,0,0,0,1} 10 = {0,0,0,0,1,1,2,4,8,16}
xbonacci {1,0,0,0,0,0,1} 10 = {1,0,0,0,0,0,1,2,3,6}
xbonacci {1,1} produces the Fibonacci sequence
Пояснение задачи:
Задача состоит в реализации функции `Xbonacci`, принимающей два параметра:
- Signature: массив целых чисел длиной X, представляющий начальные элементы последовательности.
- N: целое число, определяющее длину результирующей последовательности.
Основные шаги алгоритма:
1. Инициализация:
- Создаём массив, содержащий первые X элементов сигнатуры.
2. Формирование последовательности:
- Начиная с индекса X, каждый новый элемент последовательности является суммой предыдущих X элементов.
- Продолжаем добавлять новые элементы до тех пор, пока не достигнем длины N.
Пример:
Сигнатура: `{1,1,1,1}`
- Первые четыре элемента — это сигнатура.
- Пятый элемент будет равен сумме последних четырёх элементов:1 + 1 + 1 + 1 = 4
- Шестой элемент:1 + 1 + 1 + 4 = 7
- И так далее.
Результат: `xbonacci({1,1,1,1}, 10)` возвращает `[1,1,1,1,4,7,13,25,49,94]`.
Дополнительные примеры:
- Сигнатура: `{0,0,0,0,1}`
Результат: `[0,0,0,0,1,1,2,4,8,16]`
- Сигнатура: `{1,0,0,0,0,0,1}`
Результат: `[1,0,0,0,0,0,1,2,3,6]`
Алгоритм пошагово:
1. Проверяем входные данные.
2. Если длина сигнатуры равна нулю, возвращаем пустой список.
3. Формируем начальный фрагмент последовательности, состоящий из сигнатуры.
4. Продолжаем вычислять последующие элементы, используя накопленную сумму предыдущих X элементов.
5. Возвращаем результат, содержащий первые N элементов последовательности.
Примечания:
- Если N меньше длины сигнатуры, возвращаем первые N элементов сигнатуры.
- Если длина сигнатуры меньше 2, возвращаем пустую последовательность.
Заключение: Функция должна эффективно обрабатывать различные входные параметры, формируя последовательность заданной
Платформа: CodeWars
Название задачи: Pete, the baker (Пит, пекарь)
Ссылка на задачу: https://www.codewars.com/kata/525c65e51bf619685c000059
Сложность: 5 kyu
Уже решили (На момент написания статьи): 90 379 из 301 134
Тэги: Алгоритмы
Оригинальное описание задачи:
Pete likes to bake some cakes. He has some recipes and ingredients. Unfortunately he is not good in maths. Can you help him to find out, how many cakes he could bake considering his recipes?
Write a function `cakes()`, which takes two parameters:
the recipe ingredients (a dictionary)
the available ingredients (also a dictionary)
and returns the maximum number of cakes Pete can bake (integer).For simplicity there are no units for the amounts (e.g. 1 lb of flour or 200 g of sugar are simply 1 or 200). Ingredients that are not present in the objects, can be considered as 0.
Examples:
must return 2
cakes({flour: 500, sugar: 200, eggs: 1}, {flour: 1200, sugar: 1200, eggs: 5, milk: 200});
must return 0
cakes({apples: 3, flour: 300, sugar: 150, milk: 100, oil: 100}, {sugar: 500, flour: 2000, milk: 2000});
Пояснение задачи:
Задача формулируется следующим образом: Пете нужно испечь максимальное количество тортов, исходя из доступных ингредиентов и рецептов.
Каждый рецепт содержит набор необходимых ингредиентов и их количества, а также количество тортов, которое можно приготовить из данного набора.
Нам необходимо определить, сколько тортов сможет испечь Петя, учитывая доступные ингредиенты и рецепты.
Пояснение:
- Исходные данные представлены двумя структурами данных: рецептом и доступными ингредиентами.
- Рецепт описывает необходимое количество каждого ингредиента для приготовления одного торта.
- Доступные ингредиенты содержат информацию о количестве каждого ингредиента, которым располагает Петя.
- Для каждого рецепта считаем, сколько тортов можно испечь, исходя из имеющихся ингредиентов.
- Ограничение на количество тортов определяется минимальным количеством ингредиентов, которого хватит для выпечки всех тортов по рецепту.
- Итоговое количество тортов вычисляется как минимальное количество тортов, которое можно испечь по каждому рецепту, и выбирается наибольшее из возможных значений.
Пример:
Рецепт: "flour": 500, "sugar": 200, "eggs":
1 Доступные ингредиенты:
"flour": 1200,
"sugar": 1200,
"eggs": 5,
"milk": 200
Для данного рецепта мы можем испечь 2 торта, потому что:
- У нас есть достаточно муки (1200/500=2),
- Достаточно сахара (1200/200=6),
- Достаточно яиц (5/1=5).
Таким образом, ограничение накладывает количество яиц, и итоговый результат равен 2.
Второй пример:
"apples": 3,
"flour": 300,
"sugar": 150,
"milk": 100,
"oil": 100
Доступные ингредиенты:
"sugar": 500,
"flour": 2000,
"milk": 2000
Здесь невозможно испечь ни одного торта, поскольку отсутствуют яблоки.
Подходит к концу наша сегодняшняя встреча. Я искренне надеюсь, что процесс чтения и выполнения предложенных заданий принес вам удовольствие. Благодарю вас за проявленный интерес!
С нетерпением ожидаю нашей новой встречи в будущих публикациях. Там мы продолжим погружаться в мир увлекательных алгоритмов и непростых задач. Буду рад услышать ваше мнение и услышать о ваших находках в комментариях — сообща мы сможем преодолеть любые трудности! До новых встреч!
Вступайте в нашу телеграмм-группу Инфостарт