| Ak Kort ( @ 2005-12-16 10:53:00 |
Конкурс
По следам предыдущей беседы на тему оптимизации и решений интересных задачек. По заявкам читателей открываю конкурс на решение задач по программированию. С вашей стороны решение, с моей - приз.
Для начала дам простенькую задачку, у которой нет ни требований к памяти, ни к крутым алгоритмам. Просто умение думать плюс аккуратное программирование и внимательность к мелочам. И очень много мелкой оптимизации. Разворачивание циклов, табличные вычисления, #define и forceinline'ы в этой задаче рулят.
Итак, входной файл содержит N*N байтовых записей, где N-размер поля. Каждый байт входного файла содержит информацию об одной ячейке лабиринта: 4 младших бита показывают, где есть дорожки. Старшие биты нулевые. Соответствие бит по часовой стрелке начиная с 12 часов:

Каждая ячейка во входном файле повернута на случайный угол, кратный 90, таким образом, весь входной файл содержит некий лабиринт вида:

Задача: написать программу, которая поворачивает все ячейки так, чтобы получился связанный лабиринт и записывает его в аналогичном формате в выходной файл. Важное замечание: лабиринт должен быть полностью связанным, без петель и мертвых зон. Гарантируется, что входные данные позволяют построить не менее одного правильного лабиринта. Различные верные модификации лабиринта равноценны. Пример решения:

Язык и платформа любые, ограничений по использованию памяти и скорости работы нет. Правда, использование языка, отличного от С++ может привести к существенному замедлению алгоритма. Победителем считается тот, кто первым опубликует в комментариях к этому посту MD5 выходного файла и пришлет затем выходной файл мне на емайл akkort@hotmail.ru. Оценку правильности решения и соответствия ему контрольной суммы буду проводить после окончания приема результатов. Первенство будет определяться по дате комментария.
Входной файл лежит тут: problem.dat.
Для проверки MD5 входного файла = 9d59285d25b3b87f64896974887cf503
У вас есть выбор - сделать медленный алгоритм за пару часов и ждать три дня пока он закончит, либо потерять время на оптимизацию и все быстро вычислить. Можете даже использовать многопроцессорные платформы или нагрузить на выходные все компы родной фирмы, если сможете написать для этой задачи алгоритм распределенных вычислений.
Для проверки правильности составления лабиринта можно использовать следующую программку (с исходником): checklab.rar
Приз победителю - бутылка армянского коньяка самовывозом из нашего офиса. На олимпиадах такие задачи решают 3 часа. У вас есть пять дней. Решения принимаются до среды 21 декабря, 16:00 уфимского времени (14:00 MSK). Если к тому времени победитель не определится, то коньяк я выпью сам. Пожалейте мою печень, решите задачку :)
Да, еще один маленький бонус. Все решившие задачу в срок на VC++ могут рассчитывать на трудоустройство в нашей конторе без прохождения других тестов и испытательных сроков. В отличие от наших относительно простых тестовых заданий для приема на работу эта задача на порядок сложнее, но и невыполнение ее ничем не грозит.
Кстати было неплохо раскидать задание другим программерам, чтобы интереснее было.
UPD: пока никто ничего не прислал и я не забыл, сделаю небольшое замечание, которое может показаться большинству очевидным. ручное вмешательство в работу алгоритма запрещено. то есть программа без перекомпиляции и, тем более, без ввода пользователя, должна с равным успехом обрабатывать любые входные файлы такого же размера. задача все-таки на программирование, а не на поиск единичного решения.
По следам предыдущей беседы на тему оптимизации и решений интересных задачек. По заявкам читателей открываю конкурс на решение задач по программированию. С вашей стороны решение, с моей - приз.
Для начала дам простенькую задачку, у которой нет ни требований к памяти, ни к крутым алгоритмам. Просто умение думать плюс аккуратное программирование и внимательность к мелочам. И очень много мелкой оптимизации. Разворачивание циклов, табличные вычисления, #define и forceinline'ы в этой задаче рулят.
Итак, входной файл содержит N*N байтовых записей, где N-размер поля. Каждый байт входного файла содержит информацию об одной ячейке лабиринта: 4 младших бита показывают, где есть дорожки. Старшие биты нулевые. Соответствие бит по часовой стрелке начиная с 12 часов:

Каждая ячейка во входном файле повернута на случайный угол, кратный 90, таким образом, весь входной файл содержит некий лабиринт вида:

Задача: написать программу, которая поворачивает все ячейки так, чтобы получился связанный лабиринт и записывает его в аналогичном формате в выходной файл. Важное замечание: лабиринт должен быть полностью связанным, без петель и мертвых зон. Гарантируется, что входные данные позволяют построить не менее одного правильного лабиринта. Различные верные модификации лабиринта равноценны. Пример решения:

Язык и платформа любые, ограничений по использованию памяти и скорости работы нет. Правда, использование языка, отличного от С++ может привести к существенному замедлению алгоритма. Победителем считается тот, кто первым опубликует в комментариях к этому посту MD5 выходного файла и пришлет затем выходной файл мне на емайл akkort@hotmail.ru. Оценку правильности решения и соответствия ему контрольной суммы буду проводить после окончания приема результатов. Первенство будет определяться по дате комментария.
Входной файл лежит тут: problem.dat.
Для проверки MD5 входного файла = 9d59285d25b3b87f64896974887cf503
У вас есть выбор - сделать медленный алгоритм за пару часов и ждать три дня пока он закончит, либо потерять время на оптимизацию и все быстро вычислить. Можете даже использовать многопроцессорные платформы или нагрузить на выходные все компы родной фирмы, если сможете написать для этой задачи алгоритм распределенных вычислений.
Для проверки правильности составления лабиринта можно использовать следующую программку (с исходником): checklab.rar
Приз победителю - бутылка армянского коньяка самовывозом из нашего офиса. На олимпиадах такие задачи решают 3 часа. У вас есть пять дней. Решения принимаются до среды 21 декабря, 16:00 уфимского времени (14:00 MSK). Если к тому времени победитель не определится, то коньяк я выпью сам. Пожалейте мою печень, решите задачку :)
Да, еще один маленький бонус. Все решившие задачу в срок на VC++ могут рассчитывать на трудоустройство в нашей конторе без прохождения других тестов и испытательных сроков. В отличие от наших относительно простых тестовых заданий для приема на работу эта задача на порядок сложнее, но и невыполнение ее ничем не грозит.
Кстати было неплохо раскидать задание другим программерам, чтобы интереснее было.
UPD: пока никто ничего не прислал и я не забыл, сделаю небольшое замечание, которое может показаться большинству очевидным. ручное вмешательство в работу алгоритма запрещено. то есть программа без перекомпиляции и, тем более, без ввода пользователя, должна с равным успехом обрабатывать любые входные файлы такого же размера. задача все-таки на программирование, а не на поиск единичного решения.