Найти тему
Журнал «Код»

Сложная задача про длину кабеля

Потребуется логика и воображение

Воскресенье, утро, Стамбул. Сетевой инженер из России пьёт кофе в кафе с видом на Босфор. Вдруг звонок:

— Васян, выручай, нужно срочно продиагностировать кусок сети, без тебя никак.

— В чём дело?

— У нас два компьютера соединены через два шлюза. Нам нужно понять скорость сигнала между этими шлюзами.

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

— Мы не можем, у нас нет пароля, а у кого он — никто не знает.

— Ладно, что вы ещё знаете?

Дальше он узнал вот что:

  • Есть два компьютера.
  • Между ними два шлюза: красный и синий.
  • Между двумя шлюзами ещё какие-то устройства: серверы, передатчики, шлюзы и т. д. — мы не знаем какие. Они замедляют сигнал.
  • Мы не знаем точный пинг (то есть время прохождения сигнала) между всеми этими точками.
  • Но если прогнать пинг от первого компьютера до красного шлюза и сравнить с пингом от красного шлюза до второго компьютера, то разница в пинге будет 25 миллисекунд.
  • А если сравнить пинг до и от синего шлюза, то разница будет уже 35 миллисекунд.
  • Скорость пинга одинаковая в обе стороны всё время.

Задача — узнать пинг (то есть скорость прохождения сигнала) между красным и синим шлюзом. Предположительно там стоит какое-то оборудование, которое замедляет наш сигнал слишком сильно, и в зависимости от показателей замедлений нужно дать кому-то по шапке.

-2

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

Решение

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

-3

Теперь обозначим за x, y и z три отрезка сигнала, которые нам неизвестны, и подпишем разницу в пинге — это то, что мы знаем:

-4

По рисунку можно составить два уравнения:

x + y − z = 25 ← когда пингуем красный шлюз

y + z − x = 35 ← когда пингуем синий шлюз

Сложим эти уравнений друг с другом:

x + y − z + y + z − x = 25 + 35

Сгруппируем неизвестные друг с другом:

(x − x) + (y + y) + (z − z) = 60

2y = 60 → y = 30

Получается, пинг между шлюзами, которое мы обозначили за y, равен 30 миллисекунд.