Давайте представим стандартный кирпичный кирпич как [__]
(и проигнорируем тот факт, что вершина открыта). Когда эти кирпичи уложены друг на друга, каждый второй слой смещается на половину кирпича, как обычно в кирпичной конструкции:
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
Таким образом, у каждого кирпича есть не более шести соседей, и два кирпича не могут располагаться вертикально друг над другом.
Ключевым моментом является то, что расположение этих кирпичей не портится , а просто гравитацией. Поэтому важно, чтобы каждый кирпич в структуре был стабильным, иначе вся структура нестабильна.
Существует три способа обеспечения стабильности отдельного кирпича:
- Любой кирпич на земле (самая низкая линия кирпичей) является стабильным.
Любой кирпич, который имеет два кирпича прямо под ним, является стабильным:
[__] <- this brick is stable [__][__] <- because these bricks hold it up
Любой кирпич, имеющий кирпичи как над, так и под ним на одной стороне, является стабильным:
[__] [__] [__] [__] <- these middle bricks are stable [__] [__] because the upper and lower bricks clamp them in [__] [__] [__] [__] <- these middle bricks are NOT stable [__] [__]
Из этих правил мы можем видеть, например, расположение
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
нестабилен, потому что верхний правый кирпич нестабилен, и это все, что нужно.
Кирпичная структура является стабильной, только если все ее кирпичи стабильны.
Вызов
Ваша задача - написать функцию, которая принимает строку кирпичной структуры и возвращает истинное значение, если структура стабильна, и ложное значение, если оно нестабильно. ( правдивое / ложное определение )
Входная строка может быть произвольно большой, но она всегда будет прямоугольной сеткой символов с пробелами, заполняющими области, лишенные кирпичей. Ширина сетки символов будет делиться на 4, но высота может быть нечетной или четной.
Сетка кирпича всегда проходит выше и справа от нижнего левого положения кирпича:
.
.
.
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK? . . .
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
В зависимости от структуры каждый из BRK?
них представляет собой кирпич ( [__]
) или пустое пространство (4 пробела).
Обратите внимание на то, что полукринцевые полости заполнены пробелами, чтобы сетка символов была прямоугольной.
счет
Самый короткий код в байтах побеждает.
Заметки
- При желании вы можете использовать
.
вместо пробела символ пробела. - Пустая строка считается стабильной.
- Если в вашем языке нет функций, вы можете использовать именованную строковую переменную в качестве входных данных и присвоить результат другой переменной.
- Если на вашем языке нет строк, вы можете делать все, что кажется подходящим для ввода.
Тестовые случаи
Различные тестовые случаи, разделенные пустыми строками. Для наглядности .
используется вместо места для пустых мест.
Стабильная:
[__]
..[__]..
[__][__]
........[__]........
......[__][__]......
........[__]........
..[__][__]..
[__][__][__]
..[__][__]..
[__]....[__]
............[__]..
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
..[__]........[__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
Нестабильный:
..[__]..
........
..[__]..
[__]....
..[__]..
....[__]
..[__][__]..
[__]....[__]
..[__][__]..
[__]....[__]
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
........[__]....
......[__][__]..
....[__][__]....
..[__][__]......
[__][__]........
..[__]..........
(вам придется мысленно укладывать эти линии друг на друга. Дело в том, что ваши правила допускают сооружения, центр тяжести которых сильно смещен от точки их контакта с землей. Чтобы избежать этого, должна быть возможность затянуть их. без физического движка, если вам так хотелось.)Ответы:
80386 машинный код, 98
Код:
Код сканирует искусство ASCII с конца до начала, пропуская по 2 символа за раз. Это делает вдвое больше необходимых проверок (этого будет достаточно, чтобы прыгнуть на 4 символа), но упрощает логику.
Проверка начинается с последней до последней строки символов (нет необходимости проверять последнюю строку). В каждой строке начинается 3 символа справа (нет необходимости проверять слишком далеко вправо). Для каждого символа он проверяет 4 окружающих символа:
Существует несколько логических условий для проверки:
Это счастливое совпадение, что все кирпичные персонажи
[_]
имеют свой набор LSB; все остальные персонажи.\n
имеют это ясно. Кроме того, набор команд 80386 имеет эти функции «высокий» и «низкий» регистры (ah
,al
и т.д.), которые помогают распараллелить проверяет немного. Таким образом, все проверки составляют какую-то непонятную мелочь.Я начал со следующего кода C:
Я перевел код на язык ассемблера (в основном это один в один), включая реализацию
strchr
иstrlen
. Следующий исходный код переведен MS Visual Studio на машинный код в верхней части моего поста.источник
MATLAB - 119 байт
уменьшенная:
Expanded:
Пример использования:
Детали
Подпрограмма добавляет строку
.
в начало входной матрицы, а затем преобразует ее в числовую матрицу, добавляя 3 к кодам символов ASCII. Учитывая это преобразование, 2D свертка с ядромдает матрицу
0
в местах, где шаблон персонажаприсутствует, с
*
представлением "любой символ". Из-за конструкции ядра это единственная допустимая комбинация символов, которая выдаст0
.Идентичная свертка выполняется с перевернутой влево и вправо версией ядра для обнаружения
Ввод является стабильным, если либо i ) он пустой, либо ii ) никакие нули не появляются ни в одной свертке.
Два разочарования
Свертка по умолчанию в MATLAB проходит за края матрицы операндов, производя ошибочные
0
s в противоположных углах для обеих сверток, требуя,'valid'
добавления (8 байт) дляconv2
вызова, чтобы ограничить вывод областью, где свертка действительна.Обработка пустого строкового регистра добавляет 12 байтов.
источник
JavaScript (E6) 131
261Тест в консоли FireFox / FireBug
Выход
Ungolfed
источник
[...a]
делать, если вы не возражаете против моего запроса? Я знаю, что ES6 позволяет...arg
в качестве последнего аргумента функции захватывать переменные, но я никогда не видел, чтобы он использовал этот способ.{:}
в MATLAB. Это будет очень полезно. Спасибо. :)Python 279
Я думаю, что я довольно плохо справляюсь с задачами в коде и, возможно, я использую не те языки для этого: D Но я люблю код, который легко читается :) Кстати, я хотел бы увидеть код на python, который использует меньше байтов!
Возможные примеры:
источник
_
и[
<>
, вы бы использовали!=
.!=
- это предпочтительный способJavaScript 2 (ES6) - 148
151байтОжидается строка строк кирпича, разделенных символом новой строки (примечание: если бы мы могли использовать другой символ-разделитель, например "|", для разделения строк это можно было бы сделать на 1 байт короче).
Тест в консоли Firefox с:
источник
Питон, 209
тесты:
Выход:
источник