Строка, длина которой является положительным треугольным числом (1, 3, 6, 10, 15 ...), может быть скомпонована в «равносторонний текстовый треугольник», добавив несколько пробелов и символов новой строки (и сохранив ее в том же порядке чтения).
Например, строка длиной 10 ABCDEFGHIJ
становится:
A
B C
D E F
G H I J
Напишите программу или функцию, которая принимает такую строку, за исключением того, что она содержит только символы 0
и 1
. (Вы можете предположить, что ввод действителен.)
Для получающегося «равностороннего текстового треугольника» выведите (напечатайте или верните) одно из четырех чисел, обозначающих тип выставленной симметрии:
Выведите,
2
если треугольник имеет двустороннюю симметрию. то есть имеет линию симметрии от любого одного угла до середины противоположной стороны.Примеры:
0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 1 1
Выведите,
3
если треугольник имеет вращательную симметрию. то есть его можно повернуть на 120 ° без визуального изменения.Примеры:
0 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1
Выходной
6
если треугольник имеет как двустороннее и поворотную симметрию. то есть он соответствует условиям для вывода2
и3
.Примеры:
0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0
Выведите,
1
если треугольник не имеет ни двусторонней, ни вращательной симметрии.Примеры:
1 1 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1
Самый короткий код в байтах побеждает. Tiebreaker - более ранний ответ.
Помимо необязательного завершающего символа новой строки, входная строка может не иметь пробела / символа новой строки или структуры - это должны быть простые 0
и 1
одинаковые символы.
При желании вы можете использовать любые два различных печатных символа ASCII вместо 0
и 1
.
Тестовые случаи
Взятые прямо из примеров.
011 -> 2
101 -> 2
001010 -> 2
1111010111 -> 2
0100110100 -> 3
0011000010 -> 3
101111111010111 -> 3
101001100010000100111 -> 3
0 -> 6
1 -> 6
000 -> 6
100101 -> 6
0000100000 -> 6
110000 -> 1
001101 -> 1
1101111111 -> 1
111111000111111 -> 1
«Поворот» любого входа на 120 °, конечно, приведет к тому же результату.
Ответы:
CJam,
37292827 байтСпасибо Sp3000 за сохранение 3 байта.
Тестирование.
Это повторно использует некоторые приемы вращения треугольника из этой задачи .
Это также работает для того же количества байтов:
объяснение
Во-первых, краткий обзор треугольного поста, на который я ссылался выше. Мы представляем треугольник как 2D (рваный) список, например
Группа симметрии треугольника имеет 6 элементов. Есть циклы длины 3, вращая треугольник, и циклы 2, отражая его вдоль некоторой оси. Удобно, чтобы повороты соответствовали двум различным отражениям. Мы будем использовать следующие отражения, чтобы сделать это:
Транспонировать список означает отражать его по главной диагонали, поэтому мы получим:
Реверсирование каждого ряда представляет отражение, которое меняет два верхних угла. Применяя это к результату транспонирования, мы получаем:
Используя эти два преобразования и сохраняя промежуточный результат, мы можем сгенерировать все шесть симметрий входных данных.
Еще одним замечанием является поведение транспонирования в списке, например:
Потому что это то, чем мы закончим после разделения ввода. Удобно, после транспонирования CJam сбрасывает все линии влево, что означает, что это фактически избавляет от посторонних
[]
и приводит их в форму, которая полезна для двух вышеупомянутых преобразований (все без изменения фактического расположения треугольника за пределами отражательной симметрии):С этим из пути, вот код:
источник