Рубрики
Без рубрики

Оптимальная тактика для WORDLE

Есть такая игра WORDLE, в которой нужно угадывать слова. Ты предлагаешь игре пятибуквенное слово, а она в ответ красит буквы зелёным, если они есть в угадываемом слове и стоят на правильных местах, жёлтым если они есть в угадываемом слове, но на других местах, и серым, если этих букв в слове нет. Цель — отгадать слово не более, чем за шесть попыток.

Я в своё время написал скрипт, который перебрал тройки пятибуквенных слов и нашёл трио слов, которое открывает 15 самых частоиспользуемых букв.

Сейчас появилась версия этой игры для шести-, семи-, восьми- и даже девятибуквенных слов. Поэтому вопрос поиска оптимальных троек встал с новой силой. Предлагаю вам поупражняться в SQL и предложить подходы, которые позволят найти оптимальные слова за разумное время и при этом не положить сервер. Если решите попробовать на боевых данных, оставьте в комментариях свою почту или telegram, пришлю скрипт заполнения словаря.

Рубрики
Без рубрики

ASSERT

Оператор ASSERT используется для проверки определённых условий. Это оператор будет выполняться для каждой строки из набора данных.

Типичный пример, когда можно встретить этот оператор — проверка условия CHECK. Например, для столба можно ограничить список возможных значений. Тогда при вставке данных ASSERT будет проверять для каждой строки значение, переданное в столбец. К сожалению в реальной работе эти возможности SQL используют реже, чем следует. Поэтому мы рассмотрим выдуманный и сильно упрощённый пример.

DROP TABLE IF EXISTS traffic_light;
CREATE TABLE traffic_light
(
    id INT IDENTITY(1, 1),
    color CHAR(1),
    CONSTRAINT CHECK_COLOR CHECK (color IN ( 'G', 'R' ))
);
INSERT INTO dbo.traffic_light (color) VALUES ('Y');

В этой таблице мы разрешаем цвету условного светофора быть или зелёным, или красным. При вставке данных в эту таблицу SQL Server генерирует следующий план:

Если разобраться с тем, что именно проверяет ASSERT, то мы увидим, что он возвращает 0, если в столбец color передаётся значение отличное от G или R и NULL в противном случае. Ошибка будет сгенерирована, есть ASSERT вернёт значение отличное от NULL.

Помимо проверки CHECK-ограничений ASSERT используется и при проверке ограничений внешних ключей. Попробуем чуть усложнить наш пример, добавив ещё одну таблицу с потенциально возможными цветами светофора и связав две таблицы между собой.

DROP TABLE IF EXISTS possible_light;
CREATE TABLE possible_light
(
    color CHAR(1) PRIMARY KEY
);
INSERT INTO dbo.possible_light (color) VALUES ('R'),('Y'),('G');
ALTER TABLE dbo.traffic_light
ADD CONSTRAINT fk_light
    FOREIGN KEY (color)
    REFERENCES dbo.possible_light (color);

Теперь при вставке данных в первую таблицу план усложнится:

Если идти справа налево, то первый ASSERT как и раньше проверит CHECK ограничение, а второй ASSERT проверит корректность связи по ключам.

В предикате второго оператора ASSERT мы видим непонятное условие Expr1007, но всё станет на свои места, если отобразить план запроса в виде текста:

  |--Assert(WHERE:(CASE WHEN NOT [Pass1008] AND [Expr1007] IS NULL THEN (0) ELSE NULL END))
       |--Nested Loops(Left Semi Join, PASSTHRU:([lessons].[dbo].[traffic_light].[color] IS NULL), OUTER REFERENCES:([lessons].[dbo].[traffic_light].[color]), DEFINE:([Expr1007] = [PROBE VALUE]))
            |--Assert(WHERE:(CASE WHEN [lessons].[dbo].[traffic_light].[color]<>'R' AND [lessons].[dbo].[traffic_light].[color]<>'G' THEN (0) ELSE NULL END))
            |    |--Table Insert(OBJECT:([lessons].[dbo].[traffic_light]), SET:([lessons].[dbo].[traffic_light].[color] = [Expr1004],[lessons].[dbo].[traffic_light].[id] = [Expr1003]))
            |         |--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(char(1),[@1],0)))
            |              |--Compute Scalar(DEFINE:([Expr1003]=getidentity((1525580473),(6),NULL)))
            |                   |--Constant Scan
            |--Clustered Index Seek(OBJECT:([lessons].[dbo].[possible_light].[PK__possible__900DC6E8209DDE1B]), SEEK:([lessons].[dbo].[possible_light].[color]=[lessons].[dbo].[traffic_light].[color]) ORDERED FORWARD)

По строке DEFINE:([Expr1007] = [PROBE VALUE]) становится понятно, что это выражение — просто результат объединения таблиц. Этим выражением ASSERT проверяет, что вставляемое значение действительно есть в таблице possible_light.

