Недавно я играл в игру под названием Alcazar. Это настольная игра-головоломка, в которой ваша цель - войти через одну дверь, пройти через все квадраты и выйти через другую дверь. Единственные правила:
- Введите один раз, оставьте один раз;
- Пройти через все квадраты;
- Не проходите через квадрат более одного раза
На рисунке ниже показан пример доски Alcazar и справа решенная головоломка (конечно, это простая задача):
Вы можете найти больше головоломок на http://www.theincrediblecompany.com/try-alcazar и загрузить игру в PlayStore (PS: не реклама).
Моя проблема в том, что я почти закончил игру, за исключением одного уровня. Я просто не могу найти способ решить это. Итак, задача, которую я предлагаю: создать алгоритм, который решает любой нормальный 1- разрешимый 2-й уровень Алькасара.
Конечно, я не прошу никого создать интерпретатор изображений, чтобы прочитать изображение и решить головоломку (или я?). Поэтому я перерисовал вышеупомянутую загадку, используя символы рисования коробки. Головоломка и ее решение будут выглядеть так:
╔═══════╗ ╔═══════╗
║▒ ▒ ▒ ▒║ ║┌─┐ ┌─┐║
║ ║ ║ ║│ │ │║│║
╣▒ ▒ ▒║▒╠ ╣│ └─┘║└╠
║ ══╦═╩═╣ ║│══╦═╩═╣
║▒ ▒║▒ ▒║ ║└─┐║┌─┐║
║ ║ ║ ==> ║ │║│ │║
╣▒ ▒║▒ ▒║ ╣┐ │║│ │║
║ ║ ║ ║ ║│║│║│ │║
╣▒║▒ ▒ ▒║ ╣│║└─┘ │║
║ ║ ║ ║│║ │║
║▒ ▒ ▒ ▒║ ║└─────┘║
╚═══════╝ ╚═══════╝
На доске выше, ▒
ячейки должны быть заполнены.
Можно заметить, что между клетками есть вертикальный и горизонтальный зазор. Это потому, что мне пришлось вставить пространство между ячейками, чтобы добавить стены. Это означает, что единственными важными ячейками являются те, которые расположены выше, ниже, слева и справа от каждой ячейки. Диагонали могут быть удалены без потери информации. Например, на доске ниже оба представляют одну и ту же головоломку:
╔════╩╗ ═ ═ ╩
║▒ ▒ ▒║ ║▒ ▒ ▒║
║ ═══ ║ ═
║▒ ▒ ▒║ == ║▒ ▒ ▒║
║ ║
║▒ ▒ ▒║ ║▒ ▒ ▒║
╚╦════╝ ╦═ ══
Это также верно для решений. То есть не обязательно подключать ячейки:
╔════╩╗ ╔════╩╗ ╔════╩╗
║▒ ▒ ▒║ ║┌───┘║ ║┌ ─ ┘║
║ ═══ ║ ║│═══ ║ ║ ═══ ║
║▒ ▒ ▒║ == ║└───┐║ => ║└ ─ ┐║
║ ║ ║ │║ ║ ║
║▒ ▒ ▒║ ║┌───┘║ ║┌ ─ ┘║
╚╦════╝ ╚╦════╝ ╚╦════╝
В приведенном выше примере оба решения означают одно и то же.
Да, тестовые случаи. Вот они:
Головоломка 1
╔════╩╗ ╔════╩╗
║▒ ▒ ▒║ ║┌ ─ ┘║
║ ═══ ║ ║ ═══ ║
║▒ ▒ ▒║ => ║└ ─ ┐║
║ ║ ║ ║
║▒ ▒ ▒║ ║┌ ─ ┘║
╚╦════╝ ╚╦════╝
Головоломка 2
╔═════╗ ╔═════╗
║▒ ▒ ▒║ ║┌ ─ ┐║
║ ║ ║ ║ ║ ║
╣▒ ▒║▒║ ╣└ ┐║│║
║ ║ ║ ║ => ║ ║ ║ ║
╣▒║▒ ▒╠ ╣┐║│ │╠
║ ║ ║ ║ ║ ║
║▒ ▒ ▒║ ║└ ┘ │║
╚════╦╝ ╚════╦╝
Головоломка 3
╔════╩══╗ ╔════╩══╗
║▒ ▒ ▒ ▒║ ║┌ ┐ └ ┐║
║ ║ ║ ║ ║ ║ ║ ║
╣▒║▒ ▒║▒╠ ╣┘║└ ┐║│╠
║ ╚══ ║ ║ ║ ╚══ ║ ║
║▒ ▒ ▒ ▒╠ => ║┌ ─ ┘ │╠
║ ═══ ║ ║ ═══ ║
║▒ ▒ ▒ ▒║ ║│ ┌ ┐ │║
║ ║ ║ ║ ║ ║
║▒ ▒║▒ ▒║ ║└ ┘║└ ┘║
╚═══╩═══╝ ╚═══╩═══╝
головоломка 4
╔═══════╗ ╔═══════╗
║▒ ▒ ▒ ▒║ ║┌ ┐ ┌ ┐║
║ ║ ║ ║ ║ ║
╣▒ ▒ ▒║▒╠ ╣│ └ ┘║└╠
║ ══╦═╩═╣ ║ ══╦═╩═╣
║▒ ▒║▒ ▒║ ║└ ┐║┌ ┐║
║ ║ ║ => ║ ║ ║
╣▒ ▒║▒ ▒║ ╣┐ │║│ │║
║ ║ ║ ║ ║ ║ ║ ║
╣▒║▒ ▒ ▒║ ╣│║└ ┘ │║
║ ║ ║ ║ ║ ║
║▒ ▒ ▒ ▒║ ║└ ─ ─ ┘║
╚═══════╝ ╚═══════╝
Головоломка 5
╔══╩══════╗ ╔══╩══════╗
║▒ ▒ ▒ ▒ ▒║ ║┌ ─ ┐ ┌ ┐║
║ ║ ║ ║ ║ ║
║▒ ▒║▒ ▒ ▒╠ ║└ ┐║└ ┘ │╠
║ ╠════ ║ ║ ╠════ ║
║▒ ▒║▒ ▒ ▒║ => ║┌ ┘║┌ ─ ┘║
║ ║ ║ ║ ║ ║
║▒ ▒║▒ ▒ ▒╠ ║└ ┐║└ ─ ─╠
║ ╠═════╣ ║ ╠═════╣
║▒ ▒║▒ ▒ ▒║ ║┌ ┘║┌ ─ ┐║
║ ║ ║ ║ ║ ║
║▒ ▒ ▒ ▒ ▒║ ║└ ─ ┘ ┌ ┘║
╚══╦═══╦══╝ ╚══╦═══╦══╝
Головоломка 6
╔═══════════╗ ╔═══════════╗
║▒ ▒ ▒ ▒ ▒ ▒║ ║┌ ┐ ┌ ┐ ┌ ┐║
║ ║ ║ ║
║▒ ▒ ▒ ▒ ▒ ▒║ ║│ └ ┘ └ ┘ │║
║ ═══ ║ ║ ═══ ║
║▒ ▒ ▒ ▒ ▒ ▒║ ║└ ┐ ┌ ─ ─ ┘║
║ ═══ ║ ║ ═══ ║
╣▒ ▒ ▒ ▒ ▒ ▒╠ => ╣┐ │ │ ┌ ┐ ┌╠
║ ║ ║ ║
║▒ ▒ ▒ ▒ ▒ ▒║ ║│ │ │ │ │ │║
║ ║ ║ ║ ║ ║ ║ ║
║▒ ▒║▒ ▒║▒ ▒║ ║│ │║│ │║│ │║
║ ║ ║ ║ ║ ║ ║ ║
║▒ ▒ ▒ ▒ ▒ ▒║ ║└ ┘ └ ┘ └ ┘║
╚═══════════╝ ╚═══════════╝
Головоломка 7
╔════╩════════╦╩╗ ╔════╩════════╦╩╗
║▒ ▒ ▒ ▒ ▒ ▒ ▒║▒║ ║┌ ─ ─ ─ ─ ─ ┐║│║
║ ║ ║ ║ ║ ║ ║ ║ ║ ║
║▒║▒ ▒ ▒ ▒║▒ ▒ ▒║ ║│║┌ ─ ─ ┐║┌ ┘ │║
║ ║ ║ ═══ ║ ║ ║ ║ ║ ═══ ║ ║
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒╠ ║│ │║┌ ─ ┘ └ ┐ │╠
║ ║ ║ ║ ║ ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║ ║│ │ └ ┐ ┌ ┐ └ ┘║
║ ║ ║ ══╣ ║ ║ ║ ══╣
║▒ ▒ ▒║▒║▒ ▒ ▒ ▒║ ║│ └ ┐║│║│ └ ─ ┐║
║ ║ ║ ║ ║ ║ ║ ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║ ║│ ┌ ┘ │ └ ┐ ┌ ┘║
║ ║ ══╣ => ║ ║ ══╣
║▒ ▒ ▒ ▒ ▒ ▒║▒ ▒║ ║└ ┘ ┌ ┘ ┌ ┘║└ ┐║
╠══ ║ ╚══ ║ ╠══ ║ ╚══ ║
║▒ ▒ ▒ ▒ ▒║▒ ▒ ▒║ ║┌ ┐ └ ┐ │║┌ ─ ┘║
║ ║ ║ ║ ║ ║ ║ ║ ║ ║
║▒ ▒ ▒║▒║▒ ▒ ▒ ▒║ ║│ └ ┐║│║│ └ ─ ┐║
║ ║ ║ ║ ╔══ ║ ║ ║ ║ ║ ╔══ ║
║▒║▒ ▒ ▒ ▒║▒ ▒ ▒║ ║│║┌ ┘ │ │║┌ ┐ │║
║ ║ ║ ║ ║ ║ ║ ║ ║ ║
║▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║ ║│ └ ─ ┘║└ ┘ │ │║
║ ╚══ ║ ║ ╚══ ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║ ║└ ─ ─ ─ ─ ─ ┘ │║
╚════╦═╦═╦═════╦╝ ╚════╦═╦═╦═════╦╝
Головоломка 8 (Извините, у меня действительно нет решения этой проблемы)
╔══╩╦══╩═══╩═╩═╩═══╩╗
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
║ ║ ║
╣▒ ▒║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
║ ╚══ ╔══ ╔═══╣
╣▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║▒ ▒╠
║ ║ ╔══ ║ ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
║ ║ ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒╠
║ ║ ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
║ ╔═══╗ ╚══ ║
╣▒ ▒║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒║
║ ║ ║ ║
╣▒ ▒║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒╠
║ ══╝ ║ ╔══ ║
║▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║▒ ▒║
║ ══╗ ╚══ ╔══ ║ ║
╣▒ ▒ ▒║▒ ▒ ▒║▒ ▒ ▒ ▒╠
║ ║ ║ ║ ║
╣▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║▒ ▒║
║ ═══ ══╗ ║ ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
╠══ ║ ║ ╔══ ║
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒║▒ ▒╠
║ ╚══ ║ ║ ║ ║
╣▒ ▒ ▒ ▒║▒ ▒║▒ ▒ ▒ ▒╠
║ ║ ║ ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
╚══╦═══╦═══╦═╦═╦═╦═╦╝
вход
Ввод вашего кода может иметь любое представление при условии соблюдения следующих правил:
Это должен быть графический ввод. Так что невозможно прочитать список координат, например.
Горизонтальные стены, вертикальные стены и двери должны быть различимы, и они должны быть сделаны из видимого символа (без пустых символов).
▒
Могут быть заменены пробелами. Я просто использовал другого персонажа, чтобы выделить их.
Выход
Вывод также может иметь любое представление, если оно соответствует этим правилам:
Это должен быть графический вывод. То есть путь можно увидеть, взглянув на него.
Правило номер один подразумевает, что символы пути будут разными. То есть должно быть не менее 6 символов пути; горизонтальный, вертикальный и углы.
Чтобы ответ был действительным, выходные данные должны быть на той же доске, что и входные данные (очевидно) со всеми
▒
заполненными ячейками (в моем представлении ). Заполнение пробелов между ячейками необязательно.
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
1 В некоторых уровнях Alcazar есть дополнительные ячейки и туннели. Это не будет рассматриваться.
2 Некоторые доски Alcazar невозможны.
источник
Ответы:
Python 3 ,
809728723714693688684663657641639627610571569 байтРедактировать: Сохранено 55 байтов благодаря @ Филипе Нарди Батиста
Не выполняет последний контрольный пример за 60 секунд на TIO, но, тем не менее, должен работать правильно. Возвращает список координат для пути. Около 400 байтов используются для получения списков данных из ввода / вывода.
Попробуйте онлайн!
источник
exec(...)
строке есть пять новых строк, представленных как\n
5 * 2 = 10 байтов. Использование строки в тройных кавычках добавит 4 байта (...''...''...
), но затем удалит 5 байтов, поскольку могут использоваться фактические символы новой строки. Всего это может сэкономить один байт.APL (Dyalog Classic) , 319 байтов
Попробуйте онлайн!
Ввод используется
=#F7LJ<>^v.
вместо═║╔╗╚╝╣╠╩╦▒
того, чтобы вписаться в классическую кодировку .Все тестовые случаи, кроме последнего, проходят в течение нескольких секунд.
Последний тест занимает 47 минут на моем компьютере и не дает решения.
Когда получающийся путь использует дверь около угла, он может быть отображен неправильно (как будто тропа разветвляется и проходит через дополнительную воображаемую дверь), но он все еще различим и однозначен.
источник
JavaScript (ES6), 274 байта
Ввод в виде многострочной строки, каждая строка заканчивается символом новой строки. Двери отмечены символом «2»
Выведите в виде многострочной строки с путем, отмеченным символом «1», очень легко различимым.
Это поиск в глубину , пробуя все пути и возвращаясь назад, когда застрял. Это совсем не эффективно, но может решить головоломки 1 ... 6 менее чем за 1 минуту.
Меньше гольфа
Внутри тестового фрагмента есть решение, использующее DFS с некоторым ограничением, которое решает головоломку 7 менее чем за минуту (на моем ПК). Головоломка 8 не имеет решения. Ограничения:
Тест
Осторожно, головоломка 7 намного превышает тайм-аут для выполнения javascript в любом браузере (с использованием решателя Short and Slow)
Показать фрагмент кода
источник