Очередной конкурс от Яндекса

Еще месяц назад узнал об очередных соревнованиях от Яндекса, и долгое время не мог определиться, участвовать или нет. У меня эти соревнования связаны со стрессом из-за очень жесткого ограничения по времени и того, что очень мало тестов, из-за чего сложно понять, что же я сделал не так. К тому же эта неделя получилась какой-то непонятной: вроде и дел особо важных не было, но время улетало неизвестно куда. И только сегодня, в последний день, все же выделил 4 часа на то, чтобы принять участие. И на этот решил, что нужно пытаться полностью дожать «одну» задачу, а не пытаться написать код для всех, а потом на всех же застрять на дальних тестах.
С самого начала все пошло не так. Во-первых, я перепутал и вместо участие в backend-конкурсе указал frontend. Впрочем, как выяснилось, задачи там все равно алгоритмические, с frontendом связанные скорее способом оформления результатов и тем, что пишутся на JavaScript. Взялся за решение самой первой задачи. Там сразу же давался готовый код, но утверждалось, что он не работает на больших объемах данных. Я стал думать, как его оптимизировать. В процессе узнал про TypedArrays, и решил применить Uint32Array. Но увы, не знаю, было ли это решение правильным. Оказалось, что Uint32Array не поддерживает операцию push, поэтому пришлось идти кривым путем — создавать второй массив, куда добавлялись элементы, порождаемые в процессе решения задачи, и в конце итерации склеивать из двух массивов один, а потом сортировать его. Это ощутимо усложнило алгоритм, и пришлось дольше возиться с отладкой. Но самое обидное — так и не помогло: пять последних тестов уходили за таймаут. А еще несколько — заканчивались wrong answer. И в итоге за эту задачу я получил всего три балла из 15 возможных.
Не будь таких жестких ограничений по времени, я пошел бы другим путем: оставил бы массив обычным, отсортировал бы его один раз, а дальше просто вставлял бы новые элементы в нужные позиции, находя их бинарным поиском. Если будет возможность потом порешать задачи в тестовом режиме, то все же попробую это сделать.
После этого я переключился на другую задачу. Там все было проще: нужно было сформировать barcode по определенным правилам и вывести его в броузер. Ошибиться там было просто негде, поэтому с первой же отправки кода я получил за нее 40 баллов.
Прочитав остальные задачи, я решил взяться за самую последнюю. Там нужно было разобраться с куском кода, который отрисовывал аналоговые часы с кнопкой сброса, и доделать его. В целом это получилось довольно быстро, но в коде было ограничение: стрелки часов при сбросе должны повернуться к нулю, двигаясь не быстрее определенной скорости. И вот тут я запутался с единицами измерения. На то, чтобы разобраться, ушло много времени, но где-то за 10 минут до окончания все же при выполнении в броузере код работал как надо. Но когда я отправил его на тестирование, тесты он не прошел. А самое главное, я вообще в упор не понимал, как они устроены (оказывается, там были положения стрелок на часах в градусах). И только через пару минут после того, как время вышло, наконец-то до меня это дошло. И только сейчас, когда писал это сообщение, понял, как вообще надо было тестировать эту задачу. В общем, получилось, что застрял всего в одном шаге от окончательного решения, и вместо 113 баллов получил всего 43. Впрочем, даже этого хватило, чтобы подняться до 65 места из 310.
Весь остаток дня пытался прийти в себя и злился на то, что так получилось. До сих пор слегка болит голова… А самое обидное то, что из-за «таймерного стресса» возникает положительная обратная связь: из-за него я задание понимаю со второго-третьего раза в лучшем случае, упускаю иногда важные детали, из-за чего напрасно тратится еще больше времени.