Видеоигра Minecraft - это все о размещении и удалении различных типов блоков в трехмерной целочисленной решетке, которая составляет виртуальный мир. Каждая точка решетки может содержать ровно один блок или быть пустой (официально « воздушный » блок). В этой задаче мы будем иметь дело только с одной вертикальной двухмерной плоскостью трехмерного мира и одним типом блока: обсидианом .
Когда обсидиан формирует контур пустого прямоугольника в вертикальной плоскости, может быть создан нижний портал . Пустой прямоугольник может быть любого размера от 2 единиц в ширину до 3 единиц в высоту до 22 единиц в ширину и 22 единицы в высоту. Углы прямоугольника не должны быть ограничены обсидианом, только стороны.
Например, предположим, что X
это обсидиан и .
пустота: (числа приведены только для идентификации и также пусты).
...................................
..XXXX....XXXX....XXXXXXXXX........
..X..X...X....X..X.........X..XXXX.
..X.1X...X.2..X..X...3...X.X..X....
..X..X...X....XXXX.........X..X.6X.
..XXXX....XXXX...XXXXXXXXXXX..X..X.
.............X.4.X....X.5.X...XXXX.
.............X...X....X...X........
..............XXX......XXX.........
...................................
Эта сетка содержит 3 действительных портала:
- Портал 1 составляет 2 на 3 единицы, абсолютно пустой и окаймлен обсидианом. Поэтому это действительно.
- Портал 2 4 на 3, полностью пустой и окаймлен обсидианом. Поэтому это действительно.
- Портал 3 не совсем пустой. Поэтому это неверно.
- Портал 4 - 3 на 3, полностью пустой и граничит с обсидианом. Поэтому это действительно.
- Портал 5 составляет 3 на 2 единицы, что слишком мало. Поэтому это неверно.
- На портале 6 отсутствует часть границы. Поэтому это неверно.
Вызов
Напишите программу или функцию, которая принимает в этих строковых представлениях сетки обсидиана и пустоты и печатает или возвращает количество имеющихся действительных порталов.
- Ввод может быть из стандартного ввода или аргумента файла или функции.
Вы можете предположить, что входные данные всегда правильно сформированы - то есть идеально прямоугольная сетка текста, шириной не менее 1 символа и высотой, содержащая только
X
и.
. При желании вы можете предположить, что после последней строки есть завершающий символ новой строки.При желании вы можете использовать любые два различных печатаемых символа ASCII вместо
X
и.
.Обсидиан может находиться на границах сетки. Все, что находится за пределами границ, считается пустым.
Пример ввода - вывод должен быть 4
:
................................................................
...................................XXXXXXXXXXXXXXXXXXXXXXXXX....
..XXXX....XXXX....XXXXXXXXX........X.......................X....
..X..X...X....X..X.........X..XXXX.X.......................X....
..X..X...X....X..X.......X.X..X....X.......................X....
..X..X...X....XXXX.........X..X..X..XXXXXXXXXXXXXXXXXXXXXXXX....
..XXXX....XXXX...XXXXXXXXXXX..X..X.X......................X..XXX
.............X...X....X...X...XXXX.X......................X..X..
.............X...X....X...X........X......................X..X..
..............XXX......XXX........XXXXXXXXXXXXXXXXXXXXXXXX...X..
..................................XX.........................XXX
счет
Представление с наименьшим количеством байтов выигрывает.
Ответы:
Perl, 81
86Использование более одного регулярного выражения.
Регулярное выражение для определенной ширины портала намного проще, чем общее:
X{$m}..{$n}(X\.{$m}X.{$n}){3,22}.X{$m}
гдеm
ширина портала иn
естьtotal width - 1 - m
. Регулярное выражение должно быть помещено в прямое утверждение нулевой ширины,(?=...)
потому что совпадения могут перекрываться. Затем я повторяю 21 раз по этому параметру регулярного выражения$n
и$.
."@-"
оценивает начальную позицию последней функции match (/.\n/
), которая имеет общую ширину - 1.$.
используется в качестве другой переменной, к которой она инициализируется1
при использовании с-p0
.источник
.
для пустых ячеек (поэтому вам не нужно избегать его).Regex (.NET flavour),
182181145132126114104100989796 байт2D ASCII искусство распознавания образов? Похоже, работа для регулярных выражений! (Это не так.)
Я знаю, что это снова вызовет бесконечные дискуссии о том, являются ли регулярные выражения действительными программами или нет, но я сомневаюсь, что это все равно превзойдет APL или CJam, поэтому я не вижу никакого вреда. (Это , как говорится, они делают пройти наш твердолобый тест на «Что такое язык программирования?» .)
Это принимает входные данные в качестве строки для сопоставления, и результатом является количество найденных совпадений. Это использует
_
вместо.
, потому что я должен был бы избежать последнего. Это также требует завершающей новой строки.Вы можете проверить это в прямом эфире в RegexHero или RegexStorm ). Матчи будут верхними обсидиановыми рядами порталов. Если вы можете найти тестовый случай, когда он не проходит, пожалуйста, дайте мне знать!
Что это за колдовство?
Следующее объяснение предполагает базовое понимание балансирующих групп .NET . Суть в том, что захваты - это стеки в регулярном выражении .NET - каждый новый захват с тем же именем помещается в стек, но есть также синтаксис для повторного захвата захватов из этих стеков, а также синтаксис для захвата захватов из одного стека и push-захватов. на другого в то же время. Чтобы получить более полную картину, вы можете взглянуть на мой ответ о переполнении стека, который должен охватить все детали.
Основная идея состоит в том, чтобы соответствовать шаблону, как:
Где
n
между 2 и 22 (включительно). Хитрость в том, чтобы всеn
и всеm
были одинаковыми. Поскольку действительные символы не будут одинаковыми, мы не можем просто использовать обратную ссылку.Обратите внимание, что регулярное выражение имеет встроенные символы новой строки, которые я напишу, как показано
\n
ниже.C #, 185 байт
Вот полная функция C #, только для того, чтобы сделать эту запись действительной. Пришло время написать "интерпретатор" командной строки для регулярных выражений .NET ...
источник
^
(или любой неиспользованный символ) для(?!)
.Python, 219 байт
Лучше, чем на Java, но мальчишке пятерка вложенных петель повредит.
for/in
Может быть слегка сжимаемым с помощью%s
замены, но это не спасло бы много.Expanded:
источник
Java, 304 байта
Это намного длиннее, чем регулярное выражение. Он просто перебирает все возможные квадраты на входе. Если это действительный портал, он увеличивает счетчик на 1. Затем он возвращает счетчик. Это может быть, вероятно, гораздо дальше. Любые предложения приветствуются.
Отступ:
Полная программа:
источник