Ваша задача - сыграть роли обоих персонажей в этой сцене с самого начала. В этом Кобб бросает вызов Ариадне:
У вас есть две минуты, чтобы создать лабиринт, который занимает одну минуту, чтобы решить.
Некоторые свободы будут приняты в этом описании. Самое главное, что эта задача не основана на времени, скорее оценки основаны на эффективности ваших лабиринтов и решателей лабиринтов.
Я прошу прощения за многочисленные правки этой проблемы, поскольку мы переходим к простому и честному формату.
Часть I: формат лабиринта
Все лабиринты квадратные. Ячейка в лабиринте представлена в виде кортежа с нулевым индексом row column
.
Стены представлены двумя бинарными строками: одна для горизонтальных стен (которые блокируют движение между рядами) и вертикальные стены (наоборот). На NxN
лабиринте есть Nx(N-1)
возможные стены каждого типа. Давайте возьмем пример 3x3, где ячейки помечены:
A B | C
---
D | E F
---
G H | I
все возможные вертикальные стенки являются: AB BC DE EF GH HI
. В переводе на строку, стены указаны 011001
для вертикальных стен и 010010
для горизонтальных стенок. Также под «двоичной строкой» я подразумеваю «символы« 0 »и« 1 »».
Полный формат лабиринта представляет собой строку, которая содержит в следующем порядке:
- ширина
- начать кортеж клетки
- кортеж конечных клеток
- горизонтальные стены
- вертикальные стены
Например, этот лабиринт:
0 1 2 3 4
_________
0 | | E| _|
1 | _|_|_ |
2 |_ _ _ | |
3 | _ _ | |
4 |____S|___|
start:(4,2)
end:(0,2)
отформатирован к этому:
5
4 2
0 2
00001011101110001100
10100110000100010010
Часть II: Архитектор
Программа Architect создает лабиринт. Он должен играть по правилам и предоставлять действительный лабиринт (тот, где решение существует, и конец не находится сверху начала).
Входные данные: два натуральных числа:
size [random seed]
Где size
будет [15, 50]
. Рекомендуется использовать случайное начальное число, чтобы совпадения можно было воспроизвести, хотя это и не требуется.
Вывод: действительный лабиринт размера x (квадратный), использующий формат, описанный в части I. «Действительный» означает, что решение существует, и начальная ячейка не равна конечной ячейке.
Оценка Архитектора в данном лабиринте
# steps taken to solve
–––––––––––––––––––––––––––––
max(dist(start,end),(# walls))
Таким образом, архитекторы получают вознаграждение за сложные лабиринты, но наказываются за каждую построенную стену (это заменяет ограничение времени Ариадны). В dist()
функции гарантирует , что лабиринт без стен не получить бесконечный счет. Внешние границы лабиринта не влияют на количество стен.
Часть III: Решатель
Решатель пытается решить лабиринты, созданные другими архитекторами. Существует своего рода туман войны: включены только стены, прилегающие к посещенным клеткам (все остальные заменены на «?»)
вход: тот же формат лабиринта, но с '?' где стены неизвестны, дополнительная строка для текущего местоположения и разделенный запятыми список допустимых вариантов из этого местоположения. (Это большое редактирование, предназначенное для упрощения написания функции разбора лабиринта)
пример (такой же, как и в предыдущем лабиринте 5х5 после выполнения шага влево)
5
4 2
0 2
???????????????011??
????????????????001?
4 1
4 0,4 2
Что соответствует примерно так, где ?
туман
0 1 2 3 4
_________
0 |????E????|
1 |?????????|
2 |?????????|
3 | ?_?_????|
4 |__C_S|_?_|
вывод: один из кортежей из списка допустимых вариантов
Оценка каждого Солвера является обратной к оценке Архитектора.
Часть IV: Король горы
Архитекторы и Солверы получают отдельные оценки, поэтому потенциально может быть два победителя.
У каждой пары архитекторов и решателей будет много шансов перехитрить друг друга. Результаты будут усреднены по всем тестам и оппонентам. Вопреки правилам игры в гольф, выигрывает самый высокий средний балл!
Я намерен, чтобы это продолжалось, но я не могу гарантировать, что тестирование будет продолжаться вечно! Скажем пока, что победитель будет объявлен через неделю.
Часть V: Отправка
- Я сохраняю право вето на все представленные материалы - это поощряет ум, но не в том случае, если это нарушает конкуренцию или мой компьютер! (Если я не могу сказать, что делает ваш код, я, вероятно, наложу вето на него)
- Придумайте имя для вашей пары Архитектор / Солвер. Разместите свой код вместе с инструкциями по его запуску.
Скоро: обновленный набор тестов Python для нового формата. Большие изменения произошли, чтобы позволить любые языковые представления.
источник
Ответы:
BuildFun и SolveFun
Ну, это заняло довольно много времени, и я не совсем уверен, обманщик решает или нет. Хотя у него есть доступ ко всему лабиринту все время, он только смотрит на ячейку, в которой он находится, на стены, окружающие его, и, если между ними нет стены, на соседние с ней клетки. Если это противоречит правилам, пожалуйста, дайте мне знать, и я постараюсь изменить это.
Во всяком случае, вот код:
Я понимаю, что это смехотворно долго и не особенно легко для чтения, но я ленив, так что это так.
BuildFun
Архитектор BuildFun - это довольно простая программа, генерирующая лабиринт, которая всегда будет создавать «идеальный» лабиринт (один без петель, где любые две точки всегда будут иметь ровно один путь между ними). Он основывает свою логику на исходном входе, что означает, что сгенерированные лабиринты являются псевдослучайными с часто повторяющимися образцами, и при одинаковом начальном значении и размере будет создан тот же лабиринт.
После того, как лабиринт создан, программа попытается максимизировать оценку лабиринта путем поиска начальной и конечной точек, которые приводят к самому длинному пути между ними. Для этого он проходит через каждую начальную точку, распределяет трассеры, чтобы найти конечную точку, наиболее удаленную от нее, и выбирает комбинацию с самым длинным путем.
После этого он рисует лабиринт, считает стены и выводит информацию лабиринта. Это начальная точка, конечная точка, расстояние между ними, количество стен и оценка. Он также форматирует эту информацию в описанном выше стиле для размера, начала и конца, горизонтальных и вертикальных стен и сохраняет ее в текстовом файле с именем Maze.txt для последующего использования.
SolveFun
Решатель SolveFun использует текстовый файл Maze.txt в качестве входных данных и работает очень похоже на архитектуру. Для каждого движения он будет выбирать направление, в котором он хочет идти, основываясь на его относительном положении до конца, а затем он будет смотреть на окружающие его стены. Если стены там нет, она проверит, находилась ли она в соседней с ней ячейке, и если нет, то будет добавлена в качестве возможного варианта. Затем он будет двигаться в направлении, наиболее близком к предпочтительному, при условии, что у него есть опции. Если у него нет опций, он будет возвращаться, пока не получит. Это продолжается, пока не достигнет конца.
По мере движения он записывает путь, по которому он идет, в переменном пути, который используется в конце для вывода общего количества шагов. Он также записывает, сколько раз ему пришлось возвращаться назад, чтобы вычислить потерянные шаги в конце. Когда он достигнет конца, он выведет лабиринт с кратчайшим путем от начала до конца, отмеченным символом
*
s.Как запустить
Из-за метода вывода лабиринта (который включает в себя подчеркивание определенных символов), это должно быть запущено из командной строки в форме
python -c 'import filename;filename.BuildFun(Size, Seed)'
и
python -c 'import filename;filename.SolveFun()'
где Size - целое число от 15 до 50 (включительно), а Seed - целое число от 4 до размера (включительно).
источник