i153.chayka

Исходный код:

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

Условный оператор

По PEP8 не рекомендуется записывать условие и тело условного оператора в одну строку. Поэтому вместо этого:

if hd > 23 or md > 59 or mt > 59: raise ValueError('invalid time')

Лучше написать вот это:

if hd > 23 or md > 59 or mt > 59: 
    raise ValueError('invalid time')

Да, это увеличивает размер функции на целых 25% :) Зато это улучшает читаемость кода.

Вычисления внутри f-строки

return f'{((hd + ht % 24 + (md + mt) // 60) % 24):02d}:{((md + mt) % 60):02d}'

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

Лучше заранее выполнить вычисления, а f-строку собрать из готовых результатов, например, из переменных minutes и hours.

Имена переменных

hd, mt, md - такие имена часто используют математики-олимпиадники, привыкшие к коротким обозначениям i, j, k. И когда речь идёт об олимпиадных задачах, которые пишутся 1 раз, а затем убираются в архив, то такой подход имеет право на жизнь.

Но если идёт речь о разработке продукта, который впоследствии будет поддерживаться и развиваться, то лучше выбирать более наглядные имена, которые не будут увеличивать когнитивную сложность кода, то есть не будут требовать от программиста дополнительных умственных усилий на то, чтобы вспомнить, что m тут относится к минутам, а d - к departure.

Современные экраны с разрешением 1920х1080 и выше, а также IDE с функциями «найти» и «заменить» позволяют не экономить буквы и использовать наглядные имена для переменных, функций и других объектов.

Итоговый код