Спробуйте - спробуйте цю трикутну пробу


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
    

Виграє найкоротший код у байтах. Тирбекер - це відповідь раніше.

Окрім необов’язкового контуру нового рядка, вхідний рядок може не мати пробілу / нової строчки або структури - він повинен бути простим 0's та 1' s.

За бажанням ви можете використовувати замість та та будь-які два символи ASCII для друку .01

Випробування

Взяте прямо з прикладів.

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 Чому ... чому ...
клісмік

Відповіді:


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=

Пояснення

По-перше, короткий підсумок з трикутника, який я пов’язував вище. Ми представляємо трикутник як двовимірний (нерівний) список, наприклад

[[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.