Представляю curated-подборку алгоритмических кейсов — структурированную коллекцию задач, охватывающую весь спектр сложности от базовых концепций до продвинутых оптимизационных вызовов.
Целевая аудитория: от начинающих разработчиков, осваивающих фундаментальные паттерны, до senior-инженеров, оттачивающих архитектурное мышление на сложных системах.
Ожидаемый outcome: систематизация алгоритмических подходов, поддержание практических навыков кодирования и интеллектуальная разминка через решение нетривиальных задач.
Что было раньше:
В предыдущей части мы решили:
- Circles in Polygons (Круги в многоугольниках)
- The Feast of Many Beasts (Пир множества зверей)
- The Coupon Code (Код купона)
- Always perfect (Всегда идеально)
- Seven "ate" nine! (Семь "съела" девять!)
- Backwards Read Primes (Простые числа с обратным чтением)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Online RPG: player to qualifying stage? (Онлайн-РПГ: игрок проходит отборочный этап?)
Ссылка на задачу: https://www.codewars.com/kata/55849d76acd73f6cc4000087
Сложность: 8 kyu
Уже решили (На момент написания статьи): 14 053 из 25 166
Тэги: Fundamentals
Оригинальное описание задачи:
Let's imagine we have a popular online RPG.
A player begins with a score of 0 in class E5.A1 is the highest level a player can achieve.
Now let's say the players wants to rank up to class E4.To do so the player needs to achieve at least 100 points to enter the qualifying stage.
Write a script that will check to see if the player has achieved at least 100 points in his class. If so, he enters the qualifying stage.
In that case, we return, "Well done! You have advanced to the qualifying stage. Win 2 out of your next 3 games to rank up".
Otherwise return, False/false (according to the language in use).
NOTE
Remember, in C you have to cast your output value to Object type!
Пояснение задачи:
Задача состоит в проверке достижения игроком минимального порога очков (100 единиц), необходимого для перехода в следующий квалификационный этап.
Пояснение: - Игрок изначально находится в классе E5 и имеет начальный счёт 0.
- Чтобы перейти в класс E4, игрок должен набрать минимум 100 очков.
- Если количество набранных очков больше либо равно 100, игрок переходит в следующий этап — «квалификацию». - В случае успешного прохождения квалификации игроку выдаётся сообщение: «Well done! You have advanced to the qualifying stage. Win 2 out of your next 3 games to rank up.»
- Если очки игрока меньше 100, выводится значение `False`, указывающее, что игрок пока не достиг нужного уровня.
Пример работы программы:
Игрок набрал 99 очков → False Игрок набрал 101 очко → Well done! Вы перешли в квалификационный этап.
Победите 2 из следующих 3 игр, чтобы повысить ранг.
Дополнительно:
- В языке "C" результат должен быть приведён к типу `object`, иначе возникнет ошибка компиляции.
Таким образом, задача сводится к простой проверке условия и выдаче соответствующего результата.
Задача 2
Платформа: CodeWars
Название задачи: Get the mean of an array (Получить среднее значение массива)
Ссылка на задачу: https://www.codewars.com/kata/563e320cee5dddcf77000158
Сложность: 8 kyu
Уже решили (На момент написания статьи): 93 703 из 200 213
Тэги: Arrays, Algorithms
Оригинальное описание задачи:
It's the academic year's end, fateful moment of your school report. The averages must be calculated. All the students come to you and entreat you to calculate their average for them. Easy ! You just need to write a script.
Return the average of the given array rounded "down" to its nearest integer.
The array will never be empty.
Пояснение задачи:
Задача заключается в написании программы, рассчитывающей средний балл группы учеников, округлённой вниз до ближайшего целого числа.
Основные моменты:
- Исходный массив содержит оценки учащихся (целые числа).
- Нужно вычислить среднее арифметическое всех оценок.
- Результат округляется вниз до ближайшего целого числа (floor округление).
- Массив всегда содержит хотя бы один элемент.
Пример: Вход: [78, 92, 85, 73]
Выход: 83
Объяснение:
(78 + 92 + 85 + 73) / 4 = 328 / 4 = 82,0 → округляем вниз до 82
Другой пример: Вход: [50, 60, 70, 80, 90] Выход: 69
Объяснение: (50 + 60 + 70 + 80 + 90) / 5 = 350 / 5 = 70 → округляем вниз до 69
Задача 3
Платформа: CodeWars
Название задачи: Two to One (Двое против одного)
Ссылка на задачу: https://www.codewars.com/kata/5656b6906de340bd1b0000ac
Сложность: 7 kyu
Уже решили (На момент написания статьи): 190 000 из 486 807
Тэги: Fundamentals
Оригинальное описание задачи:
Take 2 strings `s1` and `s2` including only letters from `a` to `z`.Return a new "sorted" string (alphabetical ascending), the longest possible, containing distinct letters - each taken only once - coming from s1 or s2.
Examples:
a = "xyaabbbccccdefww"
b = "xxxxyyyyabklmopq"
longest(a, b) -> "abcdefklmopqwxy"
a = "abcdefghijklmnopqrstuvwxyz"
longest(a, a) -> "abcdefghijklmnopqrstuvwxyz"
Пояснение задачи:
Задача состоит в следующем:
Даны две строки s_1 и s_2, состоящие исключительно из строчных букв латинского алфавита от `a` до `z`.
Необходимо:
1. Объединить буквы обеих строк в одну коллекцию (наборы уникальных символов).
2. Отсортировать буквы в алфавитном порядке (по возрастанию).
3. Вернуть итоговую строку, содержащую все уникальные буквы в отсортированном виде.
Примеры:
- Если даны строки:
s_1 = "xyaabbbccccdefww", s_2 = "xxxxyyyyabklmopq"
Результат: `"abcdefklmopqwxy"`
Объяснение:
объединяем буквы обеих строк ('a', 'b', 'c', 'd', 'e', 'f', 'k', 'l', 'm', 'o', 'p', 'q', 'w', 'x', 'y'), удаляем дубликаты и сортируем в алфавитном порядке.
- Если обе строки одинаковы:
s_1 = "abcdefghijklmnopqrstuvwxyz"
s_2 = "abcdefghijklmnopqrstuvwxyz"
Результат: "abcdefghijklmnopqrstuvwxyz"
Все буквы уже уникальны и отсортированы изначально.
Дополнительное пояснение:
При решении задачи важно учесть следующие моменты:
- Буквы берутся только из диапазона строчных латинских букв от `a` до `z`.
- Каждая буква должна встречаться только один раз в итоговом результате.
- Итоговая строка должна быть отсортирована по алфавиту.
- Необходимо эффективно обрабатывать строки, избегая избыточных операций (например, многократного прохода по строкам).
Задача 4
Платформа: CodeWars
Название задачи: Minimum Perimeter of a Rectangle (Минимальный периметр прямоугольника)
Ссылка на задачу: https://www.codewars.com/kata/5826f54cc60c7e5266000baf
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 571 из 5 327
Тэги: Fundamentals, Algorithms
Оригинальное описание задачи:
A rectangle can be defined by two factors:height and width.
Its area is defined as the multiplication of the two: height * width.
Its perimeter is the sum of its four edges: height + height + width + width.
It is possible to create rectangles of the same area but different perimeters.For example, given an area of 45, the possible heights, widths and resultant perimeters would be:
(1, 45) = 92
(9, 5) = 28
(15, 3) = 36
Note that (6, 7.5) has an area of 45 too, but is discarded in this kata because its width is non integral.
The task is to write a function that, given an area as a positive integer, returns the smallest perimeter possible of a rectangle with integral side lengths.
Input range:
1 <= area <= 5 x 10 ^ 10
Пояснение задачи:
Задача состоит в поиске прямоугольника с минимальной возможной периметром, площадь которого равна заданной целочисленной величине.
Пояснение:
Прямоугольник определяется двумя параметрами — высотой и шириной.
Площадь прямоугольника вычисляется как произведение высоты и ширины, периметр — как сумма всех сторон (длина двух вертикальных и двух горизонтальных сторон).
Ключевая особенность данной задачи — необходимость найти такую пару целых чисел (высота и ширина), которые дадут минимальную сумму длин четырёх сторон (периметр).
Для решения важно понимать, что наименьший периметр будет иметь прямоугольник, стороны которого близки друг к другу (чем меньше разница между высотой и шириной, тем меньше периметр).
Например, прямоугольник с площадью 45 имеет несколько возможных комбинаций сторон, среди которых пара (9, 5) даёт минимальный периметр.
Пример:
Для площади 45 возможны следующие комбинации сторон:
- (1, 45) — периметр равен 1+1+45+45=92
- (9, 5) — периметр равен 9+9+5+5=28
- (15, 3) — периметр равен 15+15+3+3=36
Из приведённых вариантов минимальная длина периметра достигается при ширине и высоте, наиболее близких друг к другу, то есть (9, 5).
Ограничения:
- Входное значение — целое число, представляющее собой площадь прямоугольника.
- Входное значение находится в диапазоне от 1 до 5 * 10^{10} (или 982451653 в случае языка C++).
Подход к решению:
Оптимальное решение предполагает перебор всех возможных делителей числа, начиная с наименьших, и проверку, является ли пара делителей прямоугольником с минимальной суммой сторон.
Поскольку произведение двух чисел равно заданной площади, достаточно проверить только делители, меньшие или равные квадратному корню из этой площади. Это позволяет значительно сократить количество проверок.
Задача 5
Платформа: CodeWars
Название задачи: Class conundrum - Bug Fixing #7 (Классовая головоломка - Исправление ошибки #7)
Ссылка на задачу: https://www.codewars.com/kata/55cd4ce59382498cbd000080
Сложность: 7 kyu
Уже решили (На момент написания статьи): 2 370 из 9 336
Тэги: Debugging
Оригинальное описание задачи:
Class conundrum - Bug Fixing #7
Oh no! Timmy's `List` class has broken!Can you help Timmy and fix his class? Timmy has a `List` class he has created, this is used for type strict arrays (which Timmy calls Lists).
When Timmy calls the `count` property of the list it still remains at `0` when adding items.
Also it fails when Timmy tries to chain the adds e.g. myList.add(0).add(1)
Пояснение задачи:
Задача состоит в исправлении ошибок в классе `List`, созданном Тимми, предназначенном для работы с строго типизированными массивами (Timmy называет их списками).
Основные проблемы:
1. Неправильное поведение свойства `count:
- Изначально свойство `count` возвращает неверное значение (`0`), даже после добавления элементов.
2. Ошибка при цепной записи метода `add`:
- Метод `add` должен возвращать объект класса `List` (чтобы обеспечить возможность последовательного вызова методов — цепную запись), однако текущий код возвращает некорректный результат.
Ожидаемое поведение:
- После добавления элементов в список свойство `count` должно корректно отражать количество элементов.
- Методы, вызываемые последовательно друг за другом (цепная запись), должны корректно добавлять элементы и возвращать сам объект списка.
Пример исправления:
Допустим, мы используем JavaScript-подобный синтаксис:
class List {constructor() {this.items = [];} add(item)
{ Добавляем элемент в массив this.items.push(item);
Возвращаем этот же объект списка
return this; get count {Вернуть текущее количество элементов return this.items.length;}
Исправленный пример использования:
const myList = new List(); myList.add(0).add(1);
теперь работает корректно
console.log(myList.count); выведет 2
Пояснение:
- Конструктор инициализирует пустой массив `items`.
- Метод `add` добавляет элемент в конец массива и сразу возвращает ссылку на объект списка, позволяя использовать цепную запись.
- Свойство `count` возвращает длину массива, обеспечивая правильное отображение количества элементов.
Исправив эти ошибки, класс будет вести себя корректно и соответствовать ожиданиям Тимми.
Задача 6
Платформа: CodeWars
Название задачи: Are they the "same"? (Являются ли они "одинаковыми"?)
Ссылка на задачу: https://www.codewars.com/kata/550498447451fbbd7600041c
Сложность: 6 kyu
Уже решили (На момент написания статьи): 112 930 из 2 049 031
Тэги: Fundamentals
Оригинальное описание задачи:
Given two arrays `a` and `b` write a function `comp(a, b)` (or`compSame(a, b)`) that checks whether the two arrays have the "same" elements, with the same "multiplicities" (the multiplicity of a member is the number of times it appears).
"Same" means, here, that the elements in `b` are the elements in `a` squared, regardless of the order.
Examples
Valid arrays
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]
`comp(a, b)` returns true because in `b` 121 is the square of 11, 14641 is the square of 121, 20736 the square of 144, 361 the square of 19, 25921 the square of 161, and so on. It gets obvious if we write `b`'s elements in terms of squares:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [11*11, 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 19*19]
Invalid arrays
If, for example, we change the first number to something else, `comp` is not returning true anymore:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [132, 14641, 20736, 361, 25921, 361, 20736, 361]
`comp(a,b)` returns false because in `b` 132 is not the square of any number of `a`.
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 36100, 25921, 361, 20736, 361]
`comp(a,b)` returns false because in `b` 36100 is not the square of any number of `a`.
Remarks
- `a` or `b` might be `[] or {}` (all languages except R, Shell).
- `a` or `b` might be `nil` or `null` or `None` or `nothing` (except in C++, COBOL, Crystal, D, Dart, Elixir, Fortran, F#, Haskell, Nim, OCaml, Pascal, Perl, PowerShell, Prolog, PureScript, R, Racket, Rust, Shell, Swift).
If `a` or `b` are `nil` (or `null` or `None`, depending on the language), the problem doesn't make sense so return false.
Пояснение задачи:
Задача требует написать функцию сравнения двух массивов чисел — `a` и `b`.
Массивы считаются равными («одинаковыми») в контексте данной задачи, если каждый элемент массива `b` является квадратом соответствующего элемента массива `a`, независимо от порядка следования элементов.
Примеры корректных массивов
Пример 1:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]
Здесь `b` содержит квадраты соответствующих элементов массива `a`: 121 = 11^2, 14641 = 121^2, 20736 = 144^2, 361 = 19^2, 25921 = 161^2, и так далее.
Пример 2:
a = [1, 2, 3, 4, 5]
b = [1, 4, 9, 16, 25]
Здесь каждый элемент массива `b` является квадратом соответствующего элемента массива `a`.
Примеры некорректных массивов
Пример 1:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [132, 14641, 20736, 361, 25921, 361, 20736, 361]
Число 132 не является квадратом ни одного элемента массива `a`.
Пример 2:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 36100, 25921]
Заключение:
Платформа: CodeWars
Название задачи: Online RPG: player to qualifying stage? (Онлайн-РПГ: игрок проходит отборочный этап?)
Ссылка на задачу: https://www.codewars.com/kata/55849d76acd73f6cc4000087
Сложность: 8 kyu
Уже решили (На момент написания статьи): 14 053 из 25 166
Тэги: Fundamentals
Оригинальное описание задачи:
Let's imagine we have a popular online RPG.
A player begins with a score of 0 in class E5.A1 is the highest level a player can achieve.
Now let's say the players wants to rank up to class E4.To do so the player needs to achieve at least 100 points to enter the qualifying stage.
Write a script that will check to see if the player has achieved at least 100 points in his class. If so, he enters the qualifying stage.
In that case, we return, "Well done! You have advanced to the qualifying stage. Win 2 out of your next 3 games to rank up".
Otherwise return, False/false (according to the language in use).
NOTE
Remember, in C you have to cast your output value to Object type!
Пояснение задачи:
Задача состоит в проверке достижения игроком минимального порога очков (100 единиц), необходимого для перехода в следующий квалификационный этап.
Пояснение: - Игрок изначально находится в классе E5 и имеет начальный счёт 0.
- Чтобы перейти в класс E4, игрок должен набрать минимум 100 очков.
- Если количество набранных очков больше либо равно 100, игрок переходит в следующий этап — «квалификацию». - В случае успешного прохождения квалификации игроку выдаётся сообщение: «Well done! You have advanced to the qualifying stage. Win 2 out of your next 3 games to rank up.»
- Если очки игрока меньше 100, выводится значение `False`, указывающее, что игрок пока не достиг нужного уровня.
Пример работы программы:
Игрок набрал 99 очков → False Игрок набрал 101 очко → Well done! Вы перешли в квалификационный этап.
Победите 2 из следующих 3 игр, чтобы повысить ранг.
Дополнительно:
- В языке "C" результат должен быть приведён к типу `object`, иначе возникнет ошибка компиляции.
Таким образом, задача сводится к простой проверке условия и выдаче соответствующего результата.
Платформа: CodeWars
Название задачи: Get the mean of an array (Получить среднее значение массива)
Ссылка на задачу: https://www.codewars.com/kata/563e320cee5dddcf77000158
Сложность: 8 kyu
Уже решили (На момент написания статьи): 93 703 из 200 213
Тэги: Arrays, Algorithms
Оригинальное описание задачи:
It's the academic year's end, fateful moment of your school report. The averages must be calculated. All the students come to you and entreat you to calculate their average for them. Easy ! You just need to write a script.
Return the average of the given array rounded "down" to its nearest integer.
The array will never be empty.
Пояснение задачи:
Задача заключается в написании программы, рассчитывающей средний балл группы учеников, округлённой вниз до ближайшего целого числа.
Основные моменты:
- Исходный массив содержит оценки учащихся (целые числа).
- Нужно вычислить среднее арифметическое всех оценок.
- Результат округляется вниз до ближайшего целого числа (floor округление).
- Массив всегда содержит хотя бы один элемент.
Пример: Вход: [78, 92, 85, 73]
Выход: 83
Объяснение:
(78 + 92 + 85 + 73) / 4 = 328 / 4 = 82,0 → округляем вниз до 82
Другой пример: Вход: [50, 60, 70, 80, 90] Выход: 69
Объяснение: (50 + 60 + 70 + 80 + 90) / 5 = 350 / 5 = 70 → округляем вниз до 69
Платформа: CodeWars
Название задачи: Two to One (Двое против одного)
Ссылка на задачу: https://www.codewars.com/kata/5656b6906de340bd1b0000ac
Сложность: 7 kyu
Уже решили (На момент написания статьи): 190 000 из 486 807
Тэги: Fundamentals
Оригинальное описание задачи:
Take 2 strings `s1` and `s2` including only letters from `a` to `z`.Return a new "sorted" string (alphabetical ascending), the longest possible, containing distinct letters - each taken only once - coming from s1 or s2.
Examples:
a = "xyaabbbccccdefww"
b = "xxxxyyyyabklmopq"
longest(a, b) -> "abcdefklmopqwxy"
a = "abcdefghijklmnopqrstuvwxyz"
longest(a, a) -> "abcdefghijklmnopqrstuvwxyz"
Пояснение задачи:
Задача состоит в следующем:
Даны две строки s_1 и s_2, состоящие исключительно из строчных букв латинского алфавита от `a` до `z`.
Необходимо:
1. Объединить буквы обеих строк в одну коллекцию (наборы уникальных символов).
2. Отсортировать буквы в алфавитном порядке (по возрастанию).
3. Вернуть итоговую строку, содержащую все уникальные буквы в отсортированном виде.
Примеры:
- Если даны строки:
s_1 = "xyaabbbccccdefww", s_2 = "xxxxyyyyabklmopq"
Результат: `"abcdefklmopqwxy"`
Объяснение:
объединяем буквы обеих строк ('a', 'b', 'c', 'd', 'e', 'f', 'k', 'l', 'm', 'o', 'p', 'q', 'w', 'x', 'y'), удаляем дубликаты и сортируем в алфавитном порядке.
- Если обе строки одинаковы:
s_1 = "abcdefghijklmnopqrstuvwxyz"
s_2 = "abcdefghijklmnopqrstuvwxyz"
Результат: "abcdefghijklmnopqrstuvwxyz"
Все буквы уже уникальны и отсортированы изначально.
Дополнительное пояснение:
При решении задачи важно учесть следующие моменты:
- Буквы берутся только из диапазона строчных латинских букв от `a` до `z`.
- Каждая буква должна встречаться только один раз в итоговом результате.
- Итоговая строка должна быть отсортирована по алфавиту.
- Необходимо эффективно обрабатывать строки, избегая избыточных операций (например, многократного прохода по строкам).
Платформа: CodeWars
Название задачи: Minimum Perimeter of a Rectangle (Минимальный периметр прямоугольника)
Ссылка на задачу: https://www.codewars.com/kata/5826f54cc60c7e5266000baf
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 571 из 5 327
Тэги: Fundamentals, Algorithms
Оригинальное описание задачи:
A rectangle can be defined by two factors:height and width.
Its area is defined as the multiplication of the two: height * width.
Its perimeter is the sum of its four edges: height + height + width + width.
It is possible to create rectangles of the same area but different perimeters.For example, given an area of 45, the possible heights, widths and resultant perimeters would be:
(1, 45) = 92
(9, 5) = 28
(15, 3) = 36
Note that (6, 7.5) has an area of 45 too, but is discarded in this kata because its width is non integral.
The task is to write a function that, given an area as a positive integer, returns the smallest perimeter possible of a rectangle with integral side lengths.
Input range:
1 <= area <= 5 x 10 ^ 10
Пояснение задачи:
Задача состоит в поиске прямоугольника с минимальной возможной периметром, площадь которого равна заданной целочисленной величине.
Пояснение:
Прямоугольник определяется двумя параметрами — высотой и шириной.
Площадь прямоугольника вычисляется как произведение высоты и ширины, периметр — как сумма всех сторон (длина двух вертикальных и двух горизонтальных сторон).
Ключевая особенность данной задачи — необходимость найти такую пару целых чисел (высота и ширина), которые дадут минимальную сумму длин четырёх сторон (периметр).
Для решения важно понимать, что наименьший периметр будет иметь прямоугольник, стороны которого близки друг к другу (чем меньше разница между высотой и шириной, тем меньше периметр).
Например, прямоугольник с площадью 45 имеет несколько возможных комбинаций сторон, среди которых пара (9, 5) даёт минимальный периметр.
Пример:
Для площади 45 возможны следующие комбинации сторон:
- (1, 45) — периметр равен 1+1+45+45=92
- (9, 5) — периметр равен 9+9+5+5=28
- (15, 3) — периметр равен 15+15+3+3=36
Из приведённых вариантов минимальная длина периметра достигается при ширине и высоте, наиболее близких друг к другу, то есть (9, 5).
Ограничения:
- Входное значение — целое число, представляющее собой площадь прямоугольника.
- Входное значение находится в диапазоне от 1 до 5 * 10^{10} (или 982451653 в случае языка C++).
Подход к решению:
Оптимальное решение предполагает перебор всех возможных делителей числа, начиная с наименьших, и проверку, является ли пара делителей прямоугольником с минимальной суммой сторон.
Поскольку произведение двух чисел равно заданной площади, достаточно проверить только делители, меньшие или равные квадратному корню из этой площади. Это позволяет значительно сократить количество проверок.
Платформа: CodeWars
Название задачи: Class conundrum - Bug Fixing #7 (Классовая головоломка - Исправление ошибки #7)
Ссылка на задачу: https://www.codewars.com/kata/55cd4ce59382498cbd000080
Сложность: 7 kyu
Уже решили (На момент написания статьи): 2 370 из 9 336
Тэги: Debugging
Оригинальное описание задачи:
Class conundrum - Bug Fixing #7
Oh no! Timmy's `List` class has broken!Can you help Timmy and fix his class? Timmy has a `List` class he has created, this is used for type strict arrays (which Timmy calls Lists).
When Timmy calls the `count` property of the list it still remains at `0` when adding items.
Also it fails when Timmy tries to chain the adds e.g. myList.add(0).add(1)
Пояснение задачи:
Задача состоит в исправлении ошибок в классе `List`, созданном Тимми, предназначенном для работы с строго типизированными массивами (Timmy называет их списками).
Основные проблемы:
1. Неправильное поведение свойства `count:
- Изначально свойство `count` возвращает неверное значение (`0`), даже после добавления элементов.
2. Ошибка при цепной записи метода `add`:
- Метод `add` должен возвращать объект класса `List` (чтобы обеспечить возможность последовательного вызова методов — цепную запись), однако текущий код возвращает некорректный результат.
Ожидаемое поведение:
- После добавления элементов в список свойство `count` должно корректно отражать количество элементов.
- Методы, вызываемые последовательно друг за другом (цепная запись), должны корректно добавлять элементы и возвращать сам объект списка.
Пример исправления:
Допустим, мы используем JavaScript-подобный синтаксис:
class List {constructor() {this.items = [];} add(item)
{ Добавляем элемент в массив this.items.push(item);
Возвращаем этот же объект списка
return this; get count {Вернуть текущее количество элементов return this.items.length;}
Исправленный пример использования:
const myList = new List(); myList.add(0).add(1);
теперь работает корректно
console.log(myList.count); выведет 2
Пояснение:
- Конструктор инициализирует пустой массив `items`.
- Метод `add` добавляет элемент в конец массива и сразу возвращает ссылку на объект списка, позволяя использовать цепную запись.
- Свойство `count` возвращает длину массива, обеспечивая правильное отображение количества элементов.
Исправив эти ошибки, класс будет вести себя корректно и соответствовать ожиданиям Тимми.
Платформа: CodeWars
Название задачи: Are they the "same"? (Являются ли они "одинаковыми"?)
Ссылка на задачу: https://www.codewars.com/kata/550498447451fbbd7600041c
Сложность: 6 kyu
Уже решили (На момент написания статьи): 112 930 из 2 049 031
Тэги: Fundamentals
Оригинальное описание задачи:
Given two arrays `a` and `b` write a function `comp(a, b)` (or`compSame(a, b)`) that checks whether the two arrays have the "same" elements, with the same "multiplicities" (the multiplicity of a member is the number of times it appears).
"Same" means, here, that the elements in `b` are the elements in `a` squared, regardless of the order.
Examples
Valid arrays
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]
`comp(a, b)` returns true because in `b` 121 is the square of 11, 14641 is the square of 121, 20736 the square of 144, 361 the square of 19, 25921 the square of 161, and so on. It gets obvious if we write `b`'s elements in terms of squares:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [11*11, 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 19*19]
Invalid arrays
If, for example, we change the first number to something else, `comp` is not returning true anymore:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [132, 14641, 20736, 361, 25921, 361, 20736, 361]
`comp(a,b)` returns false because in `b` 132 is not the square of any number of `a`.
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 36100, 25921, 361, 20736, 361]
`comp(a,b)` returns false because in `b` 36100 is not the square of any number of `a`.
Remarks
- `a` or `b` might be `[] or {}` (all languages except R, Shell).
- `a` or `b` might be `nil` or `null` or `None` or `nothing` (except in C++, COBOL, Crystal, D, Dart, Elixir, Fortran, F#, Haskell, Nim, OCaml, Pascal, Perl, PowerShell, Prolog, PureScript, R, Racket, Rust, Shell, Swift).
If `a` or `b` are `nil` (or `null` or `None`, depending on the language), the problem doesn't make sense so return false.
Пояснение задачи:
Задача требует написать функцию сравнения двух массивов чисел — `a` и `b`.
Массивы считаются равными («одинаковыми») в контексте данной задачи, если каждый элемент массива `b` является квадратом соответствующего элемента массива `a`, независимо от порядка следования элементов.
Примеры корректных массивов
Пример 1:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]
Здесь `b` содержит квадраты соответствующих элементов массива `a`: 121 = 11^2, 14641 = 121^2, 20736 = 144^2, 361 = 19^2, 25921 = 161^2, и так далее.
Пример 2:
a = [1, 2, 3, 4, 5]
b = [1, 4, 9, 16, 25]
Здесь каждый элемент массива `b` является квадратом соответствующего элемента массива `a`.
Примеры некорректных массивов
Пример 1:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [132, 14641, 20736, 361, 25921, 361, 20736, 361]
Число 132 не является квадратом ни одного элемента массива `a`.
Пример 2:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 36100, 25921]
Алгоритмы + математика = суперсила.
Освоив этот синтез, вы получаете ключ к решению самых сложных технических вызовов. Каждая задача — тренировка для ума, каждый алгоритм — новый инструмент в арсенале.
Не останавливайтесь — мир вычислений ждёт ваших решений!
Вступайте в нашу телеграмм-группу Инфостарт