Рубрика «головоломки» - 2

image

Все мы имеем опыт прохождения собеседований. Все когда-то сидели в комнате с зевающим эйчаром, пытающимся разобраться, о чём поговорить, когда ваши планы на ближайшие 5 лет и все 7 сильных черт вашего характера ей уже известны. Некоторые успели побывать и по другую сторону баррикад, обстреливая каверзными вопросами лезущих на амбразуру открытой вакансии смертников. В любом случае, сталкивались со столь занимательным процессом собеседования. Сталкивались, и, может быть, задумывались, насколько оптимально он устроен, насколько хорошо собеседования справляются со своей задачей поиска наиболее подходящего сотрудника, а точнее, какие виды собеседований с ней справляются, ну а какие нет. Объявленная астрологами неделя постов про собеседования — хороший повод это обсудить.
Читать полностью »

tl;dr За последние десятилетия мода на собеседования программистов менялась несколько раз, и каждая из них выглядит нелепо в ретроспективе. Либо мы наконец-то нашли настоящий секрет эффективных собеседований, либо увлеклись очередным модным течением, которое через десять-двадцать лет покажется столь же нелепым.

Когда я спрашиваю людей в модных больших технологических компаниях, почему на собеседовании так обязательно спрашивать об алгоритмах, самый распространённый ответ — что-то вроде: «У нас такой масштаб, мы не можем позволить, чтобы кто-то случайно написал функцию O(n^2) и повалил всю систему»1. Что особенно забавно, в последнее время я немало применял на практике эти алгоритмы и решал реальные проблемы, но не могу пройти собеседования, где о них спрашивают! Думаете, я проваливаю половину собеседований или что-то в этом роде? Нет, больше половины. Я участвовал примерно в 40 «настоящих» собеседованиях и прошёл, может, одно или два. Или ни одного2.

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

Как и обещали, мы начинаем праздничный квест:

Потерянные подарки Санты: новогодний IT-квест от Фланта - 1

О его старте зарегистрированные участники (таковых оказалось более 200) были уведомлены в 11:00 MSK по почте.

Победителем станет тот, кто первым разместит правильную финальную картинку (с подарками Санты) в комментариях к этой публикации. Просим не давать подсказки в комментариях до этого момента.Читать полностью »

Потерянные подарки Санты. Анонс IT-квеста на 6 января - 1

К Новому году, как обычно, Санта и его помощники готовили подарки. Сегодняшнее утро не предвещало ничего необычного — всё шло по плану: гудел конвейер с игрушками для детей и взрослых, гномы и эльфы шуршали упаковочной бумагой, а волшебные олени сопели носами, примеряя новую упряжь…

Вдруг свет погас, раздался грохот и всё помещение трюма заполнили клубы дыма. Когда дым развеялся, подарков не было, а на полу лежала записка, которая гласила:

{Зловеще} ХА-ХА-ХА! {/Зловеще} Эй, гики в красных шапочках, все ваши подарки у нас! Чтобы их забрать, нужно пройти квест из череды загадок!

Читать полностью »

Введение

В статье рассматривается «Y-метод» сборки кубика Рубика — его легко понять и запомнить. Он основан всего на одной последовательности, которая называется «Y-движение». Поняв этот алгоритм, вы навряд ли забудете как собрать кубик самостоятельно.Читать полностью »

Ловим кота с TLA+ - 1 Формальные методы считаются эффективным, но неоправданно сложным способом обеспечения надежности программного обеспечения. Используемые при этом инструменты существенно отличаются от привычных программисту. Эта статья написана с целью снизить порог вхождения в этот инструментарий. Я применю систему model checking не для решения сложно формулируемых задач спецификации ПО, а для решения понятной даже школьникам головоломки.

Вы находитесь в прямом коридоре с семью комнатами по одну сторону. В одной из них находится кот. За один шаг можно заглянуть в одну из комнат, если там есть кот, он пойман. Как только дверь закроется, кот перейдет в одну из соседних комнат к той, в которой находился. Задача — поймать кота.
Читать полностью »

image

Пару месяцев назад мне наконец пришлось признать, что я недостаточно умён, чтобы пройти некоторые уровни головоломки Snakebird. Единственным способом вернуть себе часть самоуважения было написание солвера. Так я мог бы притвориться, что создать программу для решения головоломки — это почти то же самое, что и решить её самому. Код получившейся программы на C++ выложен на Github. Основная часть рассматриваемого в статье кода реализована в search.h и compress.h. В этом посте я в основном буду рассказывать об оптимизации поиска в ширину, который бы потребовал 50-100 ГБ памяти, чтобы он уместился в 4 ГБ.

