Давайте представим стандартный кирпичный кирпич как [__]
(и проигнорируем тот факт, что вершина открыта). Когда эти кирпичи уложены друг на друга, каждый второй слой смещается на половину кирпича, как обычно в кирпичной конструкции:
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
Таким образом, у каждого кирпича есть не более шести соседей, и два кирпича не могут располагаться вертикально друг над другом.
Ключевым моментом является то, что расположение этих кирпичей не портится , а просто гравитацией. Поэтому важно, чтобы каждый кирпич в структуре был стабильным, иначе вся структура нестабильна.
Существует три способа обеспечения стабильности отдельного кирпича:
- Любой кирпич на земле (самая низкая линия кирпичей) является стабильным.
Любой кирпич, который имеет два кирпича прямо под ним, является стабильным:
[__] <- 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 пробела).
Обратите внимание на то, что полукринцевые полости заполнены пробелами, чтобы сетка символов была прямоугольной.
счет
Самый короткий код в байтах побеждает.
Заметки
- При желании вы можете использовать
.
вместо пробела символ пробела. - Пустая строка считается стабильной.
- Если в вашем языке нет функций, вы можете использовать именованную строковую переменную в качестве входных данных и присвоить результат другой переменной.
- Если на вашем языке нет строк, вы можете делать все, что кажется подходящим для ввода.
Тестовые случаи
Различные тестовые случаи, разделенные пустыми строками. Для наглядности .
используется вместо места для пустых мест.
Стабильная:
[__]
..[__]..
[__][__]
........[__]........
......[__][__]......
........[__]........
..[__][__]..
[__][__][__]
..[__][__]..
[__]....[__]
............[__]..
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
..[__]........[__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
Нестабильный:
..[__]..
........
..[__]..
[__]....
..[__]..
....[__]
..[__][__]..
[__]....[__]
..[__][__]..
[__]....[__]
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
........[__]....
......[__][__]..
....[__][__]....
..[__][__]......
[__][__]........
..[__]..........
(вам придется мысленно укладывать эти линии друг на друга. Дело в том, что ваши правила допускают сооружения, центр тяжести которых сильно смещен от точки их контакта с землей. Чтобы избежать этого, должна быть возможность затянуть их. без физического движка, если вам так хотелось.)