За сколько мама и сын вместе помоют кухню, если мама моет за 30 минут, а сын за 60 минут
Что проверяют
Это разминка на логику: умеете ли вы перейти от времени к скорости работы и проверить ответ здравым смыслом. На Python-собеседовании следом обычно просят написать функцию для N участников или спрашивают, как эта модель связана с параллельной обработкой.
Как отвечать
Время складывать нельзя, складываются скорости:
- скорость мамы: 1/30 кухни в минуту;
- скорость сына: 1/60 кухни в минуту;
- вместе: 1/30 + 1/60 = 3/60 = 1/20 кухни в минуту;
- время: 1 / (1/20) = 20 минут.
Для двух участников есть готовая формула t = a·b / (a + b) = 30·60 / 90 = 20.
Сразу проверьте ответ на правдоподобие, это ценят. Вдвоём должно выйти быстрее, чем у самого быстрого, то есть меньше 30. И медленнее, чем у двух мам, то есть не меньше 15. Двадцать укладывается.
Обобщение в коде:
def together(*minutes):
return 1 / sum(1 / m for m in minutes)Обсудите края: пустой вызов, ноль и отрицательные значения стоит отсечь явной проверкой. На float результат бывает с хвостом: для 10 и 15 минут получится 5.999999999999999 вместо 6, поэтому для точного ответа подойдёт fractions.Fraction.
Если спросят про параллельность, скажите, что задача описывает идеальный случай: работа делится без остатка, участники не мешают друг другу, накладных расходов нет. В реальном коде есть последовательные участки (их вклад описывает закон Амдала) и расходы на координацию. В CPython по умолчанию GIL не даёт потокам одновременно выполнять байткод, поэтому счётную работу отдают процессам (ProcessPoolExecutor), а потоки берут для ожидания ввода-вывода.
Где спотыкаются
Усредняют время и отвечают 45 минут. Это дольше, чем мама справится одна, что сразу выдаёт ошибку.
Называют 20 без хода решения. Интервьюеру важен переход к скоростям, а не число.
В коде пишут // и получают 0 на 1 // 30, или не обрабатывают деление на ноль.