Новый сборник задач по программированию

06.04.26

Разработка - Математика и алгоритмы

Собрал для Вас список новых задач по программированию!

Сборник представляет собой подборку алгоритмических вызовов различной степени сложности — от базовых для новичков до продвинутых для опытных инженеров. Ключевая задача — глубокое погружение в алгоритмическое мышление, оттачивание мастерства в создании оптимального и поддерживаемого кода, а также захватывающий процесс решения нетривиальных интеллектуальных задач.


Раннее:

В предыдущей части мы решили:


 Новые задачи:

 
 Первая задача 

 Название: How Many Lonely Letters? (Сколько одиноких писем?)

 Ссылка: https://www.codewars.com/kata/69cda5b85599f307742ce70a

 Сложность: 7 kyu

 Уже решили (На момент написания статьи): 43 из 131

 ТэгиStrings, Fundamentals, Algorithms

 Оригинальное описание:

Task Write a function `countLonelyLetters(text)` that counts how many letters in a string are lonely.

A letter is lonely when:

1. It appears exactly once in the whole string.
2. Its alphabetical neighbors are both absent from the string.

For example:
- `d` is not lonely if `c` or `e` also appears somewhere in the text.
- `m` is lonely if `l`, `m`, and `n` are handled like this:
- `m` appears once
- `l` does not appear
- `n` does not appear

Rules
- Ignore letter case.
- Ignore all non-letter characters.
- Work only with English letters `a-z`.

Examples:

countLonelyLetters("ad") //2
countLonelyLetters("abc") // 0
countLonelyLetters("Hello, World!") //3
countLonelyLetters("A-dA") // 1
countLonelyLetters("zz") // 0

Объяснение:

