Решаем головоломку с помощью SQL сервера.

Решаем головоломку с помощью SQL сервера.

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

Повозившись с полчаса, я понял, что головоломка вовсе не простая. Штука в том, что каждый отдельный квадратик может быть повернут вверх и кроме того занимать любое из 9 возможных положений в общей картинке. Довольно легко правильно разместить 6, 7 или даже 8 квадратов, чтобы получить целую картинку, но при этом последний обязательно не подходит. Убедившись в слабости своих комбинаторных способностей, я решил применить профессиональный подход. Работал я в должности Software Engineer и получал зарплату за разработку какого-то фантастически громоздкого приложения на основе сервера Oracle. Вот я и решил использовать свой привычный инструментарий - таблицы и запросы. Я создал простенькую таблицу - как бы математическую модель головоломки, и написал довольно несложный SQL-запрос. На все ушло меньше часа и, к моему удивлению, когда я запустил запрос, сервер за несколько секунд выдал мне искомое решение. Такой способ использования сервера от Oracle показался мне настолько интересным, необычным и даже забавным, что я решил поделиться решением с коллегами-программистами.

Вот как это было сделано: во-первых, я присвоил номер каждому из 9 фрагментов. Затем каждому из 8 различных фрагментов изображения попугая я присвоил некое число, с таким расчетом, чтобы при сложении чисел верхней и нижней половинки каждого из четырех видов попугаев в результате получался ноль. Затем в схеме базы данных создал таблицу ‘Parrot’ из 5 колонок, где каждая строка (запись) описывает одно из четырех возможных положений малого квадрата головоломки, получаемых при его вращении. Таким образом, каждый квадратик описывается 4-мя строками, затем 4 строки для следующего квадратика и т. д. Всего в таблице 36 записей.

Первые 4 колонки хранят число, присвоенное соответствующему фрагменту изображения попугая, последняя колонка хранит номер, присвоенный данному квадрату головоломки. Теперь можно заселять таблицу. Для определенности я начинал описывать каждый квадратик, повернув его фрагментом серого попугая вверх и двигался по часовой стрелке, занося в колонки числа, соответствующие верхнему, правому, нижнему и левому элементу рисунка. Затем квадратик поворачивался на 90 градусов по часовой стрелке и записывались следующие четыре числа, начиная с верхнего элемента рисунка. Полученные таким способом 4 записи имели одинаковое значение в пятой колонке таблицы.

Сам код запроса я опускаю, так как он очень простой, и каждый сможет повторить его сам. Опишу лишь вкратце, как я его писал. Очевидно, мне нужны все возможные комбинации из всех 9 квадратиков. Для каждого квадрата внутри одной комбинации мне достаточно знать его уникальный номер и число, соответствующее, скажем, верхнему элементу. Теперь из этого набора всех возможных комбинаций выберем лишь те, у которых соседствующие части рисунка дадут цельное изображение попугая – иными словами, те, у которых сложение соответствующих чисел даст в результате ноль. Затем исключаем те комбинации, в которых обе части совпадающего рисунка принадлежат одному и тому же квадратику.

Вот, собственно и все! Запускаем запрос и мгновенно получаем результат. Если мы все сделали верно, то получим 4 комбинации. Все они описывают одну и ту же большую картинку, лишь повернутую на 90 градусов. По-моему, это очень забавный и несколько неожиданный способ использования SQL. Если не выдавать секрета, то в глазах подружек можно выглядеть вполне круто. Кстати, в инструкции к головоломке сказано: для детей от трех лет. А между прочим, такого рода задачи находят и вполне серьезное применение. В тех западных компаниях, где заботятся о своих программистах, проводятся регулярные тренинги - предлагается решать различные задачи, не относящиеся к непосредственному текущему заданию сотрудников. Это позволяет не «зацикливаться» на монотонной рутине, поддерживает кругозор и вносит дух соревнования.


Карта сайта


Информационный сайт Webavtocat.ru