«В программировании самая сложная часть - не решать проблемы, а решать, какие проблемы решать». - Пол Грэм

Как мы выяснили на Хеш-коде Google в этом году, решение проблем тоже очень сложно.

Что хэшировать?

Сначала немного контекста: Google Hash Code - это соревнование по программированию. Вы получаете задачу от Google вместе с несколькими входными файлами. Вы должны написать программу, которая считывает входной файл и создает выходной файл, который решает проблему. Самое сложное: вы должны сделать это менее чем за 4 часа!

Машины

В этом году проблема заключалась в планировании поездок. Предположим, вы в городе. Люди хотят передвигаться. А теперь представьте, что вы находитесь в будущем! Поэтому вместо того, чтобы ехать на автобусе, люди говорят на своем смартфоне: «Доставьте меня из пункта А в пункт Б». А через некоторое время после этого на перекрестке, на котором вы стоите, появляется беспилотный автомобиль и отвезет вас к месту назначения.

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

И в этом проблема. У вас есть свои маршруты (люди заранее говорят вам, когда они хотят ехать откуда и куда) и ваши машины, и вы должны выяснить, какая машина по каким маршрутам едет.

Наш подход (ы)

Было интересно наблюдать, как мы потратили 4 часа работы. Первые несколько минут мы потратили на понимание проблемы. Каждый внимательно прочтет для себя PDF-файл с постановкой задачи. Следующие 90 минут (которые, оглядываясь назад, были слишком долгими) были потрачены на обсуждение возможных подходов. На этом этапе вы действительно могли сказать, какой член команды изучает какие предметы в колледже. Системный ученый выбрал агентную модель, поочередно моделируя каждую машину в качестве агента. Специалист по составлению сложных графиков имел в виду подход к отжигу.

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

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

Что мы узнали

Вот несколько выводов из этого конкурса:

  • Знайте свои библиотеки, знайте, когда вы не в себе: мы довольно быстро заметили это, хотя мы знали, что широко используемая библиотека numpy была хорошим способом написать эффективный код на основе массивов на Python, и мы думал, мы знаем эту библиотеку, что мы потратили много открытых вкладок браузера на поиск функций, которые мы на самом деле не знали. И в конце концов забросил numpy совсем.
  • Используйте те же инструменты, которые вы используете в производственном коде: когда у вас мало времени, у вас может возникнуть соблазн исключить инструменты проверки и линтеры из рабочего процесса, поскольку им требуется время для выполнения своей работы, и вы пишете « маленькая »программа в любом случае. Но мы заметили, что было много мест, где мы бы сделали действительно глупые ошибки, если бы не pylint и mypy, спасающие наши задницы.
  • Проверьте свои часы: программирование может быстро занять все ваше внимание, позволяя вам забыть есть, пить и ... смотреть на часы. Установите таймеры для себя. Откажитесь от вещей, которые отнимают слишком много времени, и замените их более простыми вещами.