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