Browse Source

Рефакторинг

master
Дмитрий 3 years ago
parent
commit
6ef387ea81
  1. 4
      readme.org
  2. 2
      task_2.py
  3. 33
      task_3.py

4
readme.org

@ -27,7 +27,7 @@ print(task("111111111110000000000000000"))
# -1
#+end_src
Бонусом идет проверка валидности всей строки: если она не состоит только из 1 и 0, то программа вернет ошибку.
Бонусом идет проверка валидности всей строки: если она состоит не только из 1 и 0, то программа вернет ошибку.
* Задача №2
@ -95,7 +95,7 @@ tutor – интервалы присутствия учителя
#+end_src
** Решение
Задача на пересечение интервалов. Решал накладывая интервалы последовательно на ранее полученные пересечения. Входящие интервалы нормализовал (почистил от повторов и включенных интервалов, расширил пересекающиеся интервалы).
Задача на пересечение интервалов. Решал, последовательно накладывая интервалы на ранее полученные пересечения. Входящие интервалы нормализовал (почистил от повторов и включенных интервалов, расширил пересекающиеся интервалы).
Запустить решение можно командой:
#+begin_src python

2
task_2.py

@ -16,7 +16,7 @@ def get_all_titles_from_category(category: str) -> list:
return names
# get_counted_dict_with_first_letters
# get_counted_dict_by_first_letters
def get_count_list_by_first_letter(names: list) -> dict:
"""Получить словарь из первых букв и их количества для каждого
элемента в `names`.

33
task_3.py

@ -1,4 +1,4 @@
"""Задание на расчет интервалов, и вычисление времени, который ученик
"""Задание на расчет интервалов, и вычисление времени, которое ученик
и учитель присуствовали на уроке одновременно."""
tests = [
@ -74,7 +74,7 @@ tests = [
def get_smaller_interval(interval_A, interval_B) -> list:
"""Если один из интервалов включает в себя другой, возвращаем
меньший. Если интервалы не входят друг в дргуа, возвращаем пустой
меньший. Если интервалы не входят друг в друга, возвращаем пустой
интервал."""
if interval_A[0] <= interval_B[0] and interval_A[1] >= interval_B[1]:
return interval_B
@ -85,7 +85,6 @@ def get_smaller_interval(interval_A, interval_B) -> list:
return []
# get_intervals_without_small_included_intervals
def absorb_small_included_intervals(intervals: list) -> list:
"""Возвращает список интервалов без вложенных интервалов.
@ -94,7 +93,7 @@ def absorb_small_included_intervals(intervals: list) -> list:
Стоит учитывать, что функция работает только если интервалы
совпадают по началу или концу, если интервалы входят друг в друга
частично -- мы их не обрабатываем.
частично (пересекаются) -- здесь мы их не обрабатываем.
"""
# формируем список из меньших интервалов, входящих в бОльшие
@ -116,16 +115,12 @@ def absorb_small_included_intervals(intervals: list) -> list:
def get_union_of_partly_intersecting_intervals(interval_A, interval_B) -> list:
"""Если интервалы А и Б пересекаются, то возвращаем новый
интервал, включающий А и Б."""
# планирую поступать по тому же принципу что и выше: добавлять
# сумму в исходный список, итого получим список с пересечениями,
# который потом можно прогнать через поглатитель меньших
# интервалов
# если один из интервалов пустой, то пересечение будет пустым
if not interval_A or not interval_B:
return []
# если какой-то из инетрвалов имеет нулевую длину (начало=конец),
# если какой-то из интервалов имеет нулевую длину (начало=конец),
# то пересечение пустое
if interval_A[0] == interval_A[1] or interval_B[0] == interval_B[1]:
return []
@ -136,7 +131,7 @@ def get_union_of_partly_intersecting_intervals(interval_A, interval_B) -> list:
if interval_A[0] > interval_B[1] or interval_B[0] > interval_A[1]:
return []
# сумма интервалов: наименьшее начало из А и Б, и наибольший конец
# сумма интервалов: берем наименьшее начало из А и Б, и наибольший конец
# из А и Б
interval_begin = min(interval_A[0], interval_B[0])
interval_end = max(interval_A[1], interval_B[1])
@ -146,8 +141,8 @@ def get_union_of_partly_intersecting_intervals(interval_A, interval_B) -> list:
def get_extended_intervals(intervals) -> list:
"""Возвращает расширенные интервалы из списка интервалов.
Расширенный интервал, это интервал, который есть сумма двух
пересекающихся инетрвалов."""
Расширенный интервал -- это интервал, который есть сумма двух
пересекающихся интервалов."""
extended_intervals = [
get_union_of_partly_intersecting_intervals(interval, intervals[k])
for i, interval in enumerate(intervals)
@ -157,12 +152,16 @@ def get_extended_intervals(intervals) -> list:
# список extended_intervals может содержать дублирующиеся
# интервалы из списка intervals, поэтому мы возвращаем только
# отсутствующие в intevals значения
# отсутствующие в intervals значения
uniq_extended_intervals = [i for i in extended_intervals if i not in intervals]
return uniq_extended_intervals
def get_intersection(interval_A, interval_B) -> list:
"""Возвращает пересечение двух интервалов.
Пересечение двух интервалов -- это наибольшее из начал A и B, и
наименьшее из концов A и B."""
# если один из интервалов пустой, то пересечение будет пустым
if not interval_A or not interval_B:
return []
@ -178,7 +177,7 @@ def get_intersection(interval_A, interval_B) -> list:
if interval_A[0] > interval_B[1] or interval_B[0] > interval_A[1]:
return []
# начало интервала это наименьший из начал интервалов А и Б
# начало интервала это наименьшее из начал интервалов А и Б
# конец интервала это наименьший из концов интервалов А и Б
interval_begin = max(interval_A[0], interval_B[0])
interval_end = min(interval_A[1], interval_B[1])
@ -218,8 +217,10 @@ def appearance(intervals) -> int:
get_intersection(pol, t) for t in tutor for pol in pupil_on_lesson
]
# создаем список из продолжительности каждого интервала, если он
# не пустой, а затем суммируем все элементы
# на данном этапе мы уже имеем интересующие нас интервалы
# (пересечение ученик-учитель-урок); остается узнать
# продолжительность каждого из этих интервалов в секундах и
# сложить их.
answer = sum([intr[1] - intr[0] for intr in tutor_on_pupil if intr])
return answer

Loading…
Cancel
Save