Перед тем как начать эту статью, я подумал: Это будет легко! все в моей голове.

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

«Соревновательное программирование - это интеллектуальный спорт, обычно проводимый через Интернет или локальную сеть…»

Какие? умный спорт? 🙀 это правда, но я никогда не осознавал этого факта. Затем я щелкал по каждой ссылке на странице Википедии и после пары часов откладывания в Википедии решил продолжить писать.

Давным-давно, иногда используя дискету в моем университете, я начал заниматься соревновательным программированием. Почему? Потому что это было огромным вызовом в здоровой конкуренции с одноклассниками. Имя моей команды было root? Destroy: 0; 🦾

Возможно, можно разделить соревнования на краткосрочные (1–5 часов) и долгосрочные (от 2 дней до нескольких месяцев). Здесь я опишу краткосрочную перспективу.

Среди них выделяются Международная студенческая олимпиада по программированию (ICPC), Международная олимпиада по информатике (IOI), IEEE Extreme, Google CodeJam и многие другие. Различные технологические компании проводят собственные соревнования по программированию, чтобы открывать новые таланты и вносить свой вклад в сообщество. Вернемся к ICPC, согласно его официальному сайту:

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

Ну, это были соревнования, в которых я участвую (помимо онлайн-соревнований). В качестве основы вам нужно знать несколько хорошо известных алгоритмов и как их комбинировать для решения проблемы ... Угу, но как этого добиться? практика, практика и практика. Моей первой задачей была классическая задача № 100 - Проблема 3n + 1 на сайте Университета Вальядолид, Испания под названием UVa Online Judge, который относится к гипотеза Коллатца.

Не сомневайтесь! Классическая структура такого рода задач состоит из:

  • Описание проблемы: что вам нужно решить? иногда описывается как история или объяснение гипотетической первоначальной установки 👽 👾 🤖
  • Входные данные: описание ожидаемых входных данных для проблемы с указанием значений диапазона или нет (например, 32-битные целые числа, буквенно-цифровая строка)
  • Вывод: ожидаемый результат для проблемы, число, фраза или просто True / False. Кроме того, это может быть что-то сложное, например, изображение ASCII!
  • Ограничения: ограничены ли ограничения памяти и времени, чтобы избежать грубых или классических подходов 😧

Как правило, в каждом соревновании есть свои правила о том, кто победит. Большинство из них считают победителем тот, кто решит больше задач за меньшее время. Конечно, каждый получает набор задач, каждый должен представить свое решение для оценки. Решение помечается как принятое (AC), неправильный ответ (WA), превышение лимита времени (TLE) и другие. Как я уже говорил, это зависит от каждого соревнования 👩🏻‍💻 👨🏻‍💻

Возможно, во время соревнований вам потребуется определить:

  • Стратегия использования: стратегия сотрудничества с вашей командой.
  • Идентификация проблемы: проблема соответствует любой предыдущей проблеме, которую я решил? могу ли я классифицировать его как легкий / средний / сложный? могу я описать некоторые методы решения проблемы?
  • Анализ решения: временная сложность против сложности памяти
  • Проверьте крайние случаи: внимательно проверьте проблемы границы в соответствии с вводом / выводом.

По опыту, многие проблемы уместятся в продуманном решении для вас / вашей команды в различных категориях: математика, динамическое программирование, графики, сортировка, поиск, обработка строк, специальные. Затем, после написания кода, просто попробуйте его взломать! Помните, что ваш код будет оцениваться автоматической системой, которая сравнивает входные данные (в нескольких случаях, включая те, которые выходят за пределы) с ожидаемым выходом, тогда ваш код должен работать правильно и получать правильный ответ 🐵 🙈 🙉

Есть несколько веб-сайтов, на которых вы можете попрактиковаться, например HackerRank, CodeChef, Codeforces, TopCoder, Coderbyte, Project Euler, Exercism.io, Codewars, SPOJ, CodinGame и другие. В конце концов, вы превратитесь в мастера кодирования с такими навыками, как абстракция, более быстрый набор текста, пристрастие к закускам (закускам), работа под давлением и другие.

На мой взгляд, это может быть рискованно из-за (вероятно) нехватки знаний о фреймворках, используемых в реальных проектах. Однако почему так много компаний использовали такой подход в интервью? Я ошибаюсь в своей мысли? Не совсем, профиль такого программного обеспечения имеет несколько характеристик, очень полезных в отрасли. Есть несколько технологических компаний, которые используют проблемы конкуренции для отбора возможных кандидатов. Мы ясно понимаем, что навыки программирования - это только один навык, помимо командной работы, творчества, устойчивости и многого другого. Что ж, это может быть долгое обсуждение этого вопроса.

В любом случае, вы приобретете практические навыки, которые сделают вас отличным кандидатом на работу вашей мечты в крещеную компанию GAFAM / FAANG / BigFour или любую другую компанию вашей мечты.

Наконец, позвольте мне поделиться видео, которое я записал в этом году, о том, как я решаю первую проблему, которая появляется в LeetCode для начинающих / новичков.

Есть способ самостоятельно взглянуть на проблему в объяснительной перспективе. Не надейтесь, что вы станете мастером кодирования с этим (?) 🖖 Это длинное видео (~ 30 минут).

Что ж, этот пост - длинное чтение, чтобы быть коротким рассказом. О, кстати, я не стал мастером-кодером сайаджин-ниндзя, а просто обычным человеком, который любит сложные задачи и любит соревновательное программирование 🤓. Спасибо за прочтение.

От гика до гиков

Первоначально опубликовано на https://www.ecode.dev 19 июля 2020 г.