Golang в спортивном программировании
Немного увлекаюсь спортивным программированием (решаю задачи на codeforces, leetcode, acmp). Недавно познакомился с языком C, в целом, программировать на нем уже в состоянии. 50% от цели изучения C - решать задачи через быстрый C, а не через медленный Python (например, на codeforces задачи A решаются нормально, а далее становится трудно (для меня) уложится по времени (не во всех задачах)). Но скорость решения этих задач упала в разы. Отсутствие строк, нормальных встроенных функций, отладка. Заинтересовался языком Golang, он же Go. Все пишут, что он простой, мощный, быстрый. Но никто не писал про его уместность в спортивном программировании. Конкурентоспособен ли этот язык в этом направлении, или, все же, идти через стандартные C и C++
Ответы (2 шт):
На ваш вопрос невозможно дать разумный ответ. Что такое "конкуретоспособность" и "спортивное программирование"? Какие фичи требуются от языка?
Посмотрите сравнение C++ и Go. Go медленнее C++ от полутора до 10 раз. В зависимости от задачи. Это много или мало?
На том же сайте сравнение Go и Python. В каких-то задачах Go быстрее в 200 раз, а в каких-то наравне с Python. Опять таки, можно ли по этим данным судить о конкурентоспособности этих языков?
Что-то определённое можно сказать только про сравнение Go и Java: программы на этих языках выполняются примерно за одинаковое время.
Многие думают, что существует мифический язык Х, который приведет их в топы любых соревнований. Но Серебряной пули не существует.
Все задачи на соревновательных платформах можно грубо поделить на 4 типа.
тренировочные задачи. Их можно решать на любом языке, ошибиться в них почти невозможно, главная их цель - научится работать с платфорой.
обычные задачи. Такие задачи легко пишутся на питоне/java, но иногда бывает не хватает чуточку скорости. На с/с++ пишутся иногда чуточку сложнее, но иногда даже в лоб написанный код успевает вовремя.
сложные задачи. Здесь уже с/с++ втискивается в время только с разными трюками, но и то не всегда. python/java тут напрягается, если решать задачу в лоб. Поэтому, в большинстве случаев эти задачи решаются за счет поиска более красивого алгоритма.
Например, рассмотрим простую задачу - найти сумму чисел от a до b. Обычный подход заключается просто в обычном цикле. Но если a и b очень большие числе, то тут никакой язык не поможет (хотя clang в некоторых случаях может удивить - если он догадается, что это сумма чисел). Но как только вспоминается школьная формула сумма ряда (да, я знаю, что многие считают, что им школьная математика не нужна совсем, но они пишут другие задачи, например, через браузер процессор подогревает:) ). Через известную формулу сумма ряда считается за константное время (сложили, умножили, поделили попалам), вместо O(n).
В этой таких задачах практически не имеет значения язык, даже на написаному в ручную интерпретаторе бейсика на ардуинке можно вложится в время, если знать/найти подходящий алгоритм, а на большом кластере с тысячами процессоров считать годами с вылизанным кодом на ассемблере.
и последний тип задач - это задачи, для которых не существует (не найдено) хорошего алгоритма. Например, разложение на множители. И тут в ход идут всякие трюки и ухищрения, что бы хоть как то уложится.
Вывод. Если хочется выйти в топ соревновательных сайтов, не ищите "идеальный язык". Читайте Кнута, Кормена, Седжвика.
Если просто хочется прокачатся в языке, тогда решайте задачи на том языке, на котором хотите дальше продолжать. Узнаете разные хорошие вещи о своем языке. Я так один раз решил пойти работать как perl разработчик и где то месяц решал задачи на таких сайтах, но на perl. И на интервью я легко отвечал на разные мелкие каверзные вопросы.