Дорогие друзья, настал тот долгожданный день, который открывает новую серию выпуска Альманаха визуализации (часть 3)!

Многие из вас, вероятно, очень ждали новые советы по интерактивной визуализации данных в QlikView, и этот самый день настал. В этом выпуске хочу поделиться интересной игрой, реализованной в Qlik. Наверняка, все вы помните всеми известную игру в слова, где у вас есть слово? и на его основе вам нужно придумать наибольшее количество слов. Мы будем делать нечто похожее, но у нас с вами будет виртуальная клавиатура в интерфейсе QlikView, а основой игры станет прообраз игры «Эрудит» (в английским варианте “Scrabble”). Выбирая буквы на клавиатуре с экрана и составляя слово, мы получаем баллы за собранное слово. Итак, давайте пойдем по шагам, из которых вы узнаете, как это работает и как это реализовано в программе!

QlikView-эрудит: Вступление

Итак, цель игры – имея на руках некий набор букв, нужно сложить из них слово с максимальным количеством очков (используя при этом, ещё и не менее одной буквы уже находящейся на поле).

Рассмотрим, как решить данную задачу с использованием QlikView.

Исходные данные:

Итак, возьмем где-нибудь на просторах интернета список слов. Желательно существительные, единственного числа, именительного падежа. Пусть это будет файл: существительные.txt

Выполним их загрузку:

СЛОВА:
LOAD UPPER(@1) as СЛОВО
FROM ...\существительные.txt
(txt, codepage is 1251, no labels, delimiter is \t, msq)
WHERE not Exists(СЛОВО, UPPER(@1))
AND LEN(@1)<=7
AND LEN(@1)>=3;

НА ЗАМЕТКУ! Не забудем при загрузке, на всякий случай, нормализовать слова, например в заглавные буквы, и ограничим их длину от 3 до 7, а также добавим условие not Exists (чтобы исключить повторы слов).

Слова загружены, идем далее…

QlikView-Эрудит: Суть идеи

Ну, а теперь, идея. В общем виде, чтобы решать задачи подобного рода, то есть поиск максимума или минимума некой сложной функции с одной или несколькими переменными, применяется прием “расширения” всего диапазона возможных решений.

Рассмотрим подробнее, касательно нашего случая. Итак, у нас уже есть список слов. Проведем обогащение данных:

LEFT JOIN (СЛОВА)
LOAD СЛОВО,
MID(СЛОВО,1,1) as БУКВА_В_СЛОВЕ,
1 as БУКВА_В_СЛОВЕ_МЕСТО
RESIDENT СЛОВА;

Как видим в нашем примере, мы извлекли первую букву из каждого слова и запомнили, откуда мы её извлекли (в отдельном поле “БУКВА_В_СЛОВЕ_МЕСТО”). А теперь проведем само “расширение” до всего диапазона возможных решений (т.е. каждую букву каждого слова извлечем и запомним её место).

FOR n=2 TO 7
СЛОВА:
LOAD СЛОВО,
MID(СЛОВО,€(n),1) as БУКВА_В_СЛОВЕ,
€(n) as БУКВА_В_СЛОВЕ_МЕСТО
RESIDENT СЛОВА
WHERE БУКВА_В_СЛОВЕ_МЕСТО = 1
AND LEN(СЛОВО) >= €(n);
NEXT n;

Получили вот такую таблицу для решения нашей задачи (пример А).

Пример (А)

НА ЗАМЕТКУ! Только для полноты картины, если вы делали выбор букв на предыдущем шаге, то нажмите на кнопку “Очистить выбор букв” под таблицей. Если все фильтры со списка слов сняты, то кнопка не показывается.

QlikView-Эрудит: Создаем функцию выбора слов и назначения баллов

Переходим к функции…

Одним из критериев, максимизирующих нашу функцию подбора слов, является максимальная сумма очков за слово, поэтому нам необходимо добавить в созданную таблицу ещё и очки за букву:

LEFT JOIN (СЛОВА)
LOAD * INLINE [
БУКВА_В_СЛОВЕ,БУКВА_ОЧКИ
А,1
Б,3
В,2
Г,3
Д,2
Е,1
Ё,3
Ж,5
З,5
И,1
Й,2
К,2
Л,2
М,2
Н,1
О,1
П,2
Р,2
С,2
Т,2
У,3
Ф,10
Х,5
Ц,10
Ч,5
Ш,10
Щ,10
Ъ,10
Ы,5
Ь,5
Э,10
Ю,10
Я,3
];

Теперь в нашей таблице есть ещё и очки за букву (пример Б).

Пример (Б)

Ну вот, всё готово.

Осталось создать список букв (ListBox по полю БУКВА_В_СЛОВЕ) и Text Object, в котором напишем вот такую функцию:

Получили пример (В):

Пример (В)

Попробуйте теперь выбрать, к примеру, буквы Н,О,П,Р,С,Т. Как видим, функция не только отобрала список возможных слов, но и отсортировала их по уменьшению количества очков за слово.

QlikView-Эрудит: На пути к улучшениям или создаем доп. условия

Далее улучшим наш пример, чтобы можно было задавать дополнительные условия, например, указать букву на определенном месте в слове.

Для этого слегка доработаем два оператора нашего скрипта, которые обогащали и “расширяли” наши данные, а именно теперь они будут выглядеть вот так:

После чего мы создаем MultiBox с семью новыми полями и теперь можем задавать дополнительные ограничения или условия для подбора слов (пример Г).

Пример (Г)

QlikView-Эрудит: Как объединить баллы и количество слов в одну функцию

Ну, а сейчас рассмотрим пример, как отобрать в переменную одновременно сразу две расчетные информации:

  1. это наилучшее слово
  2. и то количество очков, которое оно составляет.

Для этого создадим в скрипте такую переменную:

А уже из этой переменной можно извлечь и слово и очки:

Вот наш итоговый результат, который мы получим после выполнения скрипта (пример Д)

Пример (Д)

Друзья, на этом сегодня у меня все! До новых встреч в эфире!

П.С. Совсем скоро будет новая статья из третьего выпуска альманах визуализации. Будет много нового и интересного