Пятничная статья про столкновение задачи из собеседования с реальным миром.

Есть довольна известная задача — перед вами находится металлическая труба с текущей внутри водой. Как определить, в какую сторону она течёт? Её всё ещё могут задать вам на собеседованиях.

По многим задачам с неточной формулировкой уже проходились, давайте разберёмся, что же не так с этой трубой.

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

Во-первых, надо быть уверенным, что температура воды достаточно низка, чтобы её можно было трогать. Ну, точнее, чтобы можно было понять разницу между «очень горячо» и «очень-очень горячо». Точно сказать сложно, но вряд ли это выше 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, атмосфера не состоит из гремучего газа или вас не реинкарнировало в бурундука.

Для решения задачи в хоть ско��ько-нибудь приближенных к реальным условиях вам требуется весьма серьёзное оборудование. С которым работать вы, кстати, скорее всего не умеете.

Как и во всех логических задачах, условности тут просто неисчислимы. Даже если взять задачу с волком козой и капустой — как такое вообще возможно? Вы голый, стоите на берегу реки, перед вами всё это добро и вам надо переправиться? Ах да, берега реки сделаны из адамантия, чтобы вы капусту закопать не догадались. В такой ситуации любой нормальный человек в первую очередь задумается, не позвать ли санитара.

Мы уже прикинули выше, для того, что нормальный человек представляет себе при фразе «труба с водой», тепловое решение практически неприменимо. По крайней мере если у вас нет случайно с собой горелки и двух баллонов.

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

Тепловой, но «обратный» вариант — обдуть трубу углекислотой из огнетушителя и посмотреть, как будет стаивать иней.

Можно положить на трубу камертон и слушать звук левее и правее. В направлении движения жидкости звук разнесётся дальше. Тут, впрочем, нужны достаточно большие скорости. Для совсем уж больших скоростей можно будет даже услышать эффект Доплера.

Особо мощные кандидаты могут просто пнуть трубу и посмотреть, в каком направлении волна быстрее затухнет.

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

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

К сожалению, такие задачи ничего о кандидате не скажут. Ну кроме того, что он любит на досуге решать головоломки.