Видеоигра Minecraft - это все о размещении и удалении различных типов блоков в трехмерной целочисленной решетке, которая составляет виртуальный мир. Каждая точка решетки может содержать ровно один блок или быть пустой (официально « воздушный » блок). В этой задаче мы будем иметь дело только с одной горизонтальной двухмерной плоскостью трехмерного мира и одним типом блока: сундуками .
Сундуки позволяют игрокам хранить предметы. Когда два сундука ортогонально соседствуют в одной и той же горизонтальной плоскости, их текстуры соединяются, и образуется двойной сундук с удвоенной емкостью. Ничто больше, чем двойной сундук, не может быть сделано; нет ни тройных сундуков, ни четырехместных сундуков.
Блок сундуков может быть помещен в пустую точку решетки только в том случае, если все четыре ортогонально смежных точки пусты, или если ровно одна содержит блок сундуков, который еще не является частью двойного сундука. Эти правила размещения гарантируют, что никогда не может быть никакой двусмысленности относительно того, какие блоки сундуков соединяются для образования двойных сундуков.
Например, предположим, что .
это пустое пространство и C
сундук: (Числа также являются пустым пространством и только для целей идентификации.)
.......C..
.1.C2.C3..
........5C
.CC4..CC..
..........
- Сундук может быть размещен в месте 1, потому что его 4 соседа пусты.
- Сундук может быть размещен в месте 2, потому что соседний сундук (пока) не является частью двойного сундука.
- Сундук не может быть помещен в точку 3, потому что было бы двусмысленность относительно того, как формируется двойной сундук.
- Сундук не может быть помещен в точку 4, потому что соседний сундук уже является частью двойного сундука.
- Сундук может быть размещен в пятом месте. Соседний по диагонали двойной сундук ни на что не влияет.
Предполагая, что область за сеткой пуста, изменение каждого .
в сетке на a, *
если сундук может быть размещен там, приводит к этому:
******.C**
***C**C.**
*..***..*C
.CC.*.CC.*
*..***..**
Конечно, не все *
пространства могут быть заняты сундуками одновременно, но если бы у вас был только один сундук, он мог бы быть помещен в любой из них.
Вызов
Написать программу или функцию , которая принимает в .
и C
сетки, и изменяется каждый .
к *
если грудь может быть помещен там, печати или возврата полученной сетки.
Ввод может быть из стандартного ввода или файла или в виде строкового аргумента функции.
Вы можете предположить, что входные данные правильно сформированы - то есть идеально прямоугольная сетка текста, по крайней мере, 1 символ шириной и высотой, содержит только
.
иC
Вы можете дополнительно предположить, что после последней строки есть завершающий символ новой строки (и может быть один в выходных данных). ).Вы можете предположить, что расположение сундуков на входе соответствует приведенным выше правилам. Там никогда не будет двусмысленности о том, какие сундуки образуют двойные сундуки.
При желании, вы можете использовать любые три различных печатаемые ASCII символы вместо
.
,C
и*
. Вы не можете использовать что-то другое вместо новых строк.Все сундуки нормальные сундуки. Сундуки не в ловушке или сундуки .
счет
Представление с наименьшим количеством байтов выигрывает.
Для более сложной задачи, связанной с Minecraft, попробуйте Nether Portal Detection .
Ответы:
CJam,
82 76 66 62 5854 байтаФормат ввода рассчитан
0
на воздушную ячейку и8
грудную клетку. Вывод содержит1
все ячейки, которые можно разместить с помощью сундука.ОБНОВЛЕНИЕ :
исправлена ошибка. Увеличено на 3 байта :(дальше гольфом :). 4 байта сохранены благодаря @ Sp3000Пример ввода:
Выход:
Я думаю, что я закончил игру в гольф на данный момент ...
объяснение
Попробуйте онлайн здесь
источник
.NET Regex ( Retina ),
434416310 + 1 = 311 байтПосле последнего вызова, на который я ответил в регулярном выражении (вызов портала Nether, связанный с этим вызовом), я наконец-то решил написать инструмент командной строки, который выступает в качестве интерпретатора регулярных выражений в стиле .NET, поэтому я могу отвечать на вопросы. с регулярным выражением, не оспаривая, что они не автономный язык. Я назвал это Retina.
Теперь, этот вызов не очень хорошо подходит для представления регулярных выражений, но я просто должен был использовать Retina сейчас. ;) (Плюс, Sp3000 бросил мне вызов в чате.) Так вот:
Файл регулярных выражений
Файл замены
Файл регулярных выражений - это, в основном, просто регулярное выражение, за исключением того, что
`
позволяет поместить в файл несколько параметров, в данном случае это просто многострочный режим. При наличии двух файлов Retina автоматически принимает режим замены всех. Эти два файла определяют программу, которая читает входные данные из STDIN и печатает результат в STDOUT.Вы также можете проверить это на RegexHero и RegexStorm . Регулярное выражение работает как с последним переводом строки, так и без него, и использует
_
вместо него.
. (Очевидно, у RegexStorm иногда возникают проблемы, если нет завершающего символа новой строки, но RegexHero, похоже, отлично справляется с любым из этих случаев.)В регулярном выражении есть ужасное количество дублирования, и у меня есть пара идей для его значительного сокращения ... Я попробую позже, а затем добавлю объяснение. В то же время, дайте мне знать, если вы можете найти какие-либо входные данные, которые дают неправильный результат.
источник
J,
7573 байтаИспользует формат в вопросе, используя
.
/*
/C
для пробела / полезного пространства / сундук, соответственно.Редактировать: исправляет небольшую ошибку (я случайно использовал тор вместо правильного обращения с окружением как с пустым пространством).
объяснение
источник
С, 193
2 ненужных перевода строки для ясности. Изменения по отношению к негольфированному коду включают: символы как коды ascii вместо символьных литералов; перестановка v = 0, strlen и strchr для сохранения символов (strchr - самый уродливый, поскольку это означает, что вычисление, которое в противном случае было бы выполнено только один раз, выполняется 5 раз для каждой ячейки!)
Функции Си не принимают строки в качестве аргументов и не возвращают их в качестве значений, поэтому лучшее, что я могу сделать, это следующее:
q
указатель на входную строку. Функция изменяет строку, и когда функция возвращает результат, она находится в исходной строке.Подводя итог правилам:
пустой квадрат (который не содержит C или символ новой строки) может быть преобразован, если у него максимум 1 сосед с C
... И этот сосед не имеет соседей с C.
Функция g содержит функцию f, которая рекурсивно спускается с глубины 1 на глубину 0. С помощью только 2 уровней рекурсии
f(r,0)
подойдет простой рекурсивный вызов, в этом нет необходимостиf(r,d-1)
!Разгруженный код в тестовой программе
Входная тестовая строка жестко закодирована.
gets
иscanf
не примет входную строку с символами новой строки в ней; они разбивают его на кусочки на каждой новой строке.Вывод на основе примера вопроса
источник
JavaScript (ES6) 124
129Использование символов 0 (*), 6 (C), 7 (.)
Разгромил и объяснил
Тест в консоли Firefox / FireBug
Выход
источник
Perl, 66
Конфликты сундуков с регулярным выражением заканчивались на длинной стороне, так что на этот раз не конкурируйте с CJam.
Использует 0 и 2 для пустых и сундуков на входе, 1 для отметки мест на выходе.
Попробуй это здесь .
источник
Python 2 - 281 байт
(Строки 8 и 9 предназначены с одним символом табуляции, который SE преобразует в 4 пробела. Каждая строка в этой программе имеет либо 0, либо 1 байт начального пробела.)
Вход:
0
для сундука нет,2
для сундукаOuput:
0
для сундука нет,2
для существующего сундука,1
для возможного нового сундукаБоже, это ужасно Я должен быть серьезно из практики. Я бросил каждый трюк, который я знаю, и это получилось ... ну, это вышло как 281 байт, проиграв на каждый ответ, кроме одного в регулярное выражение , хаха. Честно говоря, я чувствую, что играю в гольф это довольно хорошо, поэтому я предполагаю, что мой алгоритм был просто не идеален.
Ungolfed:
источник