Введение
Эта задача аналогична задачам проекта Эйлера . Я придумал это, потому что я играл в обманчиво простую настольную игру и не мог найти эффективное решение, чтобы ответить на простой вопрос о его механике.
Quarto - забавный вариант из 4-х подряд. Играется на доске 4 на 4 с 16 уникальными фигурами (никакие фигуры не дублируются). Каждый ход каждый игрок размещает 1 фигуру на доске. Каждая часть имеет 4 бинарных характеристики (короткая / высокая, черная / белая, квадратная / круглая, полая / сплошная). Цель состоит в том, чтобы сделать четыре подряд, по горизонтали, вертикали или вдоль двух диагоналей, для любой из четырех характеристик! Итак, 4 черных, 4 белых, 4 высоких, 4 коротких, 4 квадратных, 4 круглых, 4 полых или 4 сплошных.
На картинке выше показана законченная игра, здесь четыре подряд из-за 4 квадратных фигур.
Вызов
В Quarto некоторые игры могут закончиться ничьей.
Общее количество возможных конечных позиций составляет 16!
около 20 трлн.
Сколько из этих конечных позиций - ничьи?
правила
Решением должна быть программа, которая рассчитывает и выводит общее количество конечных позиций, которые рисуются. Правильный ответ
414298141056
Вы можете использовать только информацию о правилах игры, которые были выведены вручную (без компьютерного подтверждения).
Допускается математическое упрощение задачи, но оно должно быть объяснено и доказано (вручную) в вашем решении.
Победителем становится тот, у кого наиболее оптимальное решение с точки зрения времени работы процессора.
Чтобы определить победителя, я буду запускать каждое решение с заявленной продолжительностью менее 30 м на MacBook Pro 2,5 ГГц Intel Core i7 с 16 ГБ ОЗУ .
Нет бонусов за решение, которое также работает с досками других размеров. Хотя это было бы хорошо.
Если применимо, ваша программа должна быть скомпилирована в течение 1 минуты на упомянутом выше оборудовании (чтобы избежать злоупотреблений при оптимизации компилятора)
Лазейки по умолчанию не допускаются
Материалы
Пожалуйста, напишите:
- Код или ссылка на код в github / bitbucket.
- Вывод кода.
- Ваше локально измеренное время бега
- Объяснение вашего подхода.
Крайний срок
Последний срок подачи заявок - 1 марта, так что еще много времени.
Ответы:
С: 414298141056 дро найдено примерно
52,5 минут.Просто простой поиск в глубину с таблицей транспонирования с учетом симметрии. Мы используем симметрию атрибутов при перестановке и 8-кратную двугранную симметрию доски.
Измеренная оценка (@wvdz):
Оценка (пользователь + sys): 1м35,727с
источник
-O3 -march=native
и получил 1m48s на моей машине. (CC @wvdz)Ява, 414298141056 тянет, 23м42.272с
Я надеюсь, что не стоит осуждать публикацию решения своего собственного вызова, но причина, по которой я разместил этот вызов в первую очередь, заключалась в том, что это сводило меня с ума, что я не мог придумать эффективное решение самостоятельно. Моя лучшая попытка заняла бы несколько дней.
Изучив ответ user1502040 , я действительно смог изменить свой код, чтобы он выполнялся в течение довольно разумного времени. Мое решение все еще значительно отличается, но я украл некоторые идеи:
Основное различие между этим решением и user1502040 заключается в том, что я использую не таблицу Zobrist, а каноническое представление доски, где я считаю, что каждая доска имеет 48 возможных транспозиций по характеристикам (2 * 4!). Я не вращаю и не транспонирую всю доску, а только характеристики фигур.
Это лучшее, что я мог придумать. Идеи для очевидных или менее очевидных оптимизаций приветствуются!
Измеренная оценка:
Оценка (пользователь + sys): 23м42.272с
источник