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