Введение
Знающие код гольфисты подготовили нас к потопу конца света . Районы, подверженные риску, были эвакуированы, и население переместилось на возвышенность.
Мы недооценили поток (или, возможно, была ошибка в коде @ user12345). Некоторые высокогорные районы стремительно приближаются к уровню моря. Стены должны быть возведены, чтобы обеспечить выживание ныне густонаселенных лагерей. К сожалению, правительство имеет ограниченный запас стен.
проблема
Наш сценарий конца света описывается двумя числами в одной строке, n
и m
. После этой строки идут n
строки со m
значениями в строке, разделенные только одним пробелом. Каждое значение будет одним из четырех символов.
x
Непроходимое. Вода не может течь здесь. Стены не могут быть возведены здесь.-
Нестабильный. Вода может течь через это здесь. Стены не могут быть возведены здесь..
Стабильная. Вода может течь здесь. Стены могут быть возведены здесь.o
Лагерь. Вода может течь здесь. Если это произойдет, все умрут. Стены не могут быть построены здесь.
Вода будет течь со всех краев карты, если только этот край непроходим, или на плитке не построена стена. Напишите программу, которая может выводить минимальное количество стен, необходимое для защиты лагеря.
Пример ввода
6 7
x . . x x x x
x . . x - - x
x . x x - - x
x . o o o - .
x . o o o - .
x x x x x x x
Пример вывода
3
Предположения
- Вода течет только ортогонально
- Лагеря существуют только как один ортогонально непрерывный блок на сценарий
- Решение всегда будет существовать (хотя для этого может потребоваться большое количество стен)
- Лагеря не могут быть расположены на краю, так как сценарий не будет иметь решения
- 2
n
<<16 - 2
m
<<16 - Входные данные могут быть предоставлены из stdin, прочитаны из «city.txt» или приняты как один аргумент
Самый короткий код выигрывает!
Ответы:
Mathematica,
257253 символовВвод читается из
"city.txt"
.Объяснение:
Mathematica имеет много функций для работы с графами.
Сначала я читаю данные из
"city.txt"
.Затем я строю сеточный граф с 'm' * 'n' vertices (
GridGraph@d[[1,{2,1}]]
) и добавляю к нему «вершину на бесконечности», которая связана с каждой вершиной на «ребрах» графа. Эта вершина - то, откуда течет вода.И
o
,x
иs
обозначают позиции «о», «х» и «.» соответственно.Тогда для любого подмножества
w
изs
(подмножеств сортируются по длине), я удалить вершины вx
иw
изg
(VertexDelete[g,x⋃w]
), а также найти длину кратчайшего пути от вершины «на бесконечности» до лагеряo
. Если длина бесконечна, то лагерь будет в безопасности. Таким образом, длина первого таковаw
- это минимальное количество стен, необходимое для защиты лагеря.источник
С
827 799522Golfed:
Входные данные задаются с высотой и в качестве аргументов командной строки, а затем сетка читается как одна строка в stdin следующим образом:
./a.out 6 7 < input
где ввод находится в этой форме (слева направо, сверху вниз):"Удобочитаемый":
Это далеко не так быстро, как решение @Claudiu, но оно работает невероятно быстро. Вместо заливки с краев он находит лагерь и работает наружу от жетонов «о».
Образцы размещения стен:
источник
@
). Я пытался запустить твой код сам, но , похоже,Python,
553525512449414404387368 символов (+4 для вызова)Мне было очень весело играть в гольф. Это на 82 байта больше, если вы попытаетесь сжать его! Теперь это мера компактности и отсутствия повторений.
Уровни отступа - пробел, таб.
Использование :
Читает из
city.txt
:Вызовите следующим образом:
Это
2>X
скрыть stderr, так как программа закрывается, вызывая исключение. Если это считается несправедливым, не стесняйтесь добавлять 4 символа для вызова.Пояснение :
Простая грубая сила.
C
выполняет заливку и возвращает истину, если она попадает в лагерь. Никаких дополнительных отступов, так как для правильной настройки заполнения потребовалось слишком много места.D
с учетом набора стен, которые необходимо заполнить, звонкиC
из каждой точки на краю, так что ониC
учитывают эти стены, и выводит длину и выходит, если ни одна из них не достигла лагеря. Список стен также используется для отслеживания заливки, поэтому копирование доски не требуется! Trickily,C
также добавляет любые пустые места , которые он находит в списокS
, так что функцияD
будет также использоваться для первой конструкции списка пустых мест. По этой причине я используюsum
вместо тогоany
, чтобы обеспечить все.
s собраны при первом прогоне.Я вызываю
D
один раз, затем копирую список пустых мест,Z
так как ониS
будут добавляться (неэффективно, но дешевле по количеству символов). Затем я использую,itertools.combinations
чтобы выбрать каждое комбо пустых мест, от 0 мест вверх. Я запускаю каждую комбинацию,D
и она печатает длину первой, которая работает, вызывая исключение для выхода из программы. Если ответ не найден, ничего не печатается.Обратите внимание, что в настоящее время программа не работает, если не нужны никакие стены. Было бы +3 символа, чтобы заботиться об этом случае; не уверен, если это необходимо.
Также обратите внимание, что это
O(2^n)
алгоритм, гдеn
количество пустых мест. Таким образом, для полностью пустой доски размером 15x15 с одним лагерем посередине потребуется2^(15*15-1)
=2.6959947e+67
итераций для завершения, что будет очень долго!источник
Groovy:
841805754Ungolfed:
Гораздо больше игры в гольф ...
Возвращает 2E9, если нет решения.
источник
Дьялог АПЛ , 91 байт
⊃∊{1∊a[⍸×{(×d)∧s 3∨/3∨⌿⍵}⍣≡4=d←0@⍵⊢a]:⍬⋄≢⍵}¨c[⍋≢¨c←(,⍳2⊣¨b)/¨⊂b←⍸2=a←(s←(4,4,⍨⍉)⍣2)'xo.'⍳⎕]
предполагает
⎕IO=0
, использует функции v16.0 (@
и⍸
), время выполнения экспоненциально по числу.
-s⎕
оценивается ввод, должна быть матрица символов'xo.'⍳
заменитьx
на 0,o
на 1,.
на 2, а все остальные на 3s←(4,4,⍨⍉)⍣2
функция, которая окружает матрицу с 4sa←
назначить числовую матрицу, заключенную в 4 с переменнойa
b←⍸2=
b
список пар координат, где 2s (то есть.
-s)(,⍳2⊣¨b)/¨⊂b
генерировать все комбинации элементовb
c[⍋≢¨c←...]
сортировать их по размеру{... :⍬⋄≢⍵}¨
для каждой комбинации проверьте что-нибудь и верните либо его длину, либо пустой список⊃∊
первый непустой результатd←0@⍵⊢a
d
являетсяa
с некоторыми элементами заменены 04=
создать булеву матрицу - где 4s? то есть границы мы добавили{...}⍣≡
продолжайте применять функцию,{}
пока результат не стабилизируется3∨/3∨⌿⍵
«логический или» каждый элемент со своими соседямиs
результат будет меньше, поэтому давайте воссоздадим границу(×d)∧
применять ненулевые элементыd
(не стены) в качестве логической маскиa[⍸× ...]
чтоa
соответствует 1 в нашей логической матрице?1∊
Есть ли 1s, то естьo
лагеря?источник