Коллекция алгоритмических испытаний для всех уровней — от старта до про. Цель: прокачка алгоритмического скилла, написание элегантного и быстрого кода, интеллектуальный драйв от решения сложных головоломок.
Что было раньше:
В предыдущей части мы решили:
- Non-even substrings (Нечетные подстроки)
- You only need one - Beginner (Вам нужен только один - новичок)
- Job Matching #1 (Подбор работы №1)
- The Jumbler (Неумеха)
- Fix string case (Исправлен регистр строк)
- Well efficiency calculator (Калькулятор эффективности скважины)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Enumerable Magic #1 - True for All? (Перечислимая магия №1 - актуальна для всех?)
Ссылка на задачу: https://www.codewars.com/kata/54598d1fcbae2ae05200112c
Сложность: 8 kyu
Уже решили (На момент написания статьи): 15 626 из 49 497
Тэги: Arrays, Fundamentals
Оригинальное описание задачи:
Task
Create a method "all" which takes two params:
a sequence
a function
and returns "true" if the function in the params returns true for every element in the sequence.Otherwise, it should return false. If the sequence is empty, it should return true, since technically nothing failed the test.
Example
all((1, 2, 3, 4, 5), greater_than_9) -> false
all((1, 2, 3, 4, 5), less_than_9) -> True
Пояснение задачи:
Задача требует реализовать метод (`all`), принимающий два параметра:
- Последовательность (список, кортеж, массив или любой итератор элементов);
- Проверочную функцию (предикат).
Метод должен вернуть `True`, если проверочная функция возвращает `True` для каждого элемента последовательности. Если хотя бы один элемент не проходит проверку — возвращается `False`.
Если последовательность пустая, результат считается успешным (т.е. метод возвращает `True`, поскольку проверка не выявила ни одного элемента, не соответствующего условиям).
Пример работы метода:
- Проверка, что все числа больше 9:
all([1, 2, 3, 4, 5], λ x: x > 9) → False
- Проверка, что все числа меньше 9: all([1, 2, 3, 4, 5], λ x: x < 9) → True
- Пустая последовательность: all([], λ x: x > 9) → True
Таким образом, задача сводится к проверке каждого элемента последовательности с помощью переданной функции и возвращению результата проверки всей последовательности.
Задача 2
Платформа: CodeWars
Название задачи: Sum Arrays (Суммирующие массивы)
Ссылка на задачу: https://www.codewars.com/kata/53dc54212259ed3d4f00071c
Сложность: 8 kyu
Уже решили (На момент написания статьи): 228 291 из 410 673
Тэги: Arrays, Fundamentals
Оригинальное описание задачи:
Write a function that takes an array of numbers and returns the sum of the numbers.
The numbers can be negative. If the array is empty, return `0`.
Examples
Input: `[1, 5.2, 4, 0, -1]`
Output: `9.2`
Input: `[-2.398]`
Output: `-2.398`
Input: `[]`
Output: `0`
Assumptions
- You can assume that you are given a (possibly empty) valid array containing only numbers.
What We're Testing
We're testing basic loops and math operations. This is for beginners who are just learning loops and math operations. Advanced users may find this extremely easy and can easily write this in one line.
Пояснение задачи:
Требуется написать функцию, принимающую на вход массив чисел произвольного типа (целые, дробные и т.п.) и возвращающую сумму всех элементов массива.
Если массив пустой, функция должна вернуть ноль.
Примеры:
- Если входной массив содержит числа `[1, 5.2, 4, 0, −1]`, результатом будет сумма 1 + 5.2 + 4 + 0 + (-1) = 9.2.
- Для массива `[-2.398]` результатом будет -2.398.
- Пустой массив возвращает результат `0`.
Условия задачи:
- Входной массив гарантированно корректный и содержит только числа.
- Функция должна корректно обрабатывать отрицательные числа и десятичные дроби.
Что проверяем:
Мы проверяем базовые навыки работы с циклами и арифметическими операциями.
Задача предназначена для начинающих, осваивающих основы программирования. Более опытные пользователи легко решат её одной строкой кода.
Задача 3
Платформа: CodeWars
Название задачи: String ends with? (Строка заканчивается на?)
Ссылка на задачу: https://www.codewars.com/kata/51f2d1cafc9c0f745c00037d
Сложность: 7 kyu
Уже решили (На момент написания статьи): 277 915 из 855 906
Тэги: Strings, Fundamentals
Оригинальное описание задачи:
Complete the solution so that it returns true if the first argument(string) passed in ends with the 2nd argument (also a string). Examples:
Inputs:"abc", "bc"
Output:true Inputs: "abc", "d" Output: false
Пояснение задачи:
Задача требует написать функцию, проверяющую, заканчивается ли первая строка (первое входное значение) второй строкой (вторым входным значением).
Пояснение:
Нужно проверить, совпадает ли хвостовая часть первой строки с заданной второй строкой.
Для этого достаточно воспользоваться стандартной функцией сравнения подстрок:
- Проверяем, равна ли подстрока, начиная с конца первой строки (индекс `len(first)-len(second)` до конца строки включительно), второй строке.
Пример:
- Вход: "abc", "bc"
- Первая строка: "abc"
- Вторая строка: "bc"
- Подстрока "bc" в конце строки "abc" совпадает со второй строкой, значит возвращаем `true`.
- Вход:
"abc", "d"
- Первая строка: "abc"
- Вторая строка: "d"
- Подстрока "d" в конце строки "abc" не совпадает, значит возвращаем `false`.
Алгоритм:
1. Вычисляем длину второй строки.
2. Сравниваем подстроку, начинающуюся с позиции, равной длине первой строки минус длина второй строки, с самой второй строкой.
3. Возвращаем результат сравнения.
Пример реализации:
def ends_with(first: str, second: str) -> bool: Получаем длину второй строки len_second = len(second)
Проверяем, совпадают ли последние len_second символов первой строки со второй строкой return first[-len_second:] == second
Задача 4
Платформа: CodeWars
Название задачи: Growth of a Population (Рост численности населения)
Ссылка на задачу: https://www.codewars.com/kata/563b662a59afc2b5120000c6
Сложность: 7 kyu
Уже решили (На момент написания статьи): 179 682 из 1 120 997
Тэги: Fundamentals
Оригинальное описание задачи:
In a small town the population is `p0 = 1000` at the beginning of a year. The population regularly increases by `2 percent` per year and moreover `50` new inhabitants per year come to live in the town. How many years does the town need to see its population greater than or equal to `p = 1200` inhabitants?
At the end of the first year there will be:
1000 + 1000 * 0.02 + 50 => 1070 inhabitants
At the end of the 2nd year there will be:
1070 + 1070 * 0.02 + 50 => 1141inhabitants ( number of inhabitants is an integer )
At the end of the 3rd year there will be:
1141 + 1141 * 0.02 + 50 => 1213
It will need 3 entire years.
More generally given parameters:
`p0, percent, aug (inhabitants coming or leaving each year), p (population to equal or surpass)`
the function `nb_year` should return `n` number of entire years needed to get a population greater or equal to `p`.
aug is an integer, percent a positive or null floating number, p0 and p are positive integers (> 0)
Examples:
nb_year(1500, 5, 100, 5000) -> 15
nb_year(1500000, 2.5, 10000, 2000000) -> 10
Note:
Don't forget to convert the percent parameter as a percentage in the body of your function: if the parameter percent is 2 you have to convert it to 0.02.
There are no fractions of people.At the end of each year, the population count is an integer: `252.8` people round down to `252` persons.
Пояснение задачи:
Задача состоит в определении минимального количества полных лет, через которое население небольшого городка достигнет или превысит заданную численность.
Описание решения:
Город ежегодно увеличивается за счёт естественного прироста населения (увеличение на процент от текущего населения) и миграционного прироста (фиксированное число новых жителей).
Для определения необходимого количества лет используем следующий подход:
1. Начальная численность населения — p_0.
2. Естественный прирост населения происходит каждый год по формуле: p_{new} = p * (1 + \{{percent}}{100}), где percent — годовой процентный прирост населения.
3. Каждый год добавляется фиксированное число мигрантов aug.
4. Численность населения округляется вниз до целого числа, поскольку невозможно иметь дробное количество людей.
5. Проверяем, достигла ли численность населения значения "p" или превысила его. Если да, возвращаем количество прошедших лет.
6. Процесс повторяется до тех пор, пока население не достигнет или превысит целевую численность "p".
Пример работы алгоритма:
Пусть начальные данные: - p_0 = 1000 - percent = 2% - aug = 50 - target population p = 1200
После первого года:
- Население естественным образом увеличится на 2%: 1000 * 1.02 = 1020
- Добавим мигрантов: 1020 + 50 = 1070
После второго года:
- Население: 1070 * 1.02 = 1091.4 ≈ 1091 (округляем вниз)
- С учетом мигрантов: 1091 + 50 = 1141
И так далее, пока не достигнем целевой численности населения.
Формализация подхода:
- На каждом шаге вычисляем новое население по формуле:
p_{new} = ⌊⌋ p * (1 + \{{percent}}{100}) ⌊⌋ + {aug}
- Проверяем условие выхода из цикла: если p_{new} ≥ p, возвращаем текущее количество лет.
Примеры: - p_0 = 1500, percent = 5%, aug = 100,p
Задача 5
Платформа: CodeWars
Название задачи: A kata is a kata, you can't say it's only a half! (Ката есть ката, вы не можете сказать, что это только половина!)
Ссылка на задачу: https://www.codewars.com/kata/5915648051f1d324ef00007a
Сложность: 6 kyu
Уже решили (На момент написания статьи): 74 из 265
Тэги: Fundamentals
Оригинальное описание задачи:
You need to determine how many A presses is required for a segment of a complete run of a certain game.
The A presses for the whole game will be passed in as an array of pairs, e.g: `[[10,30],[35,90],[150,151],[250,400]]`, where the two elements in each array represent the beginning and the end of an A press respectively, in arbitrary time unit since the start of the game. The next two parameters are the start and end time of the segment.
However, counting A presses is not that simple: a segment might begin and/or end during an A press. Thus we count the number of A presses in the following way:
Every actual press of A button is counted as `1` A press.
In addition, if the segment begins while an A press is held, it is counted as `0.5` A presses.
Note that both A presses ranges and segment ranges are inclusive: an A press represented by `[100,200]` means that the A button is pressed before time `100` (and after time `99`) and released after time `200` (but before time `201`).
Examples:
[[10,30],[35,90],[150,151],[250,400]], 0, 100 => 2
[[10,30],[35,90],[150,151],[250,400]], 20, 100 => 1.5
[[10,30],[35,90],[150,151],[250,400]], 20, 80 => 1.5
[[10,30],[35,90],[150,151],[250,400]], 300, 350 => 0.5
[[10,30],[35,90],[150,151],[250,400]], 150, 151 => 0.5
[[10,30],[35,90],[150,151],[250,400]], 90, 120 => 0.5
[[10,30],[35,90],[150,151],[250,400]], 120, 150 => 1
Пояснение задачи:
Задача заключается в подсчёте количества нажатий кнопки «А» (A-presses) в заданном временном сегменте игрового процесса.
Игровая сессия представлена последовательностью интервалов нажатий кнопки A, где каждый интервал — это пара чисел, обозначающих начало и конец интервала (включительно).
Например, интервал `[10, 30]` означает, что кнопка удерживается нажатой в течение отрезка времени от момента 10 до 30 включительно.
Сегмент игры также представлен парой чисел, указывающих начальное и конечное время интересующего нас временного промежутка.
Подсчёт нажатий происходит следующим образом:
- Каждое фактическое нажатие (когда кнопка удерживалась нажатой непрерывно) считается одним полным нажатием (`1`). - Если сегмент начинается во время активного нажатия, добавляется половина нажатия (`0.5`).
При этом важно учитывать, что границы сегментов и интервалов считаются включительными, то есть если сегмент начинается точно в момент начала интервала, это учитывается как половина нажатия.
Примеры:
1. Ситуация:
Игровой интервал: `[[10, 30], [35, 90], [150, 151], [250, 400]]`.
Сегмент: `(0, 100)`
Результат: `2`
Объяснение: - Игрок нажимал кнопку в интервалах `[10, 30]` и `[35, 90]`.
- Начало сегмента находится внутри первого интервала, значит добавляется половина нажатия.
2. Ситуация:
Игровой интервал: `[[10, 30], [35, 90], [150, 151], [250, 400]]`.
Сегмент: `(20, 100)`
Результат: `1.5`
Объяснение: - Нажатие произошло в интервале `[10, 30]`, плюс половина нажатия добавляется за начало сегмента внутри интервала.
Задача 6
Платформа: CodeWars
Название задачи: Pack Some Chocolates (Упакуй несколько шоколадок)
Ссылка на задачу: https://www.codewars.com/kata/5f5daf1a209a64001183af9b
Сложность: 6 kyu
Уже решили (На момент написания статьи): 1 304 из 12 856
Тэги: Fundamentals
Оригинальное описание задачи:
Make Chocolates
Halloween is around the corner and we have to distribute chocolates.
We need to assemble a parcel of `goal` grams of chocolates. The `goal` can be assumed to be always a positive integer value.
- There are small chocolates (2 grams each) and big chocolates (5 grams each)
- To reach the goal, the chocolates (big and small) must be used as-is, meaning, the chocolates cannot be broken into smaller pieces
- Maximize the use of big chocolates that are available to achieve the desired goal. And only then should you proceed to use the small chocolates.
- NOTE:
"Maximize" does not imply you have to use all the available big chocolates before using the small chocolates
- For example, consider the goal of `6`, and `big=1`, `small=3`. Using the existing one big chocolate, it is _not_ possible to achieve the remainder of the weight of 1.Therefore, avoid using the big chocolate.Use the existing 3 small chocolates and achieve the goal.
Determine the number of small chocolates that are required to achieve the desired parcel weight.
Write a function `make_chocolates` that will accept three integer values as arguments, in the following order:
- `small` -> number of small chocolates available
- `big` -> number of big chocolates available
- `goal` -> the desired weight of the final parcel The function should return the number of small chocolates required to achieve the `goal`.
The function should return `-1` only if the goal cannot be achieved by any possible combination of big chocolates and small chocolates.
Example
make_chocolates (4, 1, 13) => 4
make_chocolates (4, 1, 14) => -1
make_chocolates (2, 1, 7) => 1
using the big chocolate prevents goal
accomplishment, therefore don't use it!
make_chocolates (3, 1, 6) => 3
Пояснение задачи:
Задача состоит в том, чтобы собрать набор шоколадок суммарным весом ровно `goal` граммов, используя доступные маленькие шоколадки (по 2 грамма каждая) и большие шоколадки (по 5 граммов каждая).
Нужно максимизировать использование больших шоколадок, применяя их до исчерпания возможности достичь оставшегося веса маленькими шоколадками.
Основные моменты:
- Маленькие шоколадки имеют вес 2 грамма каждый.
- Большие шоколадки имеют вес 5 граммов каждый.
- Нельзя разбивать шоколадки на части.
- Цель — найти минимальное количество маленьких шоколадок, необходимых для достижения целевого веса `goal`. - Если невозможно набрать целевой вес ни одним из возможных сочетаний маленьких и больших шоколадок, функция должна вернуть `-1`.
Примеры:
- make_chocolates(4, 1, 13)
Здесь доступно 4 маленьких шоколадки и 1 большая.
Для веса 13 грамм лучше использовать одну большую шоколадку (5 г), и оставшиеся 8 грамм добрать маленькими шоколадками (по 2 г).
Таким образом, потребуется 4 маленькие шоколадки. - make_chocolates(4, 1, 14)
Использовать одну большую шоколадку невозможно, потому что она даёт только 5 грамм, а разница между 14 и 5 равна 9, что нельзя покрыть четырьмя маленькими шоколадками (каждая по 2 грамма).
Поэтому цель недостижима, и возвращаем `-1`. - make_chocolates(2, 1, 7)
Одна большая шоколадка даст нам 5 грамм, и оставшиеся 2 грамма мы можем получить одной маленькой шоколадкой. - make_chocolates(3, 1, 6) Использование большой шоколадки не поможет, поскольку она добавляет только 5 грамм, а недостающие 1 грамм не покрывается имеющимися маленькими шоколадками. Следовательно, возвращаем 3 маленькие шоколадки.
Подходы к решению:
1. Ограничение количества больших шоколадок: Максимально возможное количество больших шоколадок, которое можно использовать, равно целой части от деления целевого веса на 5 (целиком используем максимум доступных больших шоколадок).
2. Проверка достижимости остаточного веса: После использования всех доступных больших шоколадок проверяем, можно ли покрыть остаток маленьким количеством маленьких шоколадок.
Если остаток меньше нуля или не делится на 2, значит,
Заключение:
Платформа: CodeWars
Название задачи: Enumerable Magic #1 - True for All? (Перечислимая магия №1 - актуальна для всех?)
Ссылка на задачу: https://www.codewars.com/kata/54598d1fcbae2ae05200112c
Сложность: 8 kyu
Уже решили (На момент написания статьи): 15 626 из 49 497
Тэги: Arrays, Fundamentals
Оригинальное описание задачи:
Task
Create a method "all" which takes two params:
a sequence
a function
and returns "true" if the function in the params returns true for every element in the sequence.Otherwise, it should return false. If the sequence is empty, it should return true, since technically nothing failed the test.
Example
all((1, 2, 3, 4, 5), greater_than_9) -> false
all((1, 2, 3, 4, 5), less_than_9) -> True
Пояснение задачи:
Задача требует реализовать метод (`all`), принимающий два параметра:
- Последовательность (список, кортеж, массив или любой итератор элементов);
- Проверочную функцию (предикат).
Метод должен вернуть `True`, если проверочная функция возвращает `True` для каждого элемента последовательности. Если хотя бы один элемент не проходит проверку — возвращается `False`.
Если последовательность пустая, результат считается успешным (т.е. метод возвращает `True`, поскольку проверка не выявила ни одного элемента, не соответствующего условиям).
Пример работы метода:
- Проверка, что все числа больше 9:
all([1, 2, 3, 4, 5], λ x: x > 9) → False
- Проверка, что все числа меньше 9: all([1, 2, 3, 4, 5], λ x: x < 9) → True
- Пустая последовательность: all([], λ x: x > 9) → True
Таким образом, задача сводится к проверке каждого элемента последовательности с помощью переданной функции и возвращению результата проверки всей последовательности.
Платформа: CodeWars
Название задачи: Sum Arrays (Суммирующие массивы)
Ссылка на задачу: https://www.codewars.com/kata/53dc54212259ed3d4f00071c
Сложность: 8 kyu
Уже решили (На момент написания статьи): 228 291 из 410 673
Тэги: Arrays, Fundamentals
Оригинальное описание задачи:
Write a function that takes an array of numbers and returns the sum of the numbers.
The numbers can be negative. If the array is empty, return `0`.
Examples
Input: `[1, 5.2, 4, 0, -1]`
Output: `9.2`
Input: `[-2.398]`
Output: `-2.398`
Input: `[]`
Output: `0`
Assumptions
- You can assume that you are given a (possibly empty) valid array containing only numbers.
What We're Testing
We're testing basic loops and math operations. This is for beginners who are just learning loops and math operations. Advanced users may find this extremely easy and can easily write this in one line.
Пояснение задачи:
Требуется написать функцию, принимающую на вход массив чисел произвольного типа (целые, дробные и т.п.) и возвращающую сумму всех элементов массива.
Если массив пустой, функция должна вернуть ноль.
Примеры:
- Если входной массив содержит числа `[1, 5.2, 4, 0, −1]`, результатом будет сумма 1 + 5.2 + 4 + 0 + (-1) = 9.2.
- Для массива `[-2.398]` результатом будет -2.398.
- Пустой массив возвращает результат `0`.
Условия задачи:
- Входной массив гарантированно корректный и содержит только числа.
- Функция должна корректно обрабатывать отрицательные числа и десятичные дроби.
Что проверяем:
Мы проверяем базовые навыки работы с циклами и арифметическими операциями.
Задача предназначена для начинающих, осваивающих основы программирования. Более опытные пользователи легко решат её одной строкой кода.
Платформа: CodeWars
Название задачи: String ends with? (Строка заканчивается на?)
Ссылка на задачу: https://www.codewars.com/kata/51f2d1cafc9c0f745c00037d
Сложность: 7 kyu
Уже решили (На момент написания статьи): 277 915 из 855 906
Тэги: Strings, Fundamentals
Оригинальное описание задачи:
Complete the solution so that it returns true if the first argument(string) passed in ends with the 2nd argument (also a string). Examples:
Inputs:"abc", "bc"
Output:true Inputs: "abc", "d" Output: false
Пояснение задачи:
Задача требует написать функцию, проверяющую, заканчивается ли первая строка (первое входное значение) второй строкой (вторым входным значением).
Пояснение:
Нужно проверить, совпадает ли хвостовая часть первой строки с заданной второй строкой.
Для этого достаточно воспользоваться стандартной функцией сравнения подстрок:
- Проверяем, равна ли подстрока, начиная с конца первой строки (индекс `len(first)-len(second)` до конца строки включительно), второй строке.
Пример:
- Вход: "abc", "bc"
- Первая строка: "abc"
- Вторая строка: "bc"
- Подстрока "bc" в конце строки "abc" совпадает со второй строкой, значит возвращаем `true`.
- Вход:
"abc", "d"
- Первая строка: "abc"
- Вторая строка: "d"
- Подстрока "d" в конце строки "abc" не совпадает, значит возвращаем `false`.
Алгоритм:
1. Вычисляем длину второй строки.
2. Сравниваем подстроку, начинающуюся с позиции, равной длине первой строки минус длина второй строки, с самой второй строкой.
3. Возвращаем результат сравнения.
Пример реализации:
def ends_with(first: str, second: str) -> bool: Получаем длину второй строки len_second = len(second)
Проверяем, совпадают ли последние len_second символов первой строки со второй строкой return first[-len_second:] == second
Платформа: CodeWars
Название задачи: Growth of a Population (Рост численности населения)
Ссылка на задачу: https://www.codewars.com/kata/563b662a59afc2b5120000c6
Сложность: 7 kyu
Уже решили (На момент написания статьи): 179 682 из 1 120 997
Тэги: Fundamentals
Оригинальное описание задачи:
In a small town the population is `p0 = 1000` at the beginning of a year. The population regularly increases by `2 percent` per year and moreover `50` new inhabitants per year come to live in the town. How many years does the town need to see its population greater than or equal to `p = 1200` inhabitants?
At the end of the first year there will be:
1000 + 1000 * 0.02 + 50 => 1070 inhabitants
At the end of the 2nd year there will be:
1070 + 1070 * 0.02 + 50 => 1141inhabitants ( number of inhabitants is an integer )
At the end of the 3rd year there will be:
1141 + 1141 * 0.02 + 50 => 1213
It will need 3 entire years.
More generally given parameters:
`p0, percent, aug (inhabitants coming or leaving each year), p (population to equal or surpass)`
the function `nb_year` should return `n` number of entire years needed to get a population greater or equal to `p`.
aug is an integer, percent a positive or null floating number, p0 and p are positive integers (> 0)
Examples:
nb_year(1500, 5, 100, 5000) -> 15
nb_year(1500000, 2.5, 10000, 2000000) -> 10
Note:
Don't forget to convert the percent parameter as a percentage in the body of your function: if the parameter percent is 2 you have to convert it to 0.02.
There are no fractions of people.At the end of each year, the population count is an integer: `252.8` people round down to `252` persons.
Пояснение задачи:
Задача состоит в определении минимального количества полных лет, через которое население небольшого городка достигнет или превысит заданную численность.
Описание решения:
Город ежегодно увеличивается за счёт естественного прироста населения (увеличение на процент от текущего населения) и миграционного прироста (фиксированное число новых жителей).
Для определения необходимого количества лет используем следующий подход:
1. Начальная численность населения — p_0.
2. Естественный прирост населения происходит каждый год по формуле: p_{new} = p * (1 + \{{percent}}{100}), где percent — годовой процентный прирост населения.
3. Каждый год добавляется фиксированное число мигрантов aug.
4. Численность населения округляется вниз до целого числа, поскольку невозможно иметь дробное количество людей.
5. Проверяем, достигла ли численность населения значения "p" или превысила его. Если да, возвращаем количество прошедших лет.
6. Процесс повторяется до тех пор, пока население не достигнет или превысит целевую численность "p".
Пример работы алгоритма:
Пусть начальные данные: - p_0 = 1000 - percent = 2% - aug = 50 - target population p = 1200
После первого года:
- Население естественным образом увеличится на 2%: 1000 * 1.02 = 1020
- Добавим мигрантов: 1020 + 50 = 1070
После второго года:
- Население: 1070 * 1.02 = 1091.4 ≈ 1091 (округляем вниз)
- С учетом мигрантов: 1091 + 50 = 1141
И так далее, пока не достигнем целевой численности населения.
Формализация подхода:
- На каждом шаге вычисляем новое население по формуле:
p_{new} = ⌊⌋ p * (1 + \{{percent}}{100}) ⌊⌋ + {aug}
- Проверяем условие выхода из цикла: если p_{new} ≥ p, возвращаем текущее количество лет.
Примеры: - p_0 = 1500, percent = 5%, aug = 100,p
Платформа: CodeWars
Название задачи: A kata is a kata, you can't say it's only a half! (Ката есть ката, вы не можете сказать, что это только половина!)
Ссылка на задачу: https://www.codewars.com/kata/5915648051f1d324ef00007a
Сложность: 6 kyu
Уже решили (На момент написания статьи): 74 из 265
Тэги: Fundamentals
Оригинальное описание задачи:
You need to determine how many A presses is required for a segment of a complete run of a certain game.
The A presses for the whole game will be passed in as an array of pairs, e.g: `[[10,30],[35,90],[150,151],[250,400]]`, where the two elements in each array represent the beginning and the end of an A press respectively, in arbitrary time unit since the start of the game. The next two parameters are the start and end time of the segment.
However, counting A presses is not that simple: a segment might begin and/or end during an A press. Thus we count the number of A presses in the following way:
Every actual press of A button is counted as `1` A press.
In addition, if the segment begins while an A press is held, it is counted as `0.5` A presses.
Note that both A presses ranges and segment ranges are inclusive: an A press represented by `[100,200]` means that the A button is pressed before time `100` (and after time `99`) and released after time `200` (but before time `201`).
Examples:
[[10,30],[35,90],[150,151],[250,400]], 0, 100 => 2
[[10,30],[35,90],[150,151],[250,400]], 20, 100 => 1.5
[[10,30],[35,90],[150,151],[250,400]], 20, 80 => 1.5
[[10,30],[35,90],[150,151],[250,400]], 300, 350 => 0.5
[[10,30],[35,90],[150,151],[250,400]], 150, 151 => 0.5
[[10,30],[35,90],[150,151],[250,400]], 90, 120 => 0.5
[[10,30],[35,90],[150,151],[250,400]], 120, 150 => 1
Пояснение задачи:
Задача заключается в подсчёте количества нажатий кнопки «А» (A-presses) в заданном временном сегменте игрового процесса.
Игровая сессия представлена последовательностью интервалов нажатий кнопки A, где каждый интервал — это пара чисел, обозначающих начало и конец интервала (включительно).
Например, интервал `[10, 30]` означает, что кнопка удерживается нажатой в течение отрезка времени от момента 10 до 30 включительно.
Сегмент игры также представлен парой чисел, указывающих начальное и конечное время интересующего нас временного промежутка.
Подсчёт нажатий происходит следующим образом:
- Каждое фактическое нажатие (когда кнопка удерживалась нажатой непрерывно) считается одним полным нажатием (`1`). - Если сегмент начинается во время активного нажатия, добавляется половина нажатия (`0.5`).
При этом важно учитывать, что границы сегментов и интервалов считаются включительными, то есть если сегмент начинается точно в момент начала интервала, это учитывается как половина нажатия.
Примеры:
1. Ситуация:
Игровой интервал: `[[10, 30], [35, 90], [150, 151], [250, 400]]`.
Сегмент: `(0, 100)`
Результат: `2`
Объяснение: - Игрок нажимал кнопку в интервалах `[10, 30]` и `[35, 90]`.
- Начало сегмента находится внутри первого интервала, значит добавляется половина нажатия.
2. Ситуация:
Игровой интервал: `[[10, 30], [35, 90], [150, 151], [250, 400]]`.
Сегмент: `(20, 100)`
Результат: `1.5`
Объяснение: - Нажатие произошло в интервале `[10, 30]`, плюс половина нажатия добавляется за начало сегмента внутри интервала.
Платформа: CodeWars
Название задачи: Pack Some Chocolates (Упакуй несколько шоколадок)
Ссылка на задачу: https://www.codewars.com/kata/5f5daf1a209a64001183af9b
Сложность: 6 kyu
Уже решили (На момент написания статьи): 1 304 из 12 856
Тэги: Fundamentals
Оригинальное описание задачи:
Make Chocolates
Halloween is around the corner and we have to distribute chocolates.
We need to assemble a parcel of `goal` grams of chocolates. The `goal` can be assumed to be always a positive integer value.
- There are small chocolates (2 grams each) and big chocolates (5 grams each)
- To reach the goal, the chocolates (big and small) must be used as-is, meaning, the chocolates cannot be broken into smaller pieces
- Maximize the use of big chocolates that are available to achieve the desired goal. And only then should you proceed to use the small chocolates.
- NOTE:
"Maximize" does not imply you have to use all the available big chocolates before using the small chocolates
- For example, consider the goal of `6`, and `big=1`, `small=3`. Using the existing one big chocolate, it is _not_ possible to achieve the remainder of the weight of 1.Therefore, avoid using the big chocolate.Use the existing 3 small chocolates and achieve the goal.
Determine the number of small chocolates that are required to achieve the desired parcel weight.
Write a function `make_chocolates` that will accept three integer values as arguments, in the following order:
- `small` -> number of small chocolates available
- `big` -> number of big chocolates available
- `goal` -> the desired weight of the final parcel The function should return the number of small chocolates required to achieve the `goal`.
The function should return `-1` only if the goal cannot be achieved by any possible combination of big chocolates and small chocolates.
Example
make_chocolates (4, 1, 13) => 4
make_chocolates (4, 1, 14) => -1
make_chocolates (2, 1, 7) => 1
using the big chocolate prevents goal
accomplishment, therefore don't use it!
make_chocolates (3, 1, 6) => 3
Пояснение задачи:
Задача состоит в том, чтобы собрать набор шоколадок суммарным весом ровно `goal` граммов, используя доступные маленькие шоколадки (по 2 грамма каждая) и большие шоколадки (по 5 граммов каждая).
Нужно максимизировать использование больших шоколадок, применяя их до исчерпания возможности достичь оставшегося веса маленькими шоколадками.
Основные моменты:
- Маленькие шоколадки имеют вес 2 грамма каждый.
- Большие шоколадки имеют вес 5 граммов каждый.
- Нельзя разбивать шоколадки на части.
- Цель — найти минимальное количество маленьких шоколадок, необходимых для достижения целевого веса `goal`. - Если невозможно набрать целевой вес ни одним из возможных сочетаний маленьких и больших шоколадок, функция должна вернуть `-1`.
Примеры:
- make_chocolates(4, 1, 13)
Здесь доступно 4 маленьких шоколадки и 1 большая.
Для веса 13 грамм лучше использовать одну большую шоколадку (5 г), и оставшиеся 8 грамм добрать маленькими шоколадками (по 2 г).
Таким образом, потребуется 4 маленькие шоколадки. - make_chocolates(4, 1, 14)
Использовать одну большую шоколадку невозможно, потому что она даёт только 5 грамм, а разница между 14 и 5 равна 9, что нельзя покрыть четырьмя маленькими шоколадками (каждая по 2 грамма).
Поэтому цель недостижима, и возвращаем `-1`. - make_chocolates(2, 1, 7)
Одна большая шоколадка даст нам 5 грамм, и оставшиеся 2 грамма мы можем получить одной маленькой шоколадкой. - make_chocolates(3, 1, 6) Использование большой шоколадки не поможет, поскольку она добавляет только 5 грамм, а недостающие 1 грамм не покрывается имеющимися маленькими шоколадками. Следовательно, возвращаем 3 маленькие шоколадки.
Подходы к решению:
1. Ограничение количества больших шоколадок: Максимально возможное количество больших шоколадок, которое можно использовать, равно целой части от деления целевого веса на 5 (целиком используем максимум доступных больших шоколадок).
2. Проверка достижимости остаточного веса: После использования всех доступных больших шоколадок проверяем, можно ли покрыть остаток маленьким количеством маленьких шоколадок.
Если остаток меньше нуля или не делится на 2, значит,
Математика и алгоритмы — два языка, на которых говорит сама логика мироздания. Решая алгоритмические задачи, мы не просто тренируем мозг, а вступаем в диалог с фундаментальными принципами вычислений.
Каждая задача — это маленькая вселенная, со своими законами, ограничениями и возможностями. Находя решение, мы не просто получаем ответ, а открываем новый способ мышления, новый паттерн восприятия сложных систем.
Продолжайте этот диалог — мир алгоритмов бесконечно богат, и каждый новый шаг в нём приносит не только практическую пользу, но и интеллектуальное удовлетворение от понимания того, как устроена сама мысль в её вычислительном воплощении.
Вступайте в нашу телеграмм-группу Инфостарт