Всем привет в новой алгоритмической раздаче! Собрал для вас свежую порцию задач — специально подобрал так, чтобы было интересно и новичкам, и бывалым кодерам.
Что внутри: задания, которые прокачают твоё алгоритмическое видение, помогут держать руку на пульсе кодинга и — что немаловажно — подарят азарт от решения умных головоломок.
Выбирай свою трассу сложности и — стартуем!
Что было раньше:
В предыдущей части мы решили:
- Find the force of gravity between two objects (Найдите силу притяжения между двумя объектами)
- Sum Arrays (Суммирующие массивы)
- Third Angle of a Triangle (Третий угол треугольника)
- Speech to Text - String Manipulation (Преобразование речи в текстовую строку - Манипуляция)
- Integers: Recreation Two (Целые числа: Всего два)
- Address Book by State (Адресная книга по штатам)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Excel sheet column numbers (Номера столбцов таблицы Excel)
Ссылка на задачу: https://www.codewars.com/kata/55ee3ebff71e82a30000006a
Сложность: 7 kyu
Уже решили (На момент написания статьи): 3 381 из 12 032
Тэги: Fundamentals, Algorithms
Оригинальное описание задачи:
Write a function that, given a column title as it appears in an Excel sheet, returns its corresponding column number.
All column titles will be uppercase.
Examples:
Column title: "A" --> return 1
Column title: "Z" --> return 26
Column title: "AA" --> return 27
Пояснение задачи:
Задача состоит в написании функции, принимающей строку — название столбца таблицы Excel в виде заглавных букв латинского алфавита (например, «A», «B», «AB»), и возвращающей соответствующее ей числовое значение колонки.
Пояснение:
Каждая буква в названии столбца представляет собой позицию в позиционной системе счисления, где основание системы равно 26 (количество букв в английском алфавите).
Первая буква соответствует числу 1,вторая буква — числу 26,третья буква — числу 26² и так далее.
Чтобы получить номер столбца, каждая буква строки преобразуется в её порядковый номер в алфавите (от 1 до 26), затем буквы последовательно умножаются на степени основания (26) и суммируются.
Пример:
Для названия столбца "AB":
- Буква `'A'` соответствует позиции 1 (буквы идут от 'A' = 1, 'B' = 2, ... , 'Z' = 26)
- Буква `'B'` соответствует позиции 2 (следующая буква после 'A')
Число столбца рассчитывается следующим образом:
{позиция первой буквы} * 26^1 + {позиция второй буквы} * 26^0 = 1 * 26 + 2 * 1 = 28
Таким образом, столбец "AB" имеет номер 28.
Примеры: - "A" → 1 - "Z" → 26 - "AA" → 27 (1 × 26¹ + 1 × 26S04; = 27) - "AZ" → 677 (1 × 26² + 26 × 26S04; = 677)
Сложность Алгоритм должен эффективно обрабатывать длинные строки (до 10 символов), обеспечивая линейную сложность O(n) по длине строки, где n — длина строки столбца.
Задача 2
Платформа: CodeWars
Название задачи: What's a Perfect Power anyway? (И вообще, что такое Совершенная Сила?)
Ссылка на задачу: https://www.codewars.com/kata/54d4c8b08776e4ad92000835
Сложность: 5 kyu
Уже решили (На момент написания статьи): 20 538 из 103 488
Тэги: Mathematics, Fundamentals
Оригинальное описание задачи:
A perfect power ) is a classification of positive integers:
In mathematics, a perfect power is a positive integer that can be expressed as an integer power of another positive integer. More formally, n is a perfect power if there exist natural numbers m > 1, and k > 1 such that m^k = n.
Your task is to check wheter a given integer is a perfect power. If it is a perfect power, return a pair `m` and `k` with m^k = n as a proof. Otherwise return `Nothing`, `Nil`, `nil`, `null`, `NULL`, `None` or your language's equivalent.
Note:
For a perfect power, there might be several pairs. For example `81 = 3^4 = 9^2`, so `(3,4)` and `(9,2)` are valid solutions. However, the tests take care of this, so if a number is a perfect power, return any pair that proves it.
Examples
(isPP(4), => [2,2]
(isPP(9), => [3,2]
(isPP(5), => none
Пояснение задачи:
Задача заключается в проверке, является ли заданное число совершенным (полным) числом степени, то есть числом, которое можно представить в виде n = m^k, где m и k — натуральные числа, причём m > 1 и k > 1.
Требуется реализовать функцию, принимающую целое число и возвращающую либо пару (m, k), доказывающую, что число является совершенным числом степени, либо специальный маркер (`null`, `None`, `nil` или эквивалент в используемом языке), если число не является совершенным числом степени.
Примеры:
- Число 4 является совершенным числом степени, так как 4 = 2^2, значит результатом будет пара (2, 2).
- Число 9 также является совершенным числом степени (9 = 3^2), результат — пара (3, 2).
- Число 5 не является совершенным числом степени, поэтому функция должна вернуть специальный маркер (например, `null`).
Подход к решению:
Для решения задачи существует эффективный алгоритм:
1. Проверяем, является ли число простым. Если оно простое, то не является совершенным числом степени.
2. Если число составное, проверяем, можно ли представить его в виде m^k с помощью перебора возможных степеней k.
3. Для каждой возможной степени k от 2 до √[n]{n} (где n — исходное число) проверяем, делится ли число нацело на m = n^{1/k}, и корректно ли значение m соответствует условиям задачи.
Таким образом, задача сводится к эффективному поиску подходящей пары (m, k) или выводу специального маркера, если такая пара не найдена.
Задача 3
Платформа: CodeWars
Название задачи: Title Case (Заглавный падеж)
Ссылка на задачу: https://www.codewars.com/kata/5202ef17a402dd033c000009
Сложность: 6 kyu
Уже решили (На момент написания статьи): 40 104 из 269 871
Тэги: Strings, Fundamentals
Оригинальное описание задачи:
A string is considered to be in title case if each word in the string is either (a) capitalised (that is, only the first letter of the word is in upper case) or (b) considered to be an exception and put entirely into lower case unless it is the first word, which is always capitalised.
Write a function that will convert a string into title case, given an optional list of exceptions (minor words). The list of minor words will be given as a string with each word separated by a space. Your function should ignore the case of the minor words string -- it should behave in the same way even if the case of the minor word string is changed.
Arguments (Haskell)
First argument: space-delimited list of minor words that must always be lowercase except for the first word in the string.
Second argument: the original string to be converted.
Arguments (Other languages)
First argument (required): the original string to be converted.
Second argument (optional): space-delimited list of minor words that must always be lowercase except for the first word in the string.
The JavaScript/CoffeeScript tests will pass `undefined` when this argument is unused.
Example
titleCase('a clash of KINGS', 'a an the of') // should return: 'A Clash of Kings'
titleCase('THE WIND IN THE WILLOWS', 'The In') // should return: 'The Wind in the Willows'
titleCase('the quick brown fox') // should return: 'The Quick Brown Fox'
Пояснение задачи:
Задача состоит в преобразовании строки в формат «заглавных букв» (title case):
- Первое слово строки всегда должно начинаться с заглавной буквы.
- Все остальные слова начинаются с заглавной буквы первой буквы, а остальные буквы переводятся в нижний регистр.
- Есть возможность указать список исключений («малозначимых» слов), которые всегда выводятся строчными буквами, кроме первого слова.
Пример:
Входные данные:
- Строка: "a clash of KINGS" - Список исключений: "a an the of" Результат: "A Clash of Kings"
Дополнительные пояснения:
- Исключаемые слова (если заданы) всегда выводятся строчными буквами, кроме первого слова.
- Слово считается исключаемым, если оно полностью совпадает с одним из слов списка исключений (слова в списке чувствительны к регистру, но при обработке строки игнорируется регистр исключения).
- Если исключение отсутствует, все слова обрабатываются одинаково (первая буква заглавная, остальные строчные).
Граничные случаи:
- Пустая строка должна вернуть пустую строку.
- Если список исключений пустой, каждое слово начинается с заглавной буквы.
Примеры:
- `titleCase("a clash of KINGS", "a an the of")` → "A Clash of Kings"
- `titleCase("THE WIND IN THE WILLOWS", "The In")` → "The Wind in the Willows"
- `titleCase("the quick brown fox")` → "The Quick Brown Fox"
Задача 4
Платформа: CodeWars
Название задачи: Finish Guess the Number Game (Закончите игру "Угадай число")
Ссылка на задачу: https://www.codewars.com/kata/568018a64f35f0c613000054
Сложность: 8 kyu
Уже решили (На момент написания статьи): 11 241 из 49 963
Тэги: Fundamentals, Object-oriented Programming
Оригинальное описание задачи:
Imagine you are creating a game where the user has to guess the correct number.But there is a limit of how many guesses the user can do.
- If the user tries to guess more than the limit, the function should throw an error.
- If the user guess is right it should return true.
- If the user guess is wrong it should return false and lose a life.
Can you finish the game so all the rules are met?
Пояснение задачи:
Задача состоит в создании игровой функции, моделирующей процесс угадывания числа игроком:
- Игроку разрешено сделать ограниченное количество попыток (число жизней).
- Если игрок превысит допустимое число попыток, игра должна завершаться ошибкой.
- После каждой попытки программа проверяет правильность введённого числа:
- Если угадал — возвращается `true`, игра продолжается.
- Если не угадал — уменьшается счётчик попыток («потеря жизни»), возвращается `false`.
Дополнительно требуется учесть следующие моменты:
- Игрок вводит число, которое сравнивается с заранее заданным правильным числом.
- Количество попыток ограничено, превышение лимита должно приводить к завершению игры с ошибкой.
Пример игрового сценария:
Правильный ответ: 42 Ограничено 3 попытки Игрок вводит: 30 → false, остаётся 2 попытки
Игрок вводит: 45 → false, остаётся 1 попытка Игрок вводит: 42 → true, победа!
Правила:
- Если введённое число больше правильного, возвращаем `false` и уменьшаем количество попыток.
- Если ввели неверное число меньше правильного, возвращаем `false` и уменьшаем количество попыток.
- Если число попыток исчерпано до нахождения правильного ответа, игра заканчивается ошибкой.
Задача 5
Платформа: CodeWars
Название задачи: Find heavy ball - level: novice (Найдите тяжелый мяч - уровень: новичок)
Ссылка на задачу: https://www.codewars.com/kata/544047f0cf362503e000036e
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 705 из 7 754
Тэги: Puzzles, Logic, Riddles
Оригинальное описание задачи:
There are 8 balls numbered from 0 to 7. Seven of them have the same weight. One is heavier. Your task is to find its number.
Your function `findBall` will receive single argument - `scales` object. The `scales` object contains an internally stored array of 8 elements (indexes 0-7), each having the same value except one, which is greater. It also has a public method named `getWeight(left, right)` which takes two arrays of indexes and returns -1, 0, or 1 based on the accumulation of the values found at the indexes passed are heavier, equal, or lighter.
`getWeight` returns:
`-1` if left pan is heavier
`1` if right pan is heavier
`0` if both pans weight the same
Examples of `scales.getWeight()` usage:
`scales.getWeight([3], [7])` returns `-1` if ball 3 is heavier than ball 7, `1` if ball 7 is heavier, or `0` i these balls have the same weight.
`scales.getWeight([3, 4], [5, 2])` returns `-1` if weight of balls 3 and 4 is heavier than weight of balls 5 and 2 etc.
So where's the catch, you may ask. Well - the scales is very old. You can use it only 4 TIMES before the scale breaks.
Note- Use `scales.get_weight()` in the Python, Crystal, Ruby And C versions.
Пояснение задачи:
Задача состоит в поиске тяжёлого шара среди восьми одинаковых по весу шаров, один из которых отличается большей массой. Шары пронумерованы от 0 до 7. Алгоритм поиска ограничен четырьмя взвешиваниями, после чего прибор выходит из строя.
Нам доступен метод `getWeight`, который позволяет сравнивать суммарный вес двух групп шаров и возвращает:
- `-1`: левая чаша тяжелее
- `1`: правая чаша тяжелее
- `0`: обе чаши равны по весу
Необходимо разработать стратегию взвешиваний, позволяющую гарантированно найти тяжёлый шар за четыре попытки.
Пояснение стратегии:
Для решения задачи важно минимизировать количество возможных вариантов после каждого взвешивания. Один из эффективных подходов — разделить шары на группы и использовать бинарное деление пространства поиска.
1. Делим шары на три группы примерно одинакового размера:
- Первая группа: [0, 1, 2, 3]
- Вторая группа: [4, 5, 6, 7]
Если сравнить первую и вторую группу:
- Если вес равен (`0`), значит тяжёлый шар находится в третьей группе (шары 4–7).
- Если первая группа тяжелее (`-1`), значит тяжёлый шар в первой группе (шары 0–3).
- Если вторая группа тяжелее (`1`), значит тяжёлый шар во второй группе (шары 4–7).
2. После первого взвешивания уменьшаем пространство поиска до трёх или четырёх шаров.
3. Повторяем аналогичную процедуру, разделяя оставшиеся шары на две части и сравнивая их.
4. Последнее взвешивание проводится между оставшимися двумя шарами, позволяя точно определить тяжёлый шар. Пример:
Пусть шары имеют веса:
| Индекс | Вес |
| --- | --- |
| 0 | 1 |
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
|6 | 2 |
| 7 | 1 |
Первое взвешивание: `[0, 1, 2, 3] vs [4, 5, 6, 7]`
Получаем результат `-1`, значит тяжёлый шар в группе [0, 1, 2,]
Задача 6
Платформа: CodeWars
Название задачи: Locate P using 3 Points and their distances to P (Найдите P, используя 3 точки и их расстояния до P)
Ссылка на задачу: https://www.codewars.com/kata/6326533f8b7445002e856ca3
Сложность: 6 kyu
Уже решили (На момент написания статьи): 190 из 698
Тэги: Mathematics, Geometry
Оригинальное описание задачи:
Task Given Points `A`, `B`, `C` ∈ T84;2 and `dA`, `dB`, `dC` ∈ T69; their respective squared euclidian distances to a certain point `P`∈ T84;^2, return the value of `P`.
Note `A`, `B`, and `C` will always be distinct and non-collinear
Пояснение задачи:
Задача состоит в следующем:
Даны три точки A , B и C в двумерном пространстве целых чисел {Z}^2 и квадраты евклидовых расстояний от некоторой неизвестной точки P до каждой из точек ( d_A , d_B , d_C ).
Требуется найти координаты точки P.
Пояснение
- Координаты точек A , B и C известны заранее, и каждая точка представлена парой целых чисел (x, y).
- Известны также квадраты расстояний от точки P до каждой из точек A , B и C .
- Точки A , B и C гарантированно различны и не лежат на одной прямой (не коллинеарны).
Необходимо определить координаты точки P таким образом, чтобы выполнялись следующие условия:
(x_P - x_A)^2 + (y_P - y_A)^2 = d_A^2 (x_P - x_B)^2 + (y_P - y_B)^2 = d_B^2 (x_P - x_C)^2 + (y_P - y_C)^2 = d_C^2 где (x_P, y_P)— искомые координаты точки P.
Подход к решению:
Поскольку точки A , B и C неколлинеарны, система уравнений имеет единственное решение.
Для нахождения координат точки P удобно воспользоваться методом решения системы линейных уравнений.
1. Перепишем каждое уравнение в виде квадратичной формы относительно
x_P и y_P: (x_P - x_A)^2 + (y_P - y_A)^2 = d_A^2 > x_P^2 - 2x_A x_P + x_A^2 + y_P^2 - 2y_A y_P + y_A^2 = d_A^2
Аналогично для B и C .
2. Избавимся от квадратичных членов, выразив x_P и y_P через известные величины и расстояния:
Для упрощения обозначим: x_1 = x_A, y_1 = y_A, x_2 = x_B, y_2 = x_B
Заключение:
Платформа: CodeWars
Название задачи: Excel sheet column numbers (Номера столбцов таблицы Excel)
Ссылка на задачу: https://www.codewars.com/kata/55ee3ebff71e82a30000006a
Сложность: 7 kyu
Уже решили (На момент написания статьи): 3 381 из 12 032
Тэги: Fundamentals, Algorithms
Оригинальное описание задачи:
Write a function that, given a column title as it appears in an Excel sheet, returns its corresponding column number.
All column titles will be uppercase.
Examples:
Column title: "A" --> return 1
Column title: "Z" --> return 26
Column title: "AA" --> return 27
Пояснение задачи:
Задача состоит в написании функции, принимающей строку — название столбца таблицы Excel в виде заглавных букв латинского алфавита (например, «A», «B», «AB»), и возвращающей соответствующее ей числовое значение колонки.
Пояснение:
Каждая буква в названии столбца представляет собой позицию в позиционной системе счисления, где основание системы равно 26 (количество букв в английском алфавите).
Первая буква соответствует числу 1,вторая буква — числу 26,третья буква — числу 26² и так далее.
Чтобы получить номер столбца, каждая буква строки преобразуется в её порядковый номер в алфавите (от 1 до 26), затем буквы последовательно умножаются на степени основания (26) и суммируются.
Пример:
Для названия столбца "AB":
- Буква `'A'` соответствует позиции 1 (буквы идут от 'A' = 1, 'B' = 2, ... , 'Z' = 26)
- Буква `'B'` соответствует позиции 2 (следующая буква после 'A')
Число столбца рассчитывается следующим образом:
{позиция первой буквы} * 26^1 + {позиция второй буквы} * 26^0 = 1 * 26 + 2 * 1 = 28
Таким образом, столбец "AB" имеет номер 28.
Примеры: - "A" → 1 - "Z" → 26 - "AA" → 27 (1 × 26¹ + 1 × 26S04; = 27) - "AZ" → 677 (1 × 26² + 26 × 26S04; = 677)
Сложность Алгоритм должен эффективно обрабатывать длинные строки (до 10 символов), обеспечивая линейную сложность O(n) по длине строки, где n — длина строки столбца.
Платформа: CodeWars
Название задачи: What's a Perfect Power anyway? (И вообще, что такое Совершенная Сила?)
Ссылка на задачу: https://www.codewars.com/kata/54d4c8b08776e4ad92000835
Сложность: 5 kyu
Уже решили (На момент написания статьи): 20 538 из 103 488
Тэги: Mathematics, Fundamentals
Оригинальное описание задачи:
A perfect power ) is a classification of positive integers:
In mathematics, a perfect power is a positive integer that can be expressed as an integer power of another positive integer. More formally, n is a perfect power if there exist natural numbers m > 1, and k > 1 such that m^k = n.
Your task is to check wheter a given integer is a perfect power. If it is a perfect power, return a pair `m` and `k` with m^k = n as a proof. Otherwise return `Nothing`, `Nil`, `nil`, `null`, `NULL`, `None` or your language's equivalent.
Note:
For a perfect power, there might be several pairs. For example `81 = 3^4 = 9^2`, so `(3,4)` and `(9,2)` are valid solutions. However, the tests take care of this, so if a number is a perfect power, return any pair that proves it.
Examples
(isPP(4), => [2,2]
(isPP(9), => [3,2]
(isPP(5), => none
Пояснение задачи:
Задача заключается в проверке, является ли заданное число совершенным (полным) числом степени, то есть числом, которое можно представить в виде n = m^k, где m и k — натуральные числа, причём m > 1 и k > 1.
Требуется реализовать функцию, принимающую целое число и возвращающую либо пару (m, k), доказывающую, что число является совершенным числом степени, либо специальный маркер (`null`, `None`, `nil` или эквивалент в используемом языке), если число не является совершенным числом степени.
Примеры:
- Число 4 является совершенным числом степени, так как 4 = 2^2, значит результатом будет пара (2, 2).
- Число 9 также является совершенным числом степени (9 = 3^2), результат — пара (3, 2).
- Число 5 не является совершенным числом степени, поэтому функция должна вернуть специальный маркер (например, `null`).
Подход к решению:
Для решения задачи существует эффективный алгоритм:
1. Проверяем, является ли число простым. Если оно простое, то не является совершенным числом степени.
2. Если число составное, проверяем, можно ли представить его в виде m^k с помощью перебора возможных степеней k.
3. Для каждой возможной степени k от 2 до √[n]{n} (где n — исходное число) проверяем, делится ли число нацело на m = n^{1/k}, и корректно ли значение m соответствует условиям задачи.
Таким образом, задача сводится к эффективному поиску подходящей пары (m, k) или выводу специального маркера, если такая пара не найдена.
Платформа: CodeWars
Название задачи: Title Case (Заглавный падеж)
Ссылка на задачу: https://www.codewars.com/kata/5202ef17a402dd033c000009
Сложность: 6 kyu
Уже решили (На момент написания статьи): 40 104 из 269 871
Тэги: Strings, Fundamentals
Оригинальное описание задачи:
A string is considered to be in title case if each word in the string is either (a) capitalised (that is, only the first letter of the word is in upper case) or (b) considered to be an exception and put entirely into lower case unless it is the first word, which is always capitalised.
Write a function that will convert a string into title case, given an optional list of exceptions (minor words). The list of minor words will be given as a string with each word separated by a space. Your function should ignore the case of the minor words string -- it should behave in the same way even if the case of the minor word string is changed.
Arguments (Haskell)
First argument: space-delimited list of minor words that must always be lowercase except for the first word in the string.
Second argument: the original string to be converted.
Arguments (Other languages)
First argument (required): the original string to be converted.
Second argument (optional): space-delimited list of minor words that must always be lowercase except for the first word in the string.
The JavaScript/CoffeeScript tests will pass `undefined` when this argument is unused.
Example
titleCase('a clash of KINGS', 'a an the of') // should return: 'A Clash of Kings'
titleCase('THE WIND IN THE WILLOWS', 'The In') // should return: 'The Wind in the Willows'
titleCase('the quick brown fox') // should return: 'The Quick Brown Fox'
Пояснение задачи:
Задача состоит в преобразовании строки в формат «заглавных букв» (title case):
- Первое слово строки всегда должно начинаться с заглавной буквы.
- Все остальные слова начинаются с заглавной буквы первой буквы, а остальные буквы переводятся в нижний регистр.
- Есть возможность указать список исключений («малозначимых» слов), которые всегда выводятся строчными буквами, кроме первого слова.
Пример:
Входные данные:
- Строка: "a clash of KINGS" - Список исключений: "a an the of" Результат: "A Clash of Kings"
Дополнительные пояснения:
- Исключаемые слова (если заданы) всегда выводятся строчными буквами, кроме первого слова.
- Слово считается исключаемым, если оно полностью совпадает с одним из слов списка исключений (слова в списке чувствительны к регистру, но при обработке строки игнорируется регистр исключения).
- Если исключение отсутствует, все слова обрабатываются одинаково (первая буква заглавная, остальные строчные).
Граничные случаи:
- Пустая строка должна вернуть пустую строку.
- Если список исключений пустой, каждое слово начинается с заглавной буквы.
Примеры:
- `titleCase("a clash of KINGS", "a an the of")` → "A Clash of Kings"
- `titleCase("THE WIND IN THE WILLOWS", "The In")` → "The Wind in the Willows"
- `titleCase("the quick brown fox")` → "The Quick Brown Fox"
Платформа: CodeWars
Название задачи: Finish Guess the Number Game (Закончите игру "Угадай число")
Ссылка на задачу: https://www.codewars.com/kata/568018a64f35f0c613000054
Сложность: 8 kyu
Уже решили (На момент написания статьи): 11 241 из 49 963
Тэги: Fundamentals, Object-oriented Programming
Оригинальное описание задачи:
Imagine you are creating a game where the user has to guess the correct number.But there is a limit of how many guesses the user can do.
- If the user tries to guess more than the limit, the function should throw an error.
- If the user guess is right it should return true.
- If the user guess is wrong it should return false and lose a life.
Can you finish the game so all the rules are met?
Пояснение задачи:
Задача состоит в создании игровой функции, моделирующей процесс угадывания числа игроком:
- Игроку разрешено сделать ограниченное количество попыток (число жизней).
- Если игрок превысит допустимое число попыток, игра должна завершаться ошибкой.
- После каждой попытки программа проверяет правильность введённого числа:
- Если угадал — возвращается `true`, игра продолжается.
- Если не угадал — уменьшается счётчик попыток («потеря жизни»), возвращается `false`.
Дополнительно требуется учесть следующие моменты:
- Игрок вводит число, которое сравнивается с заранее заданным правильным числом.
- Количество попыток ограничено, превышение лимита должно приводить к завершению игры с ошибкой.
Пример игрового сценария:
Правильный ответ: 42 Ограничено 3 попытки Игрок вводит: 30 → false, остаётся 2 попытки
Игрок вводит: 45 → false, остаётся 1 попытка Игрок вводит: 42 → true, победа!
Правила:
- Если введённое число больше правильного, возвращаем `false` и уменьшаем количество попыток.
- Если ввели неверное число меньше правильного, возвращаем `false` и уменьшаем количество попыток.
- Если число попыток исчерпано до нахождения правильного ответа, игра заканчивается ошибкой.
Платформа: CodeWars
Название задачи: Find heavy ball - level: novice (Найдите тяжелый мяч - уровень: новичок)
Ссылка на задачу: https://www.codewars.com/kata/544047f0cf362503e000036e
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 705 из 7 754
Тэги: Puzzles, Logic, Riddles
Оригинальное описание задачи:
There are 8 balls numbered from 0 to 7. Seven of them have the same weight. One is heavier. Your task is to find its number.
Your function `findBall` will receive single argument - `scales` object. The `scales` object contains an internally stored array of 8 elements (indexes 0-7), each having the same value except one, which is greater. It also has a public method named `getWeight(left, right)` which takes two arrays of indexes and returns -1, 0, or 1 based on the accumulation of the values found at the indexes passed are heavier, equal, or lighter.
`getWeight` returns:
`-1` if left pan is heavier
`1` if right pan is heavier
`0` if both pans weight the same
Examples of `scales.getWeight()` usage:
`scales.getWeight([3], [7])` returns `-1` if ball 3 is heavier than ball 7, `1` if ball 7 is heavier, or `0` i these balls have the same weight.
`scales.getWeight([3, 4], [5, 2])` returns `-1` if weight of balls 3 and 4 is heavier than weight of balls 5 and 2 etc.
So where's the catch, you may ask. Well - the scales is very old. You can use it only 4 TIMES before the scale breaks.
Note- Use `scales.get_weight()` in the Python, Crystal, Ruby And C versions.
Пояснение задачи:
Задача состоит в поиске тяжёлого шара среди восьми одинаковых по весу шаров, один из которых отличается большей массой. Шары пронумерованы от 0 до 7. Алгоритм поиска ограничен четырьмя взвешиваниями, после чего прибор выходит из строя.
Нам доступен метод `getWeight`, который позволяет сравнивать суммарный вес двух групп шаров и возвращает:
- `-1`: левая чаша тяжелее
- `1`: правая чаша тяжелее
- `0`: обе чаши равны по весу
Необходимо разработать стратегию взвешиваний, позволяющую гарантированно найти тяжёлый шар за четыре попытки.
Пояснение стратегии:
Для решения задачи важно минимизировать количество возможных вариантов после каждого взвешивания. Один из эффективных подходов — разделить шары на группы и использовать бинарное деление пространства поиска.
1. Делим шары на три группы примерно одинакового размера:
- Первая группа: [0, 1, 2, 3]
- Вторая группа: [4, 5, 6, 7]
Если сравнить первую и вторую группу:
- Если вес равен (`0`), значит тяжёлый шар находится в третьей группе (шары 4–7).
- Если первая группа тяжелее (`-1`), значит тяжёлый шар в первой группе (шары 0–3).
- Если вторая группа тяжелее (`1`), значит тяжёлый шар во второй группе (шары 4–7).
2. После первого взвешивания уменьшаем пространство поиска до трёх или четырёх шаров.
3. Повторяем аналогичную процедуру, разделяя оставшиеся шары на две части и сравнивая их.
4. Последнее взвешивание проводится между оставшимися двумя шарами, позволяя точно определить тяжёлый шар. Пример:
Пусть шары имеют веса:
| Индекс | Вес |
| --- | --- |
| 0 | 1 |
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
|6 | 2 |
| 7 | 1 |
Первое взвешивание: `[0, 1, 2, 3] vs [4, 5, 6, 7]`
Получаем результат `-1`, значит тяжёлый шар в группе [0, 1, 2,]
Платформа: CodeWars
Название задачи: Locate P using 3 Points and their distances to P (Найдите P, используя 3 точки и их расстояния до P)
Ссылка на задачу: https://www.codewars.com/kata/6326533f8b7445002e856ca3
Сложность: 6 kyu
Уже решили (На момент написания статьи): 190 из 698
Тэги: Mathematics, Geometry
Оригинальное описание задачи:
Task Given Points `A`, `B`, `C` ∈ T84;2 and `dA`, `dB`, `dC` ∈ T69; their respective squared euclidian distances to a certain point `P`∈ T84;^2, return the value of `P`.
Note `A`, `B`, and `C` will always be distinct and non-collinear
Пояснение задачи:
Задача состоит в следующем:
Даны три точки A , B и C в двумерном пространстве целых чисел {Z}^2 и квадраты евклидовых расстояний от некоторой неизвестной точки P до каждой из точек ( d_A , d_B , d_C ).
Требуется найти координаты точки P.
Пояснение
- Координаты точек A , B и C известны заранее, и каждая точка представлена парой целых чисел (x, y).
- Известны также квадраты расстояний от точки P до каждой из точек A , B и C .
- Точки A , B и C гарантированно различны и не лежат на одной прямой (не коллинеарны).
Необходимо определить координаты точки P таким образом, чтобы выполнялись следующие условия:
(x_P - x_A)^2 + (y_P - y_A)^2 = d_A^2 (x_P - x_B)^2 + (y_P - y_B)^2 = d_B^2 (x_P - x_C)^2 + (y_P - y_C)^2 = d_C^2 где (x_P, y_P)— искомые координаты точки P.
Подход к решению:
Поскольку точки A , B и C неколлинеарны, система уравнений имеет единственное решение.
Для нахождения координат точки P удобно воспользоваться методом решения системы линейных уравнений.
1. Перепишем каждое уравнение в виде квадратичной формы относительно
x_P и y_P: (x_P - x_A)^2 + (y_P - y_A)^2 = d_A^2 > x_P^2 - 2x_A x_P + x_A^2 + y_P^2 - 2y_A y_P + y_A^2 = d_A^2
Аналогично для B и C .
2. Избавимся от квадратичных членов, выразив x_P и y_P через известные величины и расстояния:
Для упрощения обозначим: x_1 = x_A, y_1 = y_A, x_2 = x_B, y_2 = x_B
Материал завершён. Задачи представлены, подходы разобраны — теперь очередь вашего кода и анализа.
Техническая дискуссия приветствуется: публикуйте Big O ваших решений, делитесь бенчмарками производительности, предлагайте альтернативные реализации.
Критерии качества: конкретика, аргументация, воспроизводимость.
Вступайте в нашу телеграмм-группу Инфостарт