Позже я напишу ещё один пост, в котором будет описана специфика игры. В этом посте вам нужно знать, что мне не удалось найти никаких хороших альтернатив грубому перебору (brute force), потому что ни один из привычных трюков не сработал. В игре множество состояний, потому что есть куча подвижных или толкаемых объектов, при этом важна форма некоторых из них, которая может меняться со временем. Не было никакой пригодной консервативной эвристики для алгоритмов наподобие A*, позволяющих сузить пространство поиска. Граф поиска был ориентированным и заданным неявно, поэтому одновременный поиск в прямом и обратном направлении оказался невозможным. Единственный ход мог изменить состояние множеством несвязанных друг с другом способов, поэтому не могло пригодиться ничего наподобие хеширования Зобриста.

Приблизительные подсчёты показали, что в самой большой головоломке после устранения всех симметричных положений будет порядка 10 миллиардов состояний. Даже после упаковки описания состояний с максимальной плотностью размер состояния составлял 8-10 байт. При 100 ГБ памяти задача оказалась бы тривиальной, но не для моей домашней машины с 16 ГБ памяти. А поскольку Chrome нужно из них 12 ГБ, мой настоящий запас памяти ближе к 4 ГБ. Всё, что будет превышать этот объём, придётся сохранять на диск (старый и ржавый винчестер).
Читать полностью »

В этом посте описывается генератор уровней для моей игры-головоломки Linjat. Пост можно читать и без подготовки, но он легче усвоится, если сыграть в несколько уровней. Исходный код я выложил на github; всё обсуждаемое в статье находится в файле src/main.cc.

Примерный план поста:

  • Linjat — это логическая игра, в которой нужно закрыть все числа и точки в сетке линиями.
  • Головоломки процедурно генерируются при помощи комбинации из солвера, генератора и оптимизатора.
  • Солвер пытается решить головоломки так, как это делал бы человек, и присваивает каждой головоломке оценку интересности.
  • Генератор головоломок создан таким образом, чтобы можно было с лёгкостью менять одну часть головоломки (числа) и при этом все остальные части (точки) менялись таким образом, чтобы головоломка оставалась решаемой.
  • Оптимизатор головоломок многократно решает уровни и генерирует новые вариации из наиболее интересных, найденных на текущий момент.

Правила

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

Создание процедурного генератора головоломок - 1

Цель игрока — прочертить вертикальную или горизонтальную линию через каждое из чисел при соблюдении трёх условий:

  • Линия, идущая через число, должна иметь ту же длину, что и число.
  • Линии не могут пересекаться.
  • Все точки необходимо закрыть линиями.

Пример решения:

Создание процедурного генератора головоломок - 2

Ура! Дизайн игры готов, UI реализован, и теперь единственное, что осталось — найти несколько сотен хороших головоломок. А для подобных игр обычно не имеет смысла пытаться создавать такие головоломки вручную. Это работа для компьютера.
Читать полностью »

Поставлен рекорд по сборке кубика Рубика … ногами - 1

На Хабре регулярно публикуются новости о рекордах по сборке кубика Рубика. Последнее достижение принадлежит австралийцу Феликсу Земдегсу, который смог решить головоломку всего за 4,221 секунды. Так быстро собирать кубик могут лишь те люди, кто регулярно (и помногу) тренируются. Тот же Феликс купил свой первый кубик в возрасте 12 лет. В 2010 он поставил первый рекорд мира, ну а в прошлом году сделал вообще практически невозможное.

Ну а теперь появился еще один рекордсмен, который собирает кубик ногами. Понятно, что для выполнения более-менее нормальных манипуляций с головоломкой ногами нужны тренировки. И действительно, к текущему результату в 16,96 секунд чемпион по имени Даниэль Роуз-Левин шел около пяти лет.
Читать полностью »

Puzzle Script — это минималистичный игровой движок для создания головоломок для HTML5, имеет открытые исходники. Примеры готовых игр можно посмотреть здесь.

Часть 1. Создаём первую игру на Puzzle Script.

Puzzle Script — это бесплатная онлайн-программа, которая используется для создания игр-головоломок. Наиболее известен она благодаря созданию головоломок с толканием блоков наподобие моей The Nodus. В этой части мы создадим игру, изучив базовые функции Puzzle Script, а в следующей приступим к программированию.

Создание игр-головоломок на Puzzle Script - 1

Перейдите на веб-сайт движка. Нажмите Make a Game, чтобы открыть редактор Puzzle Script.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js