[Из песочницы] Lights Out и её необычные применения

Наверное, некоторые из вас слышали о такой головоломке, как Lights Out. Если кто-то не знает, суть вкратце такова: имеется поле из n x n клеток, часть клеток «включена», часть «выключена». При нажатии на клетку все клетки в области креста переключат своё состояние. Примерно так: d6d909a7e98e4fac8b56beba427dfac9.gif92ae10924f474805aabffaa41032195b.gif

Собственно, задача — сделать все клетки поля «выключенными». Под катом кое-что интереснее, чем просто решение.Сам алгоритм решения довольно нудный и объяснять его здесь долго. Вкратце — для поля каждого размера существует бинарная матрица A всех возможных ходов. Если представить изначальное поле в виде бинарного вектора X, то решение поля b — это решение системы бинарных линейных уравнений Ab = X. Нетрудно догадаться, что можно обратить матрицу A, сохранить её в переменной и находить решение уже любого поля по формуле b = A[sup]-1[/sup]X. Если кто-то хочет почитать подробнее, то здесь есть потрясающая статья, описывающая все нюансы. Мы двигаемся дальше.

К слову, решение существует не всегда для любой размерности. Размеры 5×5 или 17×17, например, решение имеют не всегда и в этой статье мы их не рассматриваем.

Генерация паттерновРассмотрим для примера следующее поле 20×20: ef547a4fd5604610968e34b9335b4dc0.png

А теперь давайте посмотрим на его решение:

0aec761303e0445ea222f2d53b189d33.png

Красиво, правда? Давайте увеличим размер (и выключим границы, а то от них рябит в глазах). Возьмём, например, 75×75:

72b40814ce7a4b88b6a145523a117669.png

И посмотрим на его решение:

f9b12ce1ac8d490eb01dd5c3b5523d3a.png

Довольно красиво. Но давайте не мелочиться, а сразу возьмём 150×150:

10fc4c24723b42d88dce97924cc477a5.png

И его решением будет… Ух ты.

bfde297520ba4036bc4f7dc862f5db5c.png

Завораживает. Издалека похоже на план города. Или на древнегреческую мозаику. Или на туркменский ковёр. Только почему-то зелёный.

А что будет, если попробовать получить решение для решения? Получим ещё один узор, производный. А потом можно сделать так ещё раз и получить ещё один производный узор.

da797d49ebd941de9674a4cedce310f7.png

cf24ee84024c4bfaa434a3d00f2c6251.png

57f0644958d44a8baff448824856b71e.png

При этом рано или поздно узоры зацикливаются. Для разных размеров разные периоды, при этом для чётных полей период больше, чем для нечётных (6×6 и 7×7, на больших размерах период уже в несколько сотен минимум):

37c8b974b5104b02bf524585025a420c.gifb2494afe720c438096e11f03ea7637a5.gif

При этом любой производный узор сохраняет любую осевую отражательную симметрию (анимации не зациклены, в зацикленной версии должно быть 2045 кадров):

1e289882e9b5415ab826e1519b4249d3.gif

1131a7b14e6c4bbaae13786a7e7065fd.gif

8d305714407449c89c2997f3a19125d5.gif

Помимо отражательной, производный паттерн также способен сохранять и вращательную симметрию:

1f82c72987a641049e76598b52c5caa7.gif

Хэши Помимо паттернов, Lights Out можно использовать как медленную, криптографически нестойкую (из-за детерминистичности), но экзотическую хэш-функцию.Как именно её считать? Ну, например, если считать всё поле начальным значением, то можно использовать в качестве хэша первые два столбца второго производного поля. Главную задачу хэш-функции они сохраняют — при небольшом изменении в начальных данных хэш меняется заметно. Вот, посмотрите сами:

bf9c8535a05948a4b910ee68f20c5460.gif5d0bf3f75cca47ffaae8fe7590f67130.gif

И только хэш:

47bf244f895947c89176b285e5dd4be5.gif0e02e5bb58ea432f8c5a786e27c7c184.gif

Без анимации, чтобы заметить различие:

89fbfd4ae96b4c098f31a310990ca574.png776406145a0249cbb40f274b8cb4b70b.png

Где это можно применять? Ну, наверное, нигде. Для контрольных сумм он слишком медленный. В криптографии тоже не применить, потому что очень легко подобрать начальные данные, дающие данный хэш. Зато необычно.

Скрытие данных Последнее применение — это скрытие данных внутри поля. Можно нарисовать на поле что-нибудь, затем несколько раз вычислить производный узор и выложить куда-нибудь. А благодаря цикличности изначально зашифрованное поле рано или поздно покажет себя. Вот пример (осторожно, гифка в 252 кадра). Если что, данные на 9-м кадре: b727c40462ea4de1933653ecec142577.gif

Приложение с исходниками на codeplex. К сожалению, пока есть версия только для Windows.

© Habrahabr.ru