Итак, вот они результаты нашего последнего конкурса. Спасибо всем, кто принял участие.
В принципе, задачка была совсем не сложной (она такой и планировалась) и целых 56 человек с ней справились. Вот имена людей, которые сделали это первыми:
- @sefus_ru (он же sefus)
- @AbsolutePlus (он же MrLoki)
- @mp_Inside (аккаунт на Хабре не найден)
Под катом можно найти решение задачи и ссылки по теме.
Итак, задача в картинке. Скачиваем картинку и рассматриваем. Зумим. К стати, говоря, имеет значение, чем именно зумить. Например, Paint зумит эту картинку верно, а вот Irfan View и стандартный вьювер из пакета Microsoft Office начинают «фантазировать» и их «виденье» данной картинки могло очень затруднить определение того, что, собственно говоря, мы тут видим.
Присмотревшись к увеличенному в Paint варианту мы видим какие-то смутно знакомые фигурки из точек. Что же это, где же я это видел? Ну конечно же! На картинке выше — классический «глайдер» (или «планер») из игры «Жизнь» — не менее классического примера клеточного автомата.
Еще одним намеком на игру «Жизнь» было размещение топика в хабе «Game Development» — ну не из-за типа призов же он там находился. Соответственно, вся картинка в целом, наверное, представляет собой состояние популяции в какой-то момент времени. Самым логичным в этом месте рассуждений было бы перенести её с картинки в какую-нибудь программу, позволяющую запустить процесс генерации следующих поколений и понаблюдать за происходящим. Истинные джедаи в этом месте могли написать собственный парсер png-файлов и свою реализацию «Жизни». Чуть более практичные люди — преобразовали бы png в bmp (его уж всяко легче парсить), прочитали его и получили бы массив, который можно скормить в какую-нибудь из существующих реализаций игры. А совсем уж лентяи (в хорошем понимании этого слова) могли предположить, что, наверное, уже есть реализации, способные открывать графические файлы с популяциями и запускать их. И такие программы действительно есть. Одна из лучших — Golly. Она спокойно открывает предложенную картинку и вот что мы видим при запуске генерации следующих поколений:
И вот он текст — "HI TO @INFOPULSE_UKR FROM #HABR!"
Теперь пару пояснений к происходящему на экране. Мы уже знаем, что такое «глайдер» (см. выше). Именно из глайдеров и состоит текст, перемещение которого мы видим на экране.
Однако как же получился текст? Опять таки, давненько было придумано «глайдерное ружье» — фигура, способная генерировать бесконечное количество глайдеров, выстреливая их в пространство. Первые ружья просто генерировали поток глайдеров.
То, что мы видим в данном случае — это модификация стандартного ружья, именуемая «Golly-gun» (по крайней мере мне данная фигура впервые встретилась под таким названием). Она позволяет генерировать поток глайдеров с пропусками, которые определяются количеством и положением глайдеров в «магазине» — начальном состоянии ружья. Фактически, мы имеем бинарный код. На сайте ранее упоминаемой программы Golly в шапке можно увидеть пример такого ружья.
Но как же написать произвольный текст? Вручную создавать такое ружье весьма долго. К счастью, это и не нужно. Во-первых, существует готовый шаблон ружья с «полным магазином». Вы можете взять его и просто удалить лишние глайдеры, получив пропуски в генерируемых потоках. Во-вторых, можно не делать и этого — существует Ruby-скрипт, позволяющий сгенерировать ружье для определенного текста. Именно он и был использован для подготовки данной задачи. Всё просто, правда?
Поздравляю победителей — для согласования получения призов свяжитесь со мной (через личку Хабра или почту tangrofromhabr\gmail.com (\ = @) ).
Спасибо всем заинтересовавшимся — надеюсь, задача вам понравилась.
Автор: tangro