Пятничная статья про столкновение задачи из собеседования с реальным миром.
Есть довольна известная задача — перед вами находится металлическая труба с текущей внутри водой. Как определить в какую сторону она течёт? Её всё ещё могут задать вам на собеседованиях.
По многим задачам с неточной формулировкой уже проходились, давайте разберёмся что же не так с этой трубой.
Ожидаемое решение — нагреть трубу и посмотреть, в какую сторону будет распространяться тепло. Но тут есть много дополнительных нюансов. Как правило подразумевается, что греть будут газовой горелкой. Встречалось даже ограничение, что у вас может быть любой предмет ценой до ста рублей, что делает задачу практически нерешаемой таким способом, но об этом позже.
Во-первых, надо быть уверенным, что температура воды достаточно низка, чтобы её можно было трогать. Ну, точнее, чтобы можно было понять разницу между «очень горячо» и «очень-очень горячо». Точно сказать сложно, но вряд ли это выше 50 градусов Цельсия.
Во-вторых, надо быть уверенным, что вода течёт со скоростью значительно большей скорости распространения тепла в воде. Например, при скорости потока 1мм/с вы вряд ли поймёте куда вода движется и движется ли вообще.
В-третьих, надо быть уверенным что вода не течёт со слишком большой скоростью. Иначе она просто не успеет достаточно прогреться.
Температурная чувствительность человека к разницам температур составляет примерно один градус. Исходя из теплоёмкости воды ~4,2 кДж/кг получим, что на грамм протекающей воды мы должны передать в районе 4,2 Джоуля чтобы иметь возможность ощутить разницу температур.
Предположим, что подогревая трубу какой-то горелкой мы передаём трубе примерно половину теплоты сгораемого топлива. Это достаточно щедрое предположение, например хорошие газовые котлы имеют КПД в районе 95%.
Скорость потока в обычном холодном водоснабжении составляет примерно 1м/с. Для обычной трубы 1/2", скажем в ванной, это даст расход примерно 200 г/с. Будем опираться на эти цифры чтобы иметь представление о том, какого размера должна быть труба, чтобы при привычной скорости потока мы могли определить его направление.
Зайдём с козырей. Предположим, что для рещения задачи у вас есть хорошая сварочная горелка, ацетилен и кислород. Расход горелки примерно килограмм ацетилена в час, теплота сгорания примерно 50МДж/кг. Соответственно в секунду получим примерно 13888 Дж, с учётом низкого КПД трубе передастся примерно 7000 из них. В принципе можно прогреть на градус трубу с проходом 1.7 кг воды в секунду.
Ну… Решение вроде работает. Но давайте признаем, что большинство программистов никогда не держали в руках сварочную аппаратуру. И глядя на архитектуру некоторых приложений — это к лучшему. Пусть в качестве нагревательного прибора используется обычная газовая горелка со сменным балоном, вроде той что используется для розжига кальянного угля. Расход газа составляет примерно 100 г/час. Для простоты расчёта возьмём теплоту сгорания пропана такой же, то есть 50МДж. В секунду мы сможем получить 700 Дж. Этого хватит для нагрева 170 грамм воды.
Выглядит уже не так перспективно. Если на дальний конец этой таинственной трубы надет шланг и моя бабушка и поливает из него помидоры, то есть поток жидкости по трубе практически не ограничен, то понять направления потока мы уже не сможем. Бабуле придётся слегка зажимать шланг пальцем чтобы задача стала решаемой.
Вообще в условии подразумевалось, что смышлёный соискатель возьмёт зажигалку и нагреет трубу. Я нигде не смог найти нормы расхода газа для зажигалок. Вероятно, проводить подобные изменения никому в голову не пришло.
Возьмём данные по газовым паяльникам. Определённо, это более мощный прибор чем зажигалка, но примем эти цифры для расчёта. Газовый паяльник потребляет примерно 20 мл/час, то есть примерно 10 г/час. Значит с его помощью мы сможем нагревать на один градус примерно 17 грам воды в секунду.
17 г/с это очень немного. Для такого расхода к трубе должен быть подключен весьма скромный потребитель, например автомат для газировки. Причём это не тот автомат как в торговом центре — пять секунд и поллитровый стакан готов. Это автомат, который наливает стакан очень медленно, с приличествующей случаю торжественностью.
Суммируя всё вышесказанное, задачу нужно было бы поставить следующим образом:
Вы находитесь в бесконечном поле. Перед вами металлическая труба толщиной не более стандартной водопроводнной. В ней течёт вода, температуры не выше 50 градусов Цельсия, со скоростью не более 1 м/с и не менее 1мм/с. Начала и конца этой трубы вы достигнуть не сможете. Какой предмет вам потребуется для определения направления движения жидкости?
Звучит довольно глупо. И это мы ещё опустили совсем уж дурацкие уточнения вроде того, что труба не сделана из галлия, температура вокруг не -190, атмосфера не состоит из гремучего газа или вас не реинкарнировало в бурундука.
Для решения задачи в хоть сколько-нибудь приближенных к реальным условиях вам требуется весьма серьёзное оборудование. С которым работать вы, кстати, скорее всего не умеете.
Как и во всех логических задачах, условности тут просто неисчеслимы. Даже если взять задачу с волком козой и капустой — как такое вообще возможно? Вы голый, стоите на берегу реки, перед вами всё это добро и вам надо переправиться? Ах да, берега реки сделаны из адамантия, чтобы вы капусту закопать не догадались. В такой ситуации любой нормальный человек в первую очередь задумается, не позвать ли санитара.
Мы уже прикинули выше, для того, что нормальный человек представляет себе при фразе «труба с водой», тепловое решение практически неприменимо. По крайней мере если у вас нет случайно с собой горелки и двух баллонов.
Тем не менее, можно придумать несколько других решений. Тоже, не без ограничений, но более широко применимых.
Тепловой, но «обратный» вариант — обдуть трубу углекислотой из огнетушителя и посмотреть, как будет стаивать иней.
Можно положить на трубу камертон и слушать звук левее и правее. В направлении движения жидкости звук разнесётся дальше. Тут, впрочем, нужны достаточно большие скорости. Для совсем уж больших скоростей можно будет даже услышать эффект Доплера.
Особо мощные кандидаты могут просто пнуть трубу и посмотреть, в каком направлении волна быстрее затухнет.
Пр помощи зажима с регулировкой усилия можно сжать трубу чтобы уменьшить проход и затем замерить усилие необходимое для её сжатия с обеих сторон от сужения.
В общем решения есть. Но весьма причудливые для столь простой задачи. И все они сложнее очевидного — дойти до конца трубы. В реальном мире бесконечные трубы не встречаются. Более того, там где это важно, направление движение жидкости указывается при монтаже. И даже есть клапаны, препятствующие обратному движению.
К сожалению, такие задачи ничего о кандидате не скажут. Ну кроме того, что он любит на досуге решать головоломки.
Автор: Electrohedgehog