Приветствую читателей этой статьи, посвящённой решению интересных алгоритмических задачек — здесь вы найдёте подборку свежих заданий различной сложности, подходящих как новичкам, так и опытным разработчикам. Основная задача публикации — прокачать умение применять различные алгоритмы на практике, поддерживать навык написания качественного кода и, конечно, весело провести время, разгадывая головоломки!
Что было раньше:
В предыдущей части мы решили:
- Going to the cinema (Поход в кино)
- Rotate for a Max (Перевернуть по Максимуму)
- Floating-point Approximation (III) (Аппроксимация с плавающей запятой)
- Triple Trouble (Тройная угроза)
- Find the smallest integer in the array (Найти наименьшее целое число в массиве)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Thinkful - Logic Drills: Red and bumpy (Логические упражнения для размышлений: красные и неровные)
Ссылка на задачу: https://www.codewars.com/kata/5864cdc483f7e6df980001c8
Сложность: 6 kyu
Уже решили (На момент написания статьи): 1 593 из 7 033
Тэги: Fundamentals
Оригинальное описание задачи:
You're playing a game with a friend involving a bag of marbles.
In the bag are ten marbles:
1 smooth red marble
4 bumpy red marbles
2 bumpy yellow marbles
1 smooth yellow marble
1 bumpy green marble
1 smooth green marble
You can see that the probability of picking a smooth red marble from the bag is 1 / 10 or 0.10 and the probability of picking a bumpy yellow marble is 2 / 10 or 0.20.
The game works like this: your friend puts her hand in the bag, chooses a marble (without looking at it) and tells you whether it's bumpy or smooth.
Then you have to guess which color it is before she pulls it out and reveals whether you're correct or not.
You know that the information about whether the marble is bumpy or smooth changes the probability of what color it is, and you want some help with your guesses.
Write a function that takes two arguments:
a color ('red', 'yellow', or 'green') and a texture ('bumpy' or 'smooth') and returns the probability as a decimal fraction accurate to two places.
The probability should be a string and should discard any digits after the 100ths place.
For example, 2 / 3 or 0.6666666666666666 would become the string 0.66.
Note this is different from rounding.
As a complete example, 'red', 'bumpy' should return the string 0.57.
Пояснение задачи:
Задача формулируется следующим образом:
Нам нужно написать функцию, принимающую два параметра:
цвет ('red', 'yellow', 'green') и текстура ('bumpy' или 'smooth'), и возвращающую вероятность того, что выбранный друг из мешка шарик будет именно указанного цвета, учитывая, что известна информация о текстуре шара.
Пояснение:
Имеем десять шаров разного цвета и текстуры:
- 1 гладкий красный шар
- 4 шероховатых красных шара
- 2 шероховатых желтых шара
- 1 гладкий желтый шар
- 1 шероховатый зеленый шар
- 1 гладкий зеленый шар
Мы знаем, что друг сказал нам, какой текстурой обладает шар, и хотим определить вероятность того, что шар принадлежит конкретному цвету.
Для решения задачи используем формулу условной вероятности:
P({цвет} | {текстура}) = \frac{P{цвет и текстура})}{P({текстура})}
где:
P({цвет и текстура}) — вероятность выбрать шар определенного цвета и текстуры одновременно,
P({текстура}) — общая вероятность появления выбранной текстуры.
Пример расчета:
Пусть дан запрос 'red', 'bumpy'.
Шаг 1: Определим количество возможных вариантов появления шара красного цвета и шероховатого:
- Всего есть 5 красных шаров (1 гладкий + 4 шероховатых),
- Из них 4 — шероховатые.
Таким образом, вероятность выбрать красный и шероховатый шар равна {4}{10} = 0.4.
Шаг 2: Определим общую вероятность появления шероховатого шара:
- Всего есть 7 шероховатых шаров (4 красных + 2 желтых + 1 зеленый),
- Вероятность выбрать любой шероховатый шар равна \frac{7}{10} = 0.7.
Шаг 3: Рассчитаем условную вероятность:
P({красный} | {шероховатый}) = \frac{\frac{4}{10}}{\frac{7}{10}} = \frac{4}{7} \approx 0.5714
Задача 2
Платформа: CodeWars
Название задачи: Buying a car (Покупка автомобиля)
Ссылка на задачу: https://www.codewars.com/kata/554a44516729e4d80b000012
Сложность: 6 kyu
Уже решили (На момент написания статьи): 18 690 из 143 910
Тэги: Fundamentals, Mathematics
Оригинальное описание задачи:
Let us begin with an example:
A man has a rather old car being worth $2000. He saw a secondhand car being worth $8000.
He wants to keep his old car until he can buy the secondhand one.
He thinks he can save $1000 each month but the prices of his old car and of the new one decrease of 1.5 percent per month. Furthermore this percent of loss increases of `0.5` percent at the end of every two months.
Our man finds it difficult to make all these calculations.
Can you help him? How many months will it take him to save up enough money to buy the car he wants, and how much money will he have left over?
Parameters and return of function:
parameter (positive int or float, guaranteed) start_price_old (Old car price)
parameter (positive int or float, guaranteed) start_price_new (New car price)
parameter (positive int or float, guaranteed) saving_per_month
parameter (positive float or int, guaranteed) percent_loss_by_month
nbMonths(2000, 8000, 1000, 1.5) should return [6, 766] or (6, 766)
Detail of the above example: end month
1: percent_loss 1.5 available -4910.0 end month
2: percent_loss 2.0 available -3791.7999 end month
3: percent_loss 2.0 available -2675.964 end month
4: percent_loss 2.5 available -1534.06489 end month
5: percent_loss 2.5 available -395.71327 end month
6: percent_loss 3.0 available 766.158120825
return [6, 766] or (6, 766)
where `6` is the number of months at the end of which he can buy the new car and `766` is the nearest integer to `766.158` (rounding `766.158` gives `766`).
Note:
Selling, buying and saving are normally done at end of month.
Calculations are processed at the end of each considered month but if, by chance from the start, the value of the old car is bigger than the value of the new one or equal there is no saving to be made, no need to wait so he can at the beginning of the month buy the new car:
nbMonths(12000, 8000, 1000, 1.5) should return [0, 4000]
nbMonths(8000, 8000, 1000, 1.5) should return [0, 0]
We don't take care of a deposit of savings in a bank
Пояснение задачи:
Задача заключается в следующем:
Человек владеет старым автомобилем стоимостью start_price_old, хочет приобрести новый автомобиль стоимостью start_price_new. Каждый месяц он откладывает фиксированную сумму saving_per_month и одновременно оба автомобиля теряют стоимость каждый месяц.
Потеря стоимости старого автомобиля и нового автомобиля рассчитывается следующим образом:
- Изначально процентная потеря составляет percent_loss_by_month процентов в месяц.
- Каждые два месяца процентная потеря увеличивается на 0.5%.
Необходимо определить, через сколько месяцев человек сможет накопить достаточно денег, чтобы купить новый автомобиль, и какую сумму денег у него останется после покупки.
Пояснение работы функции:
1. Инициализация переменных:
- Начальная цена старого автомобиля (start_price_old).
- Начальная цена нового автомобиля (start_price_new).
- Ежемесячная сумма сбережений (saving_per_month).
- Процентная потеря каждого месяца (percent_loss_by_month).
2. Цикл накопления:
- Каждый месяц обновляется стоимость обоих автомобилей, учитывая уменьшение стоимости и увеличение процента потери каждые два месяца.
- Проверяется, достиг ли человек достаточного количества денег для покупки нового автомобиля.
- Если деньги накоплены, вычисляется остаток после покупки. 3. Завершение цикла: - Цикл продолжается до тех пор, пока не будет выполнено одно из условий:
- Накоплено достаточно денег для покупки нового автомобиля.
- Стоимость старого автомобиля становится меньше или равна стоимости нового автомобиля (в этом случае покупка возможна немедленно).
4. Возврат результата:
- Возвращается количество месяцев, необходимое для накопления нужной суммы, и остаток денег после покупки.
Пример:
Пусть начальные данные следующие:
- Старое авто стоит 2000$
- Новое авто стоит 8000$
- Человек откладывает 1000$ долларов в месяц
- Процентная потеря — 1.5% в первый месяц, далее увеличивается на 0.5% каждые два месяца
Задача 3
Платформа: CodeWars
Название задачи: Playing with passphrases (Игра с ключевыми фразами)
Ссылка на задачу: https://www.codewars.com/kata/559536379512a64472000053
Сложность: 6 kyu
Уже решили (На момент написания статьи): 12 616 из 73 840
Тэги: Strings, Algorithms
Оригинальное описание задачи:
Everyone knows passphrases.
One can choose passphrases from poems, songs, movies names and so on but frequently they can be guessed due to common cultural references.
You can get your passphrases stronger by different means.
One is the following: choose a text in capital letters including or not digits and non alphabetic characters,
1. shift each letter by a given number but the transformed letter must be a letter (circular shift),
2. replace each digit by its complement to 9,
3. keep such as non alphabetic and non digit characters,
4. downcase each letter in odd position, upcase each letter in even position (the first character is in position 0),
5. reverse the whole result.
Example:
"BORN IN 2015!", shift 1 1 + 2 + 3 -> "CPSO JO 7984!" 4 "CpSo jO 7984!" 5 "!4897 Oj oSpC" With longer passphrases it's better to have a small and easy program.
Would you write it?
Пояснение задачи:
Задача состоит в создании программы, которая усиливает защиту парольной фразы (passphrase) следующим образом:
1. Исходная строка преобразуется в верхний регистр (если изначально была строчная — остаётся без изменений).
2. Каждая буква сдвигается на заданное число позиций в алфавите (по кругу, если буква выходит за пределы A-Z).
- Например, сдвиг буквы `A` на 3 позиции даст `D`, а сдвиг `Z` на 3 позиции вернёт `C`.
3. Цифры заменяются на их дополнение до 9 (например, цифра 5 заменяется на 4, 8 заменяется на 1 и т.д.).
4. Буквы в нечётных позициях переводятся в нижний регистр, буквы в чётных позициях остаются заглавными (первая буква имеет индекс 0).
5. Итоговая строка переворачивается задом наперёд.
Пример работы программы:
`BORN IN 2015!` Пошаговое преобразование:
1. Преобразование регистра: BORN IN 2015! → BORN IN 2015! (буквы уже в верхнем регистре)
2. Сдвиг букв на 1 позицию: BORN IN 2015! → CPSO JO 7984!
3. Замена цифр: CPSO JO 7984! → CPSO JO 8974!
4. Изменение регистра букв: Нечётные позиции: cpsojO 8974! Четные позиции: CpsOjO 8974!
5. Переворот строки: !4798 Oj oSpc Таким образом, итоговый результат: !4798 Oj oSpc
Задача 4
Платформа: CodeWars
Название задачи: Statistics for an Athletic Association (Статистика для спортивной ассоциации)
Ссылка на задачу: https://www.codewars.com/kata/55b3425df71c1201a800009c
Сложность: 6 kyu
Уже решили (На момент написания статьи): 11 579 из 125 661
Тэги: Fundamentals, Strings, Statistics, Mathematics, Data Science
Оригинальное описание задачи:
You are the "computer expert" of a local Athletic Association (C.A.A.).
Many teams of runners come to compete.
Each time you get a string of all race results of every team who has run.
For example here is a string showing the individual results of a team of 5 runners:
"01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"
Each part of the string is of the form: h|m|s where h, m, s (h for hour, m for minutes, s for seconds) are positive or null integer (represented as strings) with one or two digits.
To compare the results of the teams you are asked for giving three statistics: range, average and median.
- Range : difference between the lowest and highest values. In {4, 6, 9, 3, 7} the lowest value is 3, and the highest is 9, so the range is 9 − 3 = 6.
- Mean or Average : To calculate mean, add together all of the numbers and then divide the sum by the total count of numbers.
- Median : In statistics, the median is the number separating the higher half of a data sample from the lower half.
The median of a finite list of numbers can be found by arranging all the observations from lowest value to highest value and picking the middle one (e.g., the median of {3, 3, 5, 9, 11} is 5) when there is an odd number of observations.
If there is an even number of observations, then there is no single middle value; the median is then defined to be the mean of the two middle values (the median of {3, 5, 6, 9} is (5 + 6) / 2 = 5.5).
Your task is to return a string giving these 3 values.
For the example given above, the string result will be "Range: 00|47|18 Average: 01|35|15 Median: 01|32|34" of the form:
"Range: hh|mm|ss Average: hh|mm|ss Median: hh|mm|ss" where hh, mm, ss are integers (represented by strings) with each 2 digits.
Remarks:
1. if a result in seconds is ab.xy it will be given truncated as ab.
2. if the given string is "you will return"
Пояснение задачи:
Задача состоит в том, чтобы обработать строку результатов забега команды бегунов и вывести три статистические характеристики: диапазон, среднее время и медиана времени.
Основные шаги решения:
1. Разбор строки:
Разделим входную строку на отдельные результаты каждого бегуна, преобразуем каждый результат в формат секунд (часы × 3600 + минуты × 60 + секунды).
Для этого разобьем каждую строку результата на часы, минуты и секунды, переведем их в числа и сложим.
2. Вычисление диапазона:
Диапазон — это разница между наибольшим и наименьшим временем среди всех участников команды.
Переведём каждое время в секунды, найдем минимальное и максимальное значение, вычислим разницу.
3. Вычисление среднего времени:
Среднее время — это сумма всех времён, делённая на количество участников.
После перевода во временные единицы (часы, минуты, секунды) снова преобразуем обратно в формат чч|мм|сс.
4. Вычисление медианы:
Медиана — это центральное значение упорядоченного списка времён. Если количество участников нечётное, берем средний элемент. Если чётное — среднее арифметическое двух центральных элементов.
5. Форматирование вывода:
Результат выводится в формате строки, где указаны диапазон, среднее время и медиана, разделённые пробелами.
Задача 5
Платформа: CodeWars
Название задачи: Ship of Theseus (Корабль Тесея)
Ссылка на задачу: https://www.codewars.com/kata/69b83710b26939b35fd10429
Сложность: 7 kyu
Уже решили (На момент написания статьи): 82 из 332
Тэги: Arrays, Algorithms, Logic, Matrix
Оригинальное описание задачи:
The "Ship of Theseus" is a classic philosophical thought experiment about identity over time.
It asks: if every part of a ship is gradually replaced, one piece at a time, is it still the same ship in the end?
This kata turns that idea into a simple validation problem. A ship is represented by a matrix of states.
Each row shows the ship at a different moment in time. The ship is considered to remain the same only if, between every two consecutive rows, exactly one part of the ship has changed.
Rules
- All rows must have the same length.
- Rows must be compared position by position.
- Between one row and the next, exactly one element (ship part) must be different.
- If any transition changes zero elements or more than one element, the process is invalid.
Return true if the whole process is valid, otherwise return false.
If the matrix has 0 or 1 row, return true.
Пояснение задачи:
Задача представляет собой проверку последовательности состояний корабля («корабля Тесея») на соответствие определённым правилам изменения состояния.
Описание задачи:
Дана матрица, представляющая корабль в разные моменты времени.
Каждое состояние (строка матрицы) описывает корабль в конкретный момент времени.
Нужно проверить, соблюдаются ли условия постоянства корабля между последовательными состояниями.
Условия проверки:
- Все строки матрицы должны иметь одинаковую длину.
- Между двумя последовательными строками должно отличаться ровно одно значение (элемент).
- Любые другие изменения (ноль или больше одного элемента) недопустимы.
Примеры:
Пример 1 ['a', 'b', 'c'], ['x', 'b', 'c'], ['x', 'y', 'c'], ['x', 'y', 'z']
Пошагово:
['a', 'b', 'c'] → ['x', 'b', 'c'] — изменение 1 элемента
['x', 'b', 'c'] → ['x', 'y', 'c'] — изменение 1 элемента
['x', 'y', 'c'] → ['x', 'y', 'z'] — изменение 1 элемента
Результат: true
Пример 2 ['a', 'b', 'c'], ['x', 'y', 'c']
Пошагово:
['a', 'b', 'c'] → ['x', 'y', 'c'] — изменение двух элементов
Результат: false
Дополнительные замечания:
- Если количество строк равно нулю или единице, корабль считается неизменным, и возвращается true.
- Важно сравнивать строки посимвольно, проверяя каждый элемент отдельно.
- Проверка проводится последовательно от первой строки до последней.
Заключение:
Платформа: CodeWars
Название задачи: Thinkful - Logic Drills: Red and bumpy (Логические упражнения для размышлений: красные и неровные)
Ссылка на задачу: https://www.codewars.com/kata/5864cdc483f7e6df980001c8
Сложность: 6 kyu
Уже решили (На момент написания статьи): 1 593 из 7 033
Тэги: Fundamentals
Оригинальное описание задачи:
You're playing a game with a friend involving a bag of marbles.
In the bag are ten marbles:
1 smooth red marble
4 bumpy red marbles
2 bumpy yellow marbles
1 smooth yellow marble
1 bumpy green marble
1 smooth green marble
You can see that the probability of picking a smooth red marble from the bag is 1 / 10 or 0.10 and the probability of picking a bumpy yellow marble is 2 / 10 or 0.20.
The game works like this: your friend puts her hand in the bag, chooses a marble (without looking at it) and tells you whether it's bumpy or smooth.
Then you have to guess which color it is before she pulls it out and reveals whether you're correct or not.
You know that the information about whether the marble is bumpy or smooth changes the probability of what color it is, and you want some help with your guesses.
Write a function that takes two arguments:
a color ('red', 'yellow', or 'green') and a texture ('bumpy' or 'smooth') and returns the probability as a decimal fraction accurate to two places.
The probability should be a string and should discard any digits after the 100ths place.
For example, 2 / 3 or 0.6666666666666666 would become the string 0.66.
Note this is different from rounding.
As a complete example, 'red', 'bumpy' should return the string 0.57.
Пояснение задачи:
Задача формулируется следующим образом:
Нам нужно написать функцию, принимающую два параметра:
цвет ('red', 'yellow', 'green') и текстура ('bumpy' или 'smooth'), и возвращающую вероятность того, что выбранный друг из мешка шарик будет именно указанного цвета, учитывая, что известна информация о текстуре шара.
Пояснение:
Имеем десять шаров разного цвета и текстуры:
- 1 гладкий красный шар
- 4 шероховатых красных шара
- 2 шероховатых желтых шара
- 1 гладкий желтый шар
- 1 шероховатый зеленый шар
- 1 гладкий зеленый шар
Мы знаем, что друг сказал нам, какой текстурой обладает шар, и хотим определить вероятность того, что шар принадлежит конкретному цвету.
Для решения задачи используем формулу условной вероятности:
P({цвет} | {текстура}) = \frac{P{цвет и текстура})}{P({текстура})}
где:
P({цвет и текстура}) — вероятность выбрать шар определенного цвета и текстуры одновременно,
P({текстура}) — общая вероятность появления выбранной текстуры.
Пример расчета:
Пусть дан запрос 'red', 'bumpy'.
Шаг 1: Определим количество возможных вариантов появления шара красного цвета и шероховатого:
- Всего есть 5 красных шаров (1 гладкий + 4 шероховатых),
- Из них 4 — шероховатые.
Таким образом, вероятность выбрать красный и шероховатый шар равна {4}{10} = 0.4.
Шаг 2: Определим общую вероятность появления шероховатого шара:
- Всего есть 7 шероховатых шаров (4 красных + 2 желтых + 1 зеленый),
- Вероятность выбрать любой шероховатый шар равна \frac{7}{10} = 0.7.
Шаг 3: Рассчитаем условную вероятность:
P({красный} | {шероховатый}) = \frac{\frac{4}{10}}{\frac{7}{10}} = \frac{4}{7} \approx 0.5714
Платформа: CodeWars
Название задачи: Buying a car (Покупка автомобиля)
Ссылка на задачу: https://www.codewars.com/kata/554a44516729e4d80b000012
Сложность: 6 kyu
Уже решили (На момент написания статьи): 18 690 из 143 910
Тэги: Fundamentals, Mathematics
Оригинальное описание задачи:
Let us begin with an example:
A man has a rather old car being worth $2000. He saw a secondhand car being worth $8000.
He wants to keep his old car until he can buy the secondhand one.
He thinks he can save $1000 each month but the prices of his old car and of the new one decrease of 1.5 percent per month. Furthermore this percent of loss increases of `0.5` percent at the end of every two months.
Our man finds it difficult to make all these calculations.
Can you help him? How many months will it take him to save up enough money to buy the car he wants, and how much money will he have left over?
Parameters and return of function:
parameter (positive int or float, guaranteed) start_price_old (Old car price)
parameter (positive int or float, guaranteed) start_price_new (New car price)
parameter (positive int or float, guaranteed) saving_per_month
parameter (positive float or int, guaranteed) percent_loss_by_month
nbMonths(2000, 8000, 1000, 1.5) should return [6, 766] or (6, 766)
Detail of the above example: end month
1: percent_loss 1.5 available -4910.0 end month
2: percent_loss 2.0 available -3791.7999 end month
3: percent_loss 2.0 available -2675.964 end month
4: percent_loss 2.5 available -1534.06489 end month
5: percent_loss 2.5 available -395.71327 end month
6: percent_loss 3.0 available 766.158120825
return [6, 766] or (6, 766)
where `6` is the number of months at the end of which he can buy the new car and `766` is the nearest integer to `766.158` (rounding `766.158` gives `766`).
Note:
Selling, buying and saving are normally done at end of month.
Calculations are processed at the end of each considered month but if, by chance from the start, the value of the old car is bigger than the value of the new one or equal there is no saving to be made, no need to wait so he can at the beginning of the month buy the new car:
nbMonths(12000, 8000, 1000, 1.5) should return [0, 4000]
nbMonths(8000, 8000, 1000, 1.5) should return [0, 0]
We don't take care of a deposit of savings in a bank
Пояснение задачи:
Задача заключается в следующем:
Человек владеет старым автомобилем стоимостью start_price_old, хочет приобрести новый автомобиль стоимостью start_price_new. Каждый месяц он откладывает фиксированную сумму saving_per_month и одновременно оба автомобиля теряют стоимость каждый месяц.
Потеря стоимости старого автомобиля и нового автомобиля рассчитывается следующим образом:
- Изначально процентная потеря составляет percent_loss_by_month процентов в месяц.
- Каждые два месяца процентная потеря увеличивается на 0.5%.
Необходимо определить, через сколько месяцев человек сможет накопить достаточно денег, чтобы купить новый автомобиль, и какую сумму денег у него останется после покупки.
Пояснение работы функции:
1. Инициализация переменных:
- Начальная цена старого автомобиля (start_price_old).
- Начальная цена нового автомобиля (start_price_new).
- Ежемесячная сумма сбережений (saving_per_month).
- Процентная потеря каждого месяца (percent_loss_by_month).
2. Цикл накопления:
- Каждый месяц обновляется стоимость обоих автомобилей, учитывая уменьшение стоимости и увеличение процента потери каждые два месяца.
- Проверяется, достиг ли человек достаточного количества денег для покупки нового автомобиля.
- Если деньги накоплены, вычисляется остаток после покупки. 3. Завершение цикла: - Цикл продолжается до тех пор, пока не будет выполнено одно из условий:
- Накоплено достаточно денег для покупки нового автомобиля.
- Стоимость старого автомобиля становится меньше или равна стоимости нового автомобиля (в этом случае покупка возможна немедленно).
4. Возврат результата:
- Возвращается количество месяцев, необходимое для накопления нужной суммы, и остаток денег после покупки.
Пример:
Пусть начальные данные следующие:
- Старое авто стоит 2000$
- Новое авто стоит 8000$
- Человек откладывает 1000$ долларов в месяц
- Процентная потеря — 1.5% в первый месяц, далее увеличивается на 0.5% каждые два месяца
Платформа: CodeWars
Название задачи: Playing with passphrases (Игра с ключевыми фразами)
Ссылка на задачу: https://www.codewars.com/kata/559536379512a64472000053
Сложность: 6 kyu
Уже решили (На момент написания статьи): 12 616 из 73 840
Тэги: Strings, Algorithms
Оригинальное описание задачи:
Everyone knows passphrases.
One can choose passphrases from poems, songs, movies names and so on but frequently they can be guessed due to common cultural references.
You can get your passphrases stronger by different means.
One is the following: choose a text in capital letters including or not digits and non alphabetic characters,
1. shift each letter by a given number but the transformed letter must be a letter (circular shift),
2. replace each digit by its complement to 9,
3. keep such as non alphabetic and non digit characters,
4. downcase each letter in odd position, upcase each letter in even position (the first character is in position 0),
5. reverse the whole result.
Example:
"BORN IN 2015!", shift 1 1 + 2 + 3 -> "CPSO JO 7984!" 4 "CpSo jO 7984!" 5 "!4897 Oj oSpC" With longer passphrases it's better to have a small and easy program.
Would you write it?
Пояснение задачи:
Задача состоит в создании программы, которая усиливает защиту парольной фразы (passphrase) следующим образом:
1. Исходная строка преобразуется в верхний регистр (если изначально была строчная — остаётся без изменений).
2. Каждая буква сдвигается на заданное число позиций в алфавите (по кругу, если буква выходит за пределы A-Z).
- Например, сдвиг буквы `A` на 3 позиции даст `D`, а сдвиг `Z` на 3 позиции вернёт `C`.
3. Цифры заменяются на их дополнение до 9 (например, цифра 5 заменяется на 4, 8 заменяется на 1 и т.д.).
4. Буквы в нечётных позициях переводятся в нижний регистр, буквы в чётных позициях остаются заглавными (первая буква имеет индекс 0).
5. Итоговая строка переворачивается задом наперёд.
Пример работы программы:
`BORN IN 2015!` Пошаговое преобразование:
1. Преобразование регистра: BORN IN 2015! → BORN IN 2015! (буквы уже в верхнем регистре)
2. Сдвиг букв на 1 позицию: BORN IN 2015! → CPSO JO 7984!
3. Замена цифр: CPSO JO 7984! → CPSO JO 8974!
4. Изменение регистра букв: Нечётные позиции: cpsojO 8974! Четные позиции: CpsOjO 8974!
5. Переворот строки: !4798 Oj oSpc Таким образом, итоговый результат: !4798 Oj oSpc
Платформа: CodeWars
Название задачи: Statistics for an Athletic Association (Статистика для спортивной ассоциации)
Ссылка на задачу: https://www.codewars.com/kata/55b3425df71c1201a800009c
Сложность: 6 kyu
Уже решили (На момент написания статьи): 11 579 из 125 661
Тэги: Fundamentals, Strings, Statistics, Mathematics, Data Science
Оригинальное описание задачи:
You are the "computer expert" of a local Athletic Association (C.A.A.).
Many teams of runners come to compete.
Each time you get a string of all race results of every team who has run.
For example here is a string showing the individual results of a team of 5 runners:
"01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"
Each part of the string is of the form: h|m|s where h, m, s (h for hour, m for minutes, s for seconds) are positive or null integer (represented as strings) with one or two digits.
To compare the results of the teams you are asked for giving three statistics: range, average and median.
- Range : difference between the lowest and highest values. In {4, 6, 9, 3, 7} the lowest value is 3, and the highest is 9, so the range is 9 − 3 = 6.
- Mean or Average : To calculate mean, add together all of the numbers and then divide the sum by the total count of numbers.
- Median : In statistics, the median is the number separating the higher half of a data sample from the lower half.
The median of a finite list of numbers can be found by arranging all the observations from lowest value to highest value and picking the middle one (e.g., the median of {3, 3, 5, 9, 11} is 5) when there is an odd number of observations.
If there is an even number of observations, then there is no single middle value; the median is then defined to be the mean of the two middle values (the median of {3, 5, 6, 9} is (5 + 6) / 2 = 5.5).
Your task is to return a string giving these 3 values.
For the example given above, the string result will be "Range: 00|47|18 Average: 01|35|15 Median: 01|32|34" of the form:
"Range: hh|mm|ss Average: hh|mm|ss Median: hh|mm|ss" where hh, mm, ss are integers (represented by strings) with each 2 digits.
Remarks:
1. if a result in seconds is ab.xy it will be given truncated as ab.
2. if the given string is "you will return"
Пояснение задачи:
Задача состоит в том, чтобы обработать строку результатов забега команды бегунов и вывести три статистические характеристики: диапазон, среднее время и медиана времени.
Основные шаги решения:
1. Разбор строки:
Разделим входную строку на отдельные результаты каждого бегуна, преобразуем каждый результат в формат секунд (часы × 3600 + минуты × 60 + секунды).
Для этого разобьем каждую строку результата на часы, минуты и секунды, переведем их в числа и сложим.
2. Вычисление диапазона:
Диапазон — это разница между наибольшим и наименьшим временем среди всех участников команды.
Переведём каждое время в секунды, найдем минимальное и максимальное значение, вычислим разницу.
3. Вычисление среднего времени:
Среднее время — это сумма всех времён, делённая на количество участников.
После перевода во временные единицы (часы, минуты, секунды) снова преобразуем обратно в формат чч|мм|сс.
4. Вычисление медианы:
Медиана — это центральное значение упорядоченного списка времён. Если количество участников нечётное, берем средний элемент. Если чётное — среднее арифметическое двух центральных элементов.
5. Форматирование вывода:
Результат выводится в формате строки, где указаны диапазон, среднее время и медиана, разделённые пробелами.
Платформа: CodeWars
Название задачи: Ship of Theseus (Корабль Тесея)
Ссылка на задачу: https://www.codewars.com/kata/69b83710b26939b35fd10429
Сложность: 7 kyu
Уже решили (На момент написания статьи): 82 из 332
Тэги: Arrays, Algorithms, Logic, Matrix
Оригинальное описание задачи:
The "Ship of Theseus" is a classic philosophical thought experiment about identity over time.
It asks: if every part of a ship is gradually replaced, one piece at a time, is it still the same ship in the end?
This kata turns that idea into a simple validation problem. A ship is represented by a matrix of states.
Each row shows the ship at a different moment in time. The ship is considered to remain the same only if, between every two consecutive rows, exactly one part of the ship has changed.
Rules
- All rows must have the same length.
- Rows must be compared position by position.
- Between one row and the next, exactly one element (ship part) must be different.
- If any transition changes zero elements or more than one element, the process is invalid.
Return true if the whole process is valid, otherwise return false.
If the matrix has 0 or 1 row, return true.
Пояснение задачи:
Задача представляет собой проверку последовательности состояний корабля («корабля Тесея») на соответствие определённым правилам изменения состояния.
Описание задачи:
Дана матрица, представляющая корабль в разные моменты времени.
Каждое состояние (строка матрицы) описывает корабль в конкретный момент времени.
Нужно проверить, соблюдаются ли условия постоянства корабля между последовательными состояниями.
Условия проверки:
- Все строки матрицы должны иметь одинаковую длину.
- Между двумя последовательными строками должно отличаться ровно одно значение (элемент).
- Любые другие изменения (ноль или больше одного элемента) недопустимы.
Примеры:
Пример 1 ['a', 'b', 'c'], ['x', 'b', 'c'], ['x', 'y', 'c'], ['x', 'y', 'z']
Пошагово:
['a', 'b', 'c'] → ['x', 'b', 'c'] — изменение 1 элемента
['x', 'b', 'c'] → ['x', 'y', 'c'] — изменение 1 элемента
['x', 'y', 'c'] → ['x', 'y', 'z'] — изменение 1 элемента
Результат: true
Пример 2 ['a', 'b', 'c'], ['x', 'y', 'c']
Пошагово:
['a', 'b', 'c'] → ['x', 'y', 'c'] — изменение двух элементов
Результат: false
Дополнительные замечания:
- Если количество строк равно нулю или единице, корабль считается неизменным, и возвращается true.
- Важно сравнивать строки посимвольно, проверяя каждый элемент отдельно.
- Проверка проводится последовательно от первой строки до последней.
Надеюсь, информация оказалась полезной и пробудила ваше любопытство к новым идеям и экспериментам. Благодарю за внимание и уделенное время — для меня это очень ценно.
Буду рад вашим комментариям, вопросам и мыслям — именно так развивается сообщество и рождаются новые идеи. Не стесняйтесь делиться своими впечатлениями под статьей, вместе мы сделаем следующий материал ещё более интересным и полезным.
А пока прощаюсь, но только до новых встреч! В следующих публикациях обязательно продолжим исследовать захватывающие аспекты, разбирать сложные задачи и делиться свежими открытиями.
До скорой связи!
Вступайте в нашу телеграмм-группу Инфостарт