Add: add 5th day solutions
This commit is contained in:
parent
fe0c5c6e87
commit
1c2e01a4c8
5 changed files with 1301 additions and 0 deletions
6
python/src/5-day/README.md
Normal file
6
python/src/5-day/README.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
# Описание
|
||||
* У Эльфов в столовой крайне сомнительная база данных. В ней хранятся: построчно диапазоны ID всех свежих продуктов (min_id-max_id), пустая строчка, построно ID всех имеющихся в наличии продуктов.
|
||||
|
||||
* Для первой части: найти кол-во всех имеющихся в наличии продуктов, которые являются свежими.
|
||||
|
||||
* Для второй части: найти кол-во всех уникальных ID продуктов из диапазонов, которые в являются свежими. На вторую часть БД можно забить, работаем только с первой частью.
|
||||
1187
python/src/5-day/input.txt
Normal file
1187
python/src/5-day/input.txt
Normal file
File diff suppressed because it is too large
Load diff
36
python/src/5-day/solution1.py
Normal file
36
python/src/5-day/solution1.py
Normal 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)
|
||||
61
python/src/5-day/solution2.py
Normal file
61
python/src/5-day/solution2.py
Normal 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)
|
||||
11
python/src/5-day/test_input.txt
Normal file
11
python/src/5-day/test_input.txt
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
3-5
|
||||
10-14
|
||||
16-20
|
||||
12-18
|
||||
|
||||
1
|
||||
5
|
||||
8
|
||||
11
|
||||
17
|
||||
32
|
||||
Loading…
Add table
Add a link
Reference in a new issue