Одна из любимых игрушек моего ребенка - это такой набор . На самом деле это одна из моих любимых игрушек - я играл с ней, и она дала мне несколько идей для PPCG. Вот один из них:
Напишите программу или функцию, которая принимает в качестве входных данных чертеж ASCII и решает, будет ли он складываться в куб.
вход
Вход будет состоять только из одного гексомино, построенного из квадратов, подобных этому:
+-+
| |
+-+
Например, допустимый ввод heximino:
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
| |
+-+
Выход
- Истинное значение, если гексомино можно сложить в куб, или
- Фальси значение в противном случае.
Чтобы сэкономить нам немного времени, в Википедии есть хорошая графика:
- Все 35 гексомино:
- Все 11 гексомино, которые складываются в кубики:
Заметки
- Входные гексомино могут иметь любое вращение или отражение, а не только те, которые показаны на изображениях выше.
- Входные гексомино могут иметь начальные пробелы, но будут правильно выровнены по отношению к себе
- Входные гексомино могут иметь конечный пробел в конце строк и конечные переносы в конце ввода
code-golf
ascii-art
kolmogorov-complexity
geometry
Цифровая травма
источник
источник
Ответы:
ПМА / Улитки , 130
или более "читабельно",
Необычно, возникла проблема, которая может быть решена ограниченным количеством реализованных функций.
!(z\ )
Модели определяет , что текущая позиция находится в пространстве в середине квадрата , используя отрицательное утверждение , что существует пространство , в некоторых «octilinear» направлении. Общая идея состоит в том, чтобы проверить шаблон, который размещает квадрат в каждом из 5 необходимых мест относительно квадрата, на котором начинается матч. Кроме того, он должен проверить, что он не находится в блоке квадратов 2x2. Прежде чем программа заработала, мне пришлось исправить ошибку с разбором скобок.Если гексомино не отображает куб,
0
печатается. Если это так, выводится некоторое положительное целое число (количество совпадений).Я адаптировал этот генератор полиомино для создания всех возможных тестовых случаев:
источник
Рубин,
173 148 145143 байтаПоследнее изменение:
/2
на правой стороне<
заменено*2
на левой стороне. Позволяет исключить один набор()
объяснение
Код состоит из двух частей: основная безымянная функция, которая выполняет синтаксический анализ, и вспомогательная безымянная функция, назначенная переменной,
h
которая выполняет проверку.Основная функция просматривает строку по байтам, добавляя координаты x и y
i,j
всех+
найденных символов кx[]
иy[]
. Затем он звонитh
дважды. Первый раз, когда предполагается, что гексомино является горизонтальным (x[]
содержит длины иy[]
ширины), а второй раз, когда он предполагает, что он вертикальный.Функция
h
принимает продольные координаты в массиве, аb
затем продольные координаты в массивеc
. Вычисляет длину (в квадратах) по выражению(b.max.b.min)/2
. Если это значение меньше или равно 3, гексомино должно оцениваться в другом направлении, поэтомуh
возвращаетсяfalse
.Проверка гексомино покажет, что если длина равна 4, у тех гексомино, которые будут складываться в куб, будет не более 2 квадратов (3
+
символа) в первой и последней строке . Большинство квадратов сосредоточены в среднем ряду, который станет экватором куба. Это условие оказывается необходимым и достаточным для гексомино длиной 4, которое сложится в куб.Существует только одно гексомино длиной 5, которое сложится в куб. Он имеет 3 квадрата (4
+
символа) в первом и последнем рядах. Все остальные гексомино длины 5 имеют 5 или более+
символов в первой или последней строке.Есть только один гексомино длиной 6. Он имеет 7
+
символов в каждой строке.Собрав все это вместе, достаточно проверить, что длина гексомино больше 3, а количество
+
символов в первой и последней строках (в зависимости от того, что больше) меньше длины.Неуправляемый в тестовой программе
источник
JavaScript (ES6), 443
431Редактировать исправление, проблему при разборе ввода, удаление пустых столбцов
Это очень долго и даже дольше, так как синтаксический анализ является важной частью задачи.
Я проверяю, является ли данный вход одним из 11 складываемых гексомино.
Каждое складываемое гексомино может быть сопоставлено с некоторым растровым изображением 5x5 (до 8 различных, с симметрией и вращениями). Взяв растровые изображения за 25-битное число, я нашел минимальные значения для 11 отмеченных гексомино, используя следующий код (с очень простым форматом ввода)
Что дает
[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056]
Поэтому, учитывая входную строку, я должен сделать то же самое, чтобы найти минимальное растровое изображение, а затем вернуть true, если это число присутствует в моем списке предварительных вычислений.
Запустите фрагмент кода для тестирования в Firefox
Показать фрагмент кода
источник
,\nt=t
с конца второй строки / начала третьей строки?