Функция `countLonelyLetters должна посчитать количество букв, которые одновременно:
- встречаются ровно один раз в строке,
- отсутствуют оба соседних символа в алфавитном порядке.

Алгоритм работы функции:
1. Преобразуем строку в нижний регистр, чтобы игнорировать регистр символов.
2. Удаляем все символы, кроме английских букв (`a-z`), оставляя только буквы.
3. Для каждой буквы проверяем следующие условия:

- Буква встречается ровно один раз в строке.
- Буквы, стоящие слева и справа от неё в алфавите, отсутствуют в строке.
Например, буква `m` будет считаться одинокой, если в строке нет букв `l` и `n`.

Пример пошагового рассмотрения строки:
Пусть дана строка "Hello, World!"
- Приведём строку к нижнему регистру: "hello world"
- Очистим строку от знаков препинания и пробелов: "helloworld"
- Перебираем каждую букву:
- h: соседние буквы `g` и `i` присутствуют, значит буква не одинокая.
- e: соседи `d` и `f` присутствуют, буква не одинокая.
- l: соседи `k` и `m` отсутствуют, буква одинокая.
- l: соседние буквы уже проверялись, пропускаем.
- o: соседи `p` и `q` присутствуют, буква не одинокая.
- w: соседи `v` и `x` отсутствуют, буква одинокая.
- r: соседи `q` и `s` присутствуют, буква не одинокая.
- d: соседи `c` и `e` присутствуют, буква не одинокая.

Таким образом, в строке две одиночные буквы: `l` и `w`.
 
 Вторая задача 

 Название: Sort by binary ones (Сортировка по двоичным единицам)

 Ссылка: https://www.codewars.com/kata/59eb28fb0a2bffafbb0000d6

 Сложность: 7 kyu

 Уже решили (На момент написания статьи): 1 302 из 6 581

 ТэгиArrays, Lists, Algorithms, Sorting, Binary, Bits

 Оригинальное описание:

In this example, you need to implement a function that sorts a list of integers based on their binary representation.

The rules are simple:
1. sort the list based on the amount of `1`s in the binary representation of each number.
2. if two numbers have the same amount of `1`s, the shorter string goes first. (ex: "11" goes before "101" when sorting 3 and 5 respectively)
3. if the strings have the same length, lower decimal number goes first. (ex: 21 = "10101" and 25 = "11001", then 21 goes first as it's lower)

Examples:
- Input: [1,15,5,7,3]
- ( in binary strings is: ["1", "1111", "101", "111", "11"])

- Output: [15, 7, 3, 5, 1]
- (and after _sortByBinaryOnes_ is: ["1111", "111", "11", "101", "1"])

Объяснение:

Задача требует реализовать функцию сортировки списка целых чисел, основанную на количестве единиц («единиц») в двоичном представлении каждого числа.

 Основные правила сортировки:

1. Сортировка по количеству единиц: сначала сортируем числа по количеству единиц в их двоичной записи. Число с меньшим количеством единиц должно идти раньше.
   

Пример:
 
   [1, 15, 5, 7, 3]
   Двоичные представления: ["1", "1111", "101", "111", "11"]
   Сортировка по количеству единиц даст: [15, 7, 3, 5, 1]


2. При равенстве количества единиц:
   - Если два числа имеют одинаковое количество единиц, сортируем по длине строки двоичного представления. Короткая строка идёт первой.
   
   Пример:
   
   21 (10101) и 25 (11001)
   Количество единиц одинаково (5), но длина строки разная: "10101" короче, значит оно идёт первым.
   

3. При совпадении длины строки:
   - Если длина строк одинакова, сортируем по числовому значению самого числа. Меньшее число идёт раньше.
   
   Пример:

   19 (10011) и 23 (10111)
   Оба числа имеют длину 5, но 19 меньше, значит оно идёт первым.


 Алгоритм решения:

1. Преобразуем каждое число в строку его двоичного представления.
2. Для каждой строки считаем количество единиц.
3. Сортируем список по трём критериям:
   - Сначала по количеству единиц.
   - Затем по длине строки (если количество единиц совпадает).
   - Наконец, по числовому значению числа (если оба предыдущих критерия совпадают).

Пример:

Вход: [1, 15, 5, 7, 3]
Двоичные представления: ["1", "1111", "101", "111", "11"]
Сортировка:
- 15 → "1111"
- 7 → "111"
- 3 → "11"
- 5 → "101"
- 1 → "1"

 
 Третья задача 

 Название Easy wallpaper (Простые обои)

 Ссылка: https://www.codewars.com/kata/567501aec64b81e252000003

 Сложность: 7 kyu

 Уже решили (На момент написания статьи): 7 603 из 50 074

 ТэгиFundamentals

 Оригинальное описание:

John wants to decorate the walls of a room with wallpaper. He wants a fool-proof method for getting it right.

John knows that the rectangular room has a length of `l` meters, a width of `w` meters, a height of `h` meters.
The standard width of the rolls he wants to buy is `52` centimeters.
The length of a roll is `10` meters.
He bears in mind however, that it’s best to have an extra length of wallpaper handy in case of mistakes or miscalculations so he wants to buy a length 15% greater than the one he needs.

Last time he did these calculations he got a headache, so could you help John?

Task
Your function `wallpaper(l, w, h)` should return as a plain English word in lower case the number of rolls he must buy.

Example:
`wallpaper(4.0, 3.5, 3.0) should return "ten"`
`wallpaper(0.0, 3.5, 3.0) should return "zero"`

Notes:
- all rolls (even with incomplete width) are put edge to edge
- 0 <= l, w, h (floating numbers); it can happens that `w * h * l` is zero
- the integer `r` (number of rolls) will always be less or equal to 20
- FORTH: the number of rolls will be a *positive or null integer* (not a plain English word; this number can be greater than 20)
- In Coffeescript, Javascript, Python, Ruby and Scala the English numbers are preloaded and can be accessed as:
numbers= ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve","thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"]
- For other languages it is not preloaded and you can instead copy the above list if you desire.

Объяснение:

Задача состоит в том, чтобы помочь Джону рассчитать необходимое количество рулонов обоев для оклейки стен комнаты, учитывая особенности выбора ширины рулона и запас длины.

Основные условия задачи:
- Даны размеры комнаты: длина (`l`), ширина (`w`) и высота (`h`).
- Стандартная ширина рулона обоев составляет 52 см, что эквивалентно 0.52 метра.
- Длина рулона — 10 метров.
- Для удобства и учёта возможных ошибок Джон хочет приобрести обои длиной на 15% больше, чем реально потребуется.
- Рулоны укладываются друг рядом с другом по ширине, и остаток ширины рулона учитывается при подсчёте необходимого количества рулонов.

Подход к решению:
1. Вычисляем общую площадь стен:
Площадь стен рассчитывается как сумма площадей четырёх стен: две стены длиной `l`, две стены шириной `w`.
Формула площади одной стены:
{Площадь стены} ={длина} * {высота}
Таким образом, общая площадь стен:
{Общая площадь} = 2 * (l * h) + 2 * (w * h)

2. Переводим ширину рулона в метры и округляем вверх:
Поскольку ширина рулона дана в сантиметрах, переводим её в метры и округляем до ближайшего целого числа метров (так как рулон укладывается целиком).
Округление вверх позволяет учесть возможную неполную ширину рулона.

3. Рассчитываем длину обоев, необходимую с учётом запаса:
Общая длина обоев, необходимая для покрытия стен, умножается на коэффициент запаса (115%, или 1.15).

4. Определяем количество рулонов:
Количество рулонов равно целой части от деления общей необходимой длины обоев на длину одного рулона.
Если остаток после деления есть, добавляем ещё один рулон.

Пример расчёта:
Для комнаты размером `4.0 м × 3.5 м × 3.0 м`: - Общая площадь стен: 2 * (4.0 * 3.0) + 2 * (3.5 * 3.0) = 24 + 21 = 45 \{кв. м}
 
 Четвертая задача

 Название: Speed Control (Контроль скорости)

 Ссылка: https://www.codewars.com/kata/56484848ba95170a8000004d

 Сложность: 7 kyu

 Уже решили (На момент написания статьи): 17 080 из 86 979

 ТэгиFundamentals, Mathematics

 Оригинальное описание:

In John's car the GPS records every `s` seconds the distance travelled from an origin (distances are measured in an arbitrary but consistent unit).
For example, below is part of a record with `s = 15`: x = [0.0, 0.19, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25]
The sections are: 0.0-0.19, 0.19-0.5, 0.5-0.75, 0.75-1.0, 1.0-1.25, 1.25-1.50, 1.5-1.75, 1.75-2.0, 2.0-2.25
We can calculate John's average hourly speed on every section and we get: [45.6, 74.4, 60.0, 60.0, 60.0, 60.0, 60.0, 60.0, 60.0]
Given `s` and `x` the task is to return as an integer the "floor" of the maximum average speed per hour obtained on the sections of `x`. If x length is less than or equal to 1 return `0` since the car didn't move.

Example:
With the above data your function `gps(s, x)` should return `74` Note With floats it can happen that results depends on the operations order. To calculate hourly speed you can use: ` (3600 * delta_distance) / s`.
Happy coding!

Объяснение:

Задача состоит в следующем:

Нам даны интервалы перемещения автомобиля, измеренные через равные промежутки времени (`s` секунд), и соответствующие расстояния от начальной точки (`x`). Требуется вычислить максимальную скорость движения автомобиля за час на каждом временном интервале, округлив её вниз до ближайшего целого числа.

Алгоритм решения включает следующие шаги:

1. Проверка корректности входных данных: 
   Если длина массива расстояний меньше или равна единице, автомобиль не двигался, возвращаем 0.

2. Вычисление скорости на каждом интервале:  
   Для каждого временного интервала длиной `s` секунд рассчитываем пройденное расстояние между двумя последовательными точками. Затем вычисляем среднюю скорость на данном интервале в километрах в час, используя формулу:
   
3. Поиск максимальной скорости:  
   Из скоростей на всех интервалах выбираем наибольшую и округляем её вниз до целого числа.

 Пример:

Для входных данных:

s = 15
x = [0.0, 0.19, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25]

Интервалы:

- 0.0–0.19
- 0.19–0.5
- 0.5–0.75
- 0.75–1.0
- 1.0–1.25
- 1.25–1.5
- 1.5–1.75
- 1.75–2.0
- 2.0–2.25

Расчёт скоростей:

- Первый интервал: (0.19 - 0.0) / 15 * 3600 = 45.6
- Второй интервал: (0.5 - 0.19) / 15 * 3600 = 74.4
- Третий интервал: (0.75 - 0.5) / 15 * 3600 = 60

 
 Пятая задача 

Название: Count the Digit (Подсчитать цифру)

 Ссылка: https://www.codewars.com/kata/566fc12495810954b1000030

 Сложность: 7 kyu

 Уже решили (На момент написания статьи): 52 744 из 156 324

 ТэгиFundamentals

 Оригинальное описание:

Take an integer `n (n >= 0)` and a digit `d (0 <= d <= 9)` as an integer.
Square all numbers `k (0 <= k <= n)` between 0 and n. Count the numbers of digits `d` used in the writing of all the `k**2`. Implement the function taking `n` and `d` as parameters and returning this count.

Examples:
n = 10, d = 1 the k*k are 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
We are using the digit 1 in: 1, 16, 81, 100.
The total count is then 4.

The function, when given n = 25 and d = 1 as argument, should return 11 since the k*k that contain the digit 1 are: 1, 16, 81, 100, 121, 144, 169, 196, 361, 441.

So there are 11 digits 1 for the squares of numbers between 0 and 25.
Note that `121` has twice the digit 1.

Объяснение:

Задача состоит в следующем: Нам даны два параметра — целое число "n" и цифра "d" (от 0 до 9).
Необходимо вычислить, сколько раз цифра "d" встречается во всех квадратах чисел от 0 до "n".
То есть, требуется подсчитать количество цифр "d", встречающихся в записи квадратов чисел "k^2", где "k"пробегает значения от 0 до "n".

Пример:

Для "n"=10 и "d"=1: 0^2 = 0 1^2 = 1 2^2 = 4 3^2 = 9 4^2 = 16 5^2 = 25 6^2 = 36 7^2 = 49 8^2 = 64 9^2 = 81 10^2 = 100
Цифра 1 встречается в числах 1, 16, 81, 100, всего четыре раза.

Подход к решению:
Подход к решению основан на последовательном переборе всех чисел от 0 до "n", вычислении их квадратов и подсчёте количества нужных нам цифр "d" в каждой строке.

Основные шаги:
1. Перебираем числа "k"от 0 до "n".
2. Для каждого числа "k" находим его квадрат "k^2".
3. Преобразуем квадрат в строку и считаем количество нужной цифры "d".
4. Суммируем найденное количество для всех квадратов.

Примеры: - "n"= 10, "d" = 1 → результат: 4 - "n" = 25, "d" = 1 → результат: 11

Важные моменты:
- Квадраты чисел, оканчивающиеся на 0, содержат цифру 0 только в случае самого числа 0.
- Если квадрат содержит несколько одинаковых цифр "d", каждая такая цифра учитывается отдельно.
Таким образом, задача сводится к простой проверке наличия цифры "d" в каждом квадрате числа и суммированию результатов.

Итоги:

Благодарим за ваше внимание и погружение в мир алгоритмических испытаний. Эта подборка завершается, но каждое ваше решение и комментарий остаются для нас и сообщества источником мотивации и роста.

Ваши идеи и критика — важнейшая часть процесса, делающая контент глубже и полезнее для всех энтузиастов задач.

Ждём новых встреч, где вас ждут более сложные вызовы, интересные направления и открытия.

Обещаем держать высокую планку, удивлять и вдохновлять!

Вступайте в нашу телеграмм-группу Инфостарт

Алгоритмы Математика CodeWars LeetCode Задачи

См. также

Математика и алгоритмы Программист 1С 8.3 Абонемент ($m)

Данная внешняя обработка для платформы 1С:Предприятие реализует усовершенствованный алгоритм Левенштейна для вычисления схожести строк с учетом различных лингвистических особенностей русского языка. В отличие от классической реализации, этот алгоритм учитывает фонетические, визуальные и контекстные особенности набора текста.

1 стартмани

07.11.2025    5259    14    InFlach    17    

27

Математика и алгоритмы Запросы Программист 1С:Предприятие 8 Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    5431    ivanov660    9    

24

Математика и алгоритмы Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    13467    stopa85    12    

43

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    21316    user1959478    57    

40

Математика и алгоритмы Разное 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    12745    maksa2005    8    

27

Математика и алгоритмы Инструментарий разработчика Программист 1С:Предприятие 8 Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    22079    11    SpaceOfMyHead    20    

65

Математика и алгоритмы Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    14410    RustIG    9    

30

Механизмы платформы 1С Математика и алгоритмы Программист 1С:Предприятие 8 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    13457    gzharkoj    15    

27
Для отправки сообщения требуется регистрация/авторизация