Symme-Try This Triangle Trial


17

Строка, длина которой является положительным треугольным числом (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 °, конечно, приведет к тому же результату.


Это название просто больно ......
Rɪᴋᴇʀ

9
@ EᴀsᴛᴇʀʟʏIʀᴋ Просто три, чтобы игнорировать это.
Увлечения Кэлвина

@HelkaHomba Почему ... почему ...
clismique

Ответы:


9

CJam, 37 29 28 27 байт

Спасибо Sp3000 за сохранение 3 байта.

q{T):T/(\s}h]{z_Wf%_}3*])e=

Тестирование.

Это повторно использует некоторые приемы вращения треугольника из этой задачи .

Это также работает для того же количества байтов:

q{T):T/(\s}h]3{;z_Wf%_}%)e=

объяснение

Во-первых, краткий обзор треугольного поста, на который я ссылался выше. Мы представляем треугольник как 2D (рваный) список, например

[[0 1 1]
 [0 0]
 [0]]

Группа симметрии треугольника имеет 6 элементов. Есть циклы длины 3, вращая треугольник, и циклы 2, отражая его вдоль некоторой оси. Удобно, чтобы повороты соответствовали двум различным отражениям. Мы будем использовать следующие отражения, чтобы сделать это:

  1. Транспонировать список означает отражать его по главной диагонали, поэтому мы получим:

    [[0 0 0]
     [1 0]
     [1]]
    
  2. Реверсирование каждого ряда представляет отражение, которое меняет два верхних угла. Применяя это к результату транспонирования, мы получаем:

    [[0 0 0]
     [0 1]
     [1]]
    

Используя эти два преобразования и сохраняя промежуточный результат, мы можем сгенерировать все шесть симметрий входных данных.

Еще одним замечанием является поведение транспонирования в списке, например:

[[0]
 [1 0]
 [1 0 0]
 []]

Потому что это то, чем мы закончим после разделения ввода. Удобно, после транспонирования CJam сбрасывает все линии влево, что означает, что это фактически избавляет от посторонних []и приводит их в форму, которая полезна для двух вышеупомянутых преобразований (все без изменения фактического расположения треугольника за пределами отражательной симметрии):

[[0 1 1]
 [0 0]
 [0]]

С этим из пути, вот код:

q       e# Read input.
{       e# While the input string isn't empty yet...
  T):T  e#   Increment T (initially 0) and store it back in T.
  /     e#   Split input into chunks of that size.
  (     e#   Pull off the first chunk.
  \s    e#   Swap with remaining chunks and join them back together
        e#   into a single string.
}h
]       e# The stack now has chunks of increasing length and an empty string
        e# as I mentioned above. Wrap all of that in an array.
{       e# Execute this block 3 times...
  z_    e#   Transpose and duplicate. Remember that on the first iteration
        e#   this gets us a triangle of the desired form and on subsequent
        e#   iterations it adds one additional symmetry to the stack.
  Wf%_  e#   Reverse each row and duplicate.
}3*
        e# The stack now has all 6 symmetries as well as a copy of the
        e# last symmetry.
]       e# Wrap all of them in a list.
)       e# Pull off the copy of the last symmetry.
e=      e# Count how often it appears in the list of symmetries.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.