Наконец, рассмотрим ещё один случай, где оператор ASSERT может встречаться в реальной работе. Речь идёт о подзапросах. Во многих ситуациях встречается «скалярный» подзапрос. Т.е. такой подзапрос, который возвращает строго одно значение. В качестве тестового запроса рассмотрим следующий код:

SELECT * FROM dbo.traffic_light tl
WHERE (tl.color>
(SELECT pl.color FROM dbo.possible_light pl WHERE (1=1)and(pl.color>'A'))
)

Практического смысла он не несёт, но позволяет продемонстрировать ситуацию, когда мы сравниваем скалярное значение с результатом подзапроса. План получился не очень сложный:

Самый интересный блок тут это часть где данные из possible_light агрегируются, чтобы подсчитать количество строк, а потом полученное значение передаётся в ASSERT. Думаю, вы уже сами догадались, что Expr1004 это результат агрегации

Stream Aggregate(DEFINE:([Expr1004]=Count(*)...

Вот такой большой пост у меня получился о простейшем, но очень важном операторе.

Рубрики
Без рубрики

Окукливание личинки жука

Я довольно давно ничего не писал в блог, но за прошедшее время я активно пополнял коллекцию своих животных. Одним из самых необычных приобретений была личинка жука Megasoma mars.

Почти три месяца эта личинка лежала у меня в контейнере и просто поедала землю, но в середине июня поведение изменилось: личинка перестала не только есть, но и двигаться. Я даже вполне серьёзно опасался, что она умерла. Но буквально через неделю, снова заглянув в контейнер, я очень удивился. Вместо огромной белой личинке в углублении лежала огромная коричневая личинка!

Надеюсь, ещё через некоторое время я напишу новый пост в котором покажу вам уже взрослого жука.

Рубрики
Без рубрики

Добавил новых питомцев в общий список

Я горжусь страницей со списком всех моих питомцев. Создать её изначально было тяжело, но и поддерживать, постоянно пополняя, тоже непросто. Сегодня я добавил в дерево довольно много новых листьев. Если вам интересно, можете попробовать найти, где систематически находятся вновь добавленные виды:

Рубрики
Без рубрики

Про образованных студентов

Знаете, почему «каждый образованный студент должен курить папиросы»? Некоторые уже догадались, что это мнемоника. Она помогает запомнить правильную последовательность геологических периодов: кембрий, ордовик, силур, девон, карбон, пермь. Эти периоды в совокупности составляют палеозойскую эру — первую эру явной жизни. Тогда же возникли все современные типы животных, в том числе иглокожие. Именно к этому типу относится окаменевшая лилия на фотографии. Как думаете, из какого она периода?

Рубрики
Без рубрики

Ещё немного о книдоцитах

Я уже писал о книдоцитах айптазий, но стрекательные клетки есть не только у них. Сегодня я под микроскопом рассматривал соответсвующие клетки крупного родактиса. оказалось, что плотность книдоцитов у него меньше, а вот нематоцисты гораздо длиннее. Если у айптазий длина нематоциста составляла примерно полторы — две длины книдоцита, то у родактисы нематоцист более чем в 20 раз длиннее клетки.

Рубрики
Без рубрики

Chromodoris bulloki

Chromodoris — род заднежаберных моллюсков. Они очень красиво и необычно выглядят. В теории такие моллюски могли бы стать украшением маленьких аквариумов, но на практике это невозможно. Основных проблем две: во-первых, моллюски очень часто заканчивают свою жизнь в помпах течения, а во-вторых, непонятно чем эти моллюски питаются. Т.е. даже если удастся создать для них безопасный аквариум, в течение максимум полугода они умрут от голода.

Рубрики
Без рубрики

Amphiprion akallopisos

Пестроносый клоун относится к тому же самому роду, что и известная рыбка Немо из мультика. На первый взгляд этот клоун не впечатляет, но у него есть интересная особенность. Как и большинство представителей рода, эти клоуны живут в симбиозе с актиниями, и рьяно защищают своего анемона. Но помимо физического контакты, эти рыбы пытаются предупредить непрошенных гостей звуковыми сигналами. При виде непрошенных гостей Amphiprion akallopisos издаёт звуки похожие на щелчки и чириканье. Так что этот невзрачный клоун опровергает известное сравнение «нем как рыба».

Рубрики
Без рубрики

Chalice sp.

Об этом коралле я практически ничего не могу рассказать. Как быстро он растёт я не знаю, насколько агрессивен, тоже не знаю, строго говоря, я даже не знаю, что это за вид такой.

Собирательно похожие кораллы часто называют чалисами. Они не любят яркий свет и сильное течение, медленно растут и очень красивы.

Рубрики
Без рубрики

Цветение сакуры

В прошлом году из-за эпидемии COVID-19 и соответствующих ограничений я не смог попасть в ботанический сад в период цветения сакуры. В этом году с ограничениями попроще, поэтому я с радостью делюсь с вами фотографиями. Кстати, впервые на моей памяти в сад не было очереди. Наверное, основной вклад в отсутствие людей внесла плохая погода, а ещё многие могли банально уехать из Москвы на «нерабочие» дни.