Add: add 5th day solutions

This commit is contained in:
Kirill Samoylenkov 2025-12-05 11:40:29 +05:00
parent fe0c5c6e87
commit 1c2e01a4c8
5 changed files with 1301 additions and 0 deletions

View file

@ -0,0 +1,6 @@
# Описание
* У Эльфов в столовой крайне сомнительная база данных. В ней хранятся: построчно диапазоны ID всех свежих продуктов (min_id-max_id), пустая строчка, построно ID всех имеющихся в наличии продуктов.
* Для первой части: найти кол-во всех имеющихся в наличии продуктов, которые являются свежими.
* Для второй части: найти кол-во всех уникальных ID продуктов из диапазонов, которые в являются свежими. На вторую часть БД можно забить, работаем только с первой частью.

1187
python/src/5-day/input.txt Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,36 @@
with open("./src/5-day/input.txt") as file:
data = file.readlines()
# Формируем списки всех диапазонов, сохраняя мин. и макс. в этом диапазоне,
# а также список всех имеющихся продуктов
ranges = list()
ingr_to_check = list()
for row in data:
row = row.strip()
# Если в строчке 1 число, то это имеющихся продукт
if row.isdigit():
ingr_to_check.append(int(row))
continue
# Пропускаем пустую строчку
if row == "":
continue
# В остальных случаях перед нами диапазон, добавляем его концы
ranges.append(list(map(int, row.split("-"))))
# Считаем кол-во имеющихся свежих продуктов
fresh_cnt = 0
# Перебираем все имеющиеся продукты
for ingr in ingr_to_check:
for min_id, max_id in ranges:
# Если они входят в какой-то диапазон - увеличиваем счетчик
# и выходим из цикла
if min_id <= ingr <= max_id:
fresh_cnt += 1
break
print(fresh_cnt)

View file

@ -0,0 +1,61 @@
with open("./src/5-day/input.txt") as file:
data = file.readlines()
# Формируем списки всех диапазонов, сохраняя мин. и макс. в этом диапазоне,
# а также список всех имеющихся продуктов
ranges = list()
ingr_to_check = list()
for row in data:
row = row.strip()
# Если в строчке 1 число, то это имеющихся продукт
if row.isdigit():
ingr_to_check.append(int(row))
continue
# Пропускаем пустую строчку
if row == "":
continue
# В остальных случаях перед нами диапазон, добавляем его концы
ranges.append(list(map(int, row.split("-"))))
# Сортируем список диапазонов, чтобы минимальные значения в них стояли
# по возрастанию
ranges.sort(key=lambda x: x[0])
# Счетчик для кол-ва свежих продуктов из диапазонов
fresh_cnt = 0
# Указатели на концы первого диапазона
# Нужны для объединения нескольких диапазонов при их пересечении
left, right = ranges.pop(0)
# Прохоидимся по концам остальных диапазонов
for min_id, max_id in ranges:
# Если меньший конец текущего диапазона больше чем правый указатель
# значит диапазоны различны.
# Сохраняем кол-во элементов в диапазоне, на который ссылались
# указатели и переставляем их на текущий диапазон
if min_id > right:
fresh_cnt += right - left + 1
left = min_id
right = max_id
# В случае если первое условие не сработало, мы имеем дело
# с пересечением диапазонов.
# Проверяем больше ли наибольший конец текущего диапазона чем указатель
# И если да, то переставляем его. Так мы объединяем два диапазона
elif max_id > right:
right = max_id
# Не забываем, что мы еще не добавили элементы последнего диапазона,
# Так как в коде мы всегда добавляем лишь элементы предыдущего диапазона
# что видно в условии `if min_id > right`
# А значит добавляем и элементы этого последнего диапазона
fresh_cnt += right - left + 1
# Ответ готов!
print(fresh_cnt)

View file

@ -0,0 +1,11 @@
3-5
10-14
16-20
12-18
1
5
8
11
17
32