| Dmitry Jemerov ( @ 2007-07-26 01:20:00 |
ICFP Postmortem: Team ryba
Итак, обещанный отчёт. :)
То, что поискать команду я решил в последний момент, проблем не составило - для того, чтобы найти достаточное количество желающих поучаствовать, оказалось достаточно пройти по офисному коридору из конца в конец и обратно. В офисе мы и провели, наверное, где-то две трети из 72 часов, отведённых на контест. :) Женьку я предупредил, что зароюсь нафиг на эти выходные и рассчитывать на то, что я куда-то с ней поеду, не стоит - но я и не подозревал, насколько сильно я на самом деле зароюсь.
Обсуждения по поводу языков и технологий у нас особенного не было. Дождавшись 14:00, скачав и по диагонали прочитав PDF'ку с заданием, я подошёл к Майку спросить, собирается ли он участвовать, и услышал в ответ "я уже педалю" и увидел открытую на его маке идею с зачатками структур для DNA. Так что обсуждать было нечего - я сказал, что берусь делать интерпретатор RNA, и пошёл его кодить.
(Для тех, кому лень читать задание, немного поясню. Задание состоит в том, что нам даётся DNA - фактически программа для некоторой непонятно как устроенной виртуальной машины, которая рисует некую картинку. Требуется прислать префикс к этой программе, который патчит её так, чтобы она рисовала другую указанную картинку, или максимально на неё похожую. Для каждого префикса вычисляется риск - 10 баллов за каждый пиксел, который отличается от требуемой картинки, и 1 балл за каждый символ префикса. Побеждает тот, кто пришлёт префикс с наименьшим риском.
Процесс выполнения DNA, по сути своей, представляет последовательность поисков и замен регулярных выражений в этой самой DNA. По ходу её выполнения она также может выдавать RNA - это простые векторные графические команды, посредством которых, собственно, и рисуется картинка.)
Алгоритмы для интерпретации RNA в задании были прописаны чётко, поэтому реализовать их на Java было делом техники, и уже к четырём часам как-то работающая версия лежала в репозитории. Примерно в это же время Майк выложил как-то работающую версию интерпретатора DNA.
Тем временем Роман засабмитил на сервер префикс, который был дан в качестве хинта в задании, и обнаружил, что DNA с этим префиксом рисует картинку самопроверки (и при этом, похоже, довольно неплохо проверяет всякие хитрые случаи в интрепретаторе). Как это всё происходило - мы пока не поняли, но на вооружение взяли. Олег в это время написал утилитку для вычисления разницы между двумя картинками.
Следующие часа три ушли на багфиксинг, а также на написание интерпретатора, который рисует картинку сразу по мере генерации. (Multicore friendly, кстати: один тред обсчитывает DNA, а другой рисует картинку.) Пока мы запускали DNA с префиксом self check, мы увидели, что перед основной картинкой он рисует на экране ещё какие-то буковки, подозрительно похожие на префикс DNA, которые потом стирает. К сожалению, засамбитить его на сервер и получить оттуда картинку мы не могли - картинку мы получаем только в том случае, если у нового префикса риск меньше, чем у того, который мы сабмитили в прошлый раз.
Рабочий день, тем не менее, ещё не закончился, и нам всем приходилось отвлекаться на дела, связанные с работой. Разобравшись с выпуском очередного EAP-билда, я порывался сесть и начать писать векторизатор результирующей картинки (чтобы не обводить полигоны руками), однако по счастливой случайности изучение её в Photoshop я начал с рассматривания вагончика в самой середине картинки. Заливка вагончика оказалась не однотонной, а с некоторым dithering'ом, а оценка результата не зависит от того, насколько я ошибся с цветом пиксела - засчитывается только точное совпадение. Поэтому я решил, что кодировать картинку всё равно придётся попиксельно и время на векторизатор можно не тратить (и, как потом выяснилось, это было крайне справедливо).
Тем временем, наш интерпретатор заработал достаточно хорошо для того, чтобы мы смогли отрендерить с его помощью префикс, вытащенный из self check. Результат оказался очень интересным, и мы поняли, что тут всё куда круче, чем казалось на первый взгляд...
to be continued...
Итак, обещанный отчёт. :)
То, что поискать команду я решил в последний момент, проблем не составило - для того, чтобы найти достаточное количество желающих поучаствовать, оказалось достаточно пройти по офисному коридору из конца в конец и обратно. В офисе мы и провели, наверное, где-то две трети из 72 часов, отведённых на контест. :) Женьку я предупредил, что зароюсь нафиг на эти выходные и рассчитывать на то, что я куда-то с ней поеду, не стоит - но я и не подозревал, насколько сильно я на самом деле зароюсь.
Обсуждения по поводу языков и технологий у нас особенного не было. Дождавшись 14:00, скачав и по диагонали прочитав PDF'ку с заданием, я подошёл к Майку спросить, собирается ли он участвовать, и услышал в ответ "я уже педалю" и увидел открытую на его маке идею с зачатками структур для DNA. Так что обсуждать было нечего - я сказал, что берусь делать интерпретатор RNA, и пошёл его кодить.
(Для тех, кому лень читать задание, немного поясню. Задание состоит в том, что нам даётся DNA - фактически программа для некоторой непонятно как устроенной виртуальной машины, которая рисует некую картинку. Требуется прислать префикс к этой программе, который патчит её так, чтобы она рисовала другую указанную картинку, или максимально на неё похожую. Для каждого префикса вычисляется риск - 10 баллов за каждый пиксел, который отличается от требуемой картинки, и 1 балл за каждый символ префикса. Побеждает тот, кто пришлёт префикс с наименьшим риском.
Процесс выполнения DNA, по сути своей, представляет последовательность поисков и замен регулярных выражений в этой самой DNA. По ходу её выполнения она также может выдавать RNA - это простые векторные графические команды, посредством которых, собственно, и рисуется картинка.)
Алгоритмы для интерпретации RNA в задании были прописаны чётко, поэтому реализовать их на Java было делом техники, и уже к четырём часам как-то работающая версия лежала в репозитории. Примерно в это же время Майк выложил как-то работающую версию интерпретатора DNA.
Тем временем Роман засабмитил на сервер префикс, который был дан в качестве хинта в задании, и обнаружил, что DNA с этим префиксом рисует картинку самопроверки (и при этом, похоже, довольно неплохо проверяет всякие хитрые случаи в интрепретаторе). Как это всё происходило - мы пока не поняли, но на вооружение взяли. Олег в это время написал утилитку для вычисления разницы между двумя картинками.
Следующие часа три ушли на багфиксинг, а также на написание интерпретатора, который рисует картинку сразу по мере генерации. (Multicore friendly, кстати: один тред обсчитывает DNA, а другой рисует картинку.) Пока мы запускали DNA с префиксом self check, мы увидели, что перед основной картинкой он рисует на экране ещё какие-то буковки, подозрительно похожие на префикс DNA, которые потом стирает. К сожалению, засамбитить его на сервер и получить оттуда картинку мы не могли - картинку мы получаем только в том случае, если у нового префикса риск меньше, чем у того, который мы сабмитили в прошлый раз.
Рабочий день, тем не менее, ещё не закончился, и нам всем приходилось отвлекаться на дела, связанные с работой. Разобравшись с выпуском очередного EAP-билда, я порывался сесть и начать писать векторизатор результирующей картинки (чтобы не обводить полигоны руками), однако по счастливой случайности изучение её в Photoshop я начал с рассматривания вагончика в самой середине картинки. Заливка вагончика оказалась не однотонной, а с некоторым dithering'ом, а оценка результата не зависит от того, насколько я ошибся с цветом пиксела - засчитывается только точное совпадение. Поэтому я решил, что кодировать картинку всё равно придётся попиксельно и время на векторизатор можно не тратить (и, как потом выяснилось, это было крайне справедливо).
Тем временем, наш интерпретатор заработал достаточно хорошо для того, чтобы мы смогли отрендерить с его помощью префикс, вытащенный из self check. Результат оказался очень интересным, и мы поняли, что тут всё куда круче, чем казалось на первый взгляд...
to be continued...