| Dmitry Jemerov ( @ 2007-07-27 00:24:00 |
ICFP Postmortem: Team ryba, part 2
(начало здесь)
Итак, как гласят логи нашего Subversion, после обнаружения очень интересной картинки мы продолжали ковырять интерпретатор. Майк продолжал заниматься оптимизациями интерпретатора DNA, Лёша переписывал алгоритм flood fill с рекурсивного на итеративный, а я тем временем делал структурированную дампилку выполняемых RNA-команд, которая вместо отдельных команд mark, move и задания цветов печатала координаты и цвета рисуемых линий. Роман же засамбитил на сервер второй из префиксов с интересной картинки, и выяснилось, что он включает свет. Этого оказалось достаточно, чтобы обеспечить нам целых полтора процента выживания и вывести нас в top 20. Из него мы, кажется, не выпадали ни разу до самого конца конкурса (даже когда он сократился до top 15).
Пока Майк продолжал заниматься оптимизациями, я пытался найти багу в текущей имплементации, из-за которой мы не проходили последний шаг self check. Разбираться в этом было на редкость тоскливо. Даже когда мне удалось выяснить, что на 28й итерации мы продалбываем кусок DNA в самом хвосте, который потом безуспешно пытаемся найти на 140й итерации, понять, на какой именно из 28 итераций мы делаем что-то не так, шансов было мало. Совсем было отчаявшись, я решил написать альтернативную реализацию на Haskell, про который до этого читал книжку, но писать ничего не пробовал. Увы, попытки быстро-быстро изучить незнакомый язык полвторого ночи оказались практически безуспешными, и то, что очередная оптимизированная Майковская имплементация начала полностью проходить self check сама по себе, оказалось большим облегчением.
(YourKit, кстати, наше всё. Иметь мощный и знакомый инструментарий помогает очень здорово. А вот с Subversion всё было не очень гладко - для всяческих экспериментов народ постоянно дописывал и комментировал кусочки кода примерно в одних и тех же местах, постоянно приходилось резолвить конфликты при мёрже, и, кажется, пару раз какие-то изменения терялись. Заодно я пронаблюдал пару трудновоспроизводимых багов в идейской svn-интеграции - но разбираться подробнее времени не было совсем.)
Дальнейшие несколько часов были, наверное, самыми увлекательными во всём контесте. Наконец-то правильно работающий интерпретатор позволил нам отрендерить последний из имеющихся префиксов и получить инструкции по навигации по хелпу. Куда и как запихивать номера страниц, Майк понял быстро, и мы смогли получить индекс страниц в хелпе и все перечисленные там страницы (кроме тех, которые были помечены заманчивым словом encrypted).
(Олег тем временем, уже сидя дома, выложил реализацию интерпретатора на .NET, но наша часть команды никакой пользы из этого извлечь не пыталась.)
Страничка про security features вызвала у меня бурный энтузиазм "о-о, это подстановочный шифр, дайте же я скорее его разгадаю!", и я бросился руками восстанавливать таблицу подстановки, так до самого конца и не сообразив, что шифр этот всего лишь ROT-13. Тем не менее, основное время ушло не на расшифровку, а на то, чтобы набить ручками два с половиной килобайта бессмысленного текста. (Другой народ успел аж OCR-утилитку написать, а мы всё по старинке, ручками...) Расшифрованный текст, как оказалось, описывал некий алгоритм шифрования.
Куда более многообещающей оказалась страница 42, содержащая список генов. Точнее, его маленькую часть. :) Но пока Майк перебирал не перечисленные в каталоге номера страниц в надежде найти ещё что-нибудь интересное, я сообразил, что первая строчка в списке генов (AAA_geneTablePageNr) очень похожа на переменную, и её значение не так сложно поменять. Следующие полчаса ушли на то, чтобы отрендерить остальные 13 страниц списка. (Хорошо Майку - он на своём четырёхпроцессорном Mac Pro запускал по 4 рендера параллельно, а я-то всё на ноуте своём ковырял, он хоть и Core 2 Duo, но больше одного рендера тянул с трудом.)
Ещё одна страничка из хелпа научила нас запускать гены из таблицы поштучно, чем мы и воспользовались для того, чтобы отрендерить пару описаний старых ICFP и ещё одну страничку хелпа.
И хотя спать всё ещё практически не хотелось (без всяких стимуляторов - за всё время контеста я выпил всего одну банку ред-булла и чашки 4 кофе), было уже пол-седьмого утра, и мы решили расползаться по домам.
to be continued...
(начало здесь)
Итак, как гласят логи нашего Subversion, после обнаружения очень интересной картинки мы продолжали ковырять интерпретатор. Майк продолжал заниматься оптимизациями интерпретатора DNA, Лёша переписывал алгоритм flood fill с рекурсивного на итеративный, а я тем временем делал структурированную дампилку выполняемых RNA-команд, которая вместо отдельных команд mark, move и задания цветов печатала координаты и цвета рисуемых линий. Роман же засамбитил на сервер второй из префиксов с интересной картинки, и выяснилось, что он включает свет. Этого оказалось достаточно, чтобы обеспечить нам целых полтора процента выживания и вывести нас в top 20. Из него мы, кажется, не выпадали ни разу до самого конца конкурса (даже когда он сократился до top 15).
Пока Майк продолжал заниматься оптимизациями, я пытался найти багу в текущей имплементации, из-за которой мы не проходили последний шаг self check. Разбираться в этом было на редкость тоскливо. Даже когда мне удалось выяснить, что на 28й итерации мы продалбываем кусок DNA в самом хвосте, который потом безуспешно пытаемся найти на 140й итерации, понять, на какой именно из 28 итераций мы делаем что-то не так, шансов было мало. Совсем было отчаявшись, я решил написать альтернативную реализацию на Haskell, про который до этого читал книжку, но писать ничего не пробовал. Увы, попытки быстро-быстро изучить незнакомый язык полвторого ночи оказались практически безуспешными, и то, что очередная оптимизированная Майковская имплементация начала полностью проходить self check сама по себе, оказалось большим облегчением.
(YourKit, кстати, наше всё. Иметь мощный и знакомый инструментарий помогает очень здорово. А вот с Subversion всё было не очень гладко - для всяческих экспериментов народ постоянно дописывал и комментировал кусочки кода примерно в одних и тех же местах, постоянно приходилось резолвить конфликты при мёрже, и, кажется, пару раз какие-то изменения терялись. Заодно я пронаблюдал пару трудновоспроизводимых багов в идейской svn-интеграции - но разбираться подробнее времени не было совсем.)
Дальнейшие несколько часов были, наверное, самыми увлекательными во всём контесте. Наконец-то правильно работающий интерпретатор позволил нам отрендерить последний из имеющихся префиксов и получить инструкции по навигации по хелпу. Куда и как запихивать номера страниц, Майк понял быстро, и мы смогли получить индекс страниц в хелпе и все перечисленные там страницы (кроме тех, которые были помечены заманчивым словом encrypted).
(Олег тем временем, уже сидя дома, выложил реализацию интерпретатора на .NET, но наша часть команды никакой пользы из этого извлечь не пыталась.)
Страничка про security features вызвала у меня бурный энтузиазм "о-о, это подстановочный шифр, дайте же я скорее его разгадаю!", и я бросился руками восстанавливать таблицу подстановки, так до самого конца и не сообразив, что шифр этот всего лишь ROT-13. Тем не менее, основное время ушло не на расшифровку, а на то, чтобы набить ручками два с половиной килобайта бессмысленного текста. (Другой народ успел аж OCR-утилитку написать, а мы всё по старинке, ручками...) Расшифрованный текст, как оказалось, описывал некий алгоритм шифрования.
Куда более многообещающей оказалась страница 42, содержащая список генов. Точнее, его маленькую часть. :) Но пока Майк перебирал не перечисленные в каталоге номера страниц в надежде найти ещё что-нибудь интересное, я сообразил, что первая строчка в списке генов (AAA_geneTablePageNr) очень похожа на переменную, и её значение не так сложно поменять. Следующие полчаса ушли на то, чтобы отрендерить остальные 13 страниц списка. (Хорошо Майку - он на своём четырёхпроцессорном Mac Pro запускал по 4 рендера параллельно, а я-то всё на ноуте своём ковырял, он хоть и Core 2 Duo, но больше одного рендера тянул с трудом.)
Ещё одна страничка из хелпа научила нас запускать гены из таблицы поштучно, чем мы и воспользовались для того, чтобы отрендерить пару описаний старых ICFP и ещё одну страничку хелпа.
И хотя спать всё ещё практически не хотелось (без всяких стимуляторов - за всё время контеста я выпил всего одну банку ред-булла и чашки 4 кофе), было уже пол-седьмого утра, и мы решили расползаться по домам.
to be continued...