Codegolf - Хиральные Трехмерные Тексты

  • Автор темы Romanr
  • Обновлено
  • 20, Oct 2024
  • #1

Двумерные киральные объекты не являются киральными в трехмерном пространстве. Это связано с тем, что вы можете перевернуть их, что эквивалентно получению зеркального изображения, в отличие от двухмерных изображений, где разрешены только вращения в плоскости объекта, что не может воспроизвести эффект зеркальной операции. В этой задаче мы будем решать, являются ли трехмерные тексты хиральными.

Некоторые определения

  • Трехмерный текст: прямоугольный трехмерный массив символов. В этой задаче программам нужно будет обрабатывать только печатаемый ASCII без пробелов (
     
     Z--Z    |    *k    |    Qxxx    |    a*
    ----    |    <0    |    xxxx    |    **
    Z---    |          |            |    
    
    |    l7    |    QQQQ    |    **
    Z---    |    GB    |    QQQQ    |    a*
    ----    |          |            |    
    Z--Z    |    q~    |            |    **
    
    |    ]J    |            |    *a
     
    through Z--Z | i~ | Qx | a | abaLIa ---- | >> | xx | b | N#)*@" Z--Z | | | | }-3}#k | >> | QQ | d | ../..' Z--Z | ~i | QQ | e | ---- | | | | Z--Z | | | f | | | | g | ).
  • Операция зеркала: операция изменения порядка символов вдоль одной оси трехмерного текста.

О ротациях можно думать интуитивно, но вот четкое определение для тех, кто в конечном итоге спросит.

  • вращение на 90 градусов: операция транспонирования каждой плоскости, перпендикулярной определенной оси (скажем, \$i\$), с последующим применением зеркальной операции к оси, отличной от \$i\$.
  • Вращение: Последовательность поворотов на 90 градусов.
  • Хиральный: Трехмерный текст является хиральным, если после применения какой-либо одиночной зеркальной операции не происходит вращения нового текста, воспроизводящего исходный текст. Текст не является хиральным, если после применения одной операции зеркального отражения новый текст можно повернуть обратно в исходный текст.

Несколько более краткое определение киральности — это отсутствие неправильного вращения, при котором объект инвариантен.

Задача

В каком бы формате вы ни предпочитали, в качестве входных данных используйте трехмерный текст.

Выведите одно из двух согласованных значений: одно указывает, что текст является хиральным, а другое — нет.

Самый короткий код выигрывает.

Примеры

В каждой секции вертикальные трубы ( | ) separate the test cases. Within each test case, layers of the three dimensional texts are separated by blank lines.

Не хиральный

~

Хиральный

!

#код-гольф

Romanr


Рег
11 Jun, 2006

Тем
69

Постов
205

Баллов
570
  • 26, Oct 2024
  • #2

Хаскелл, 97 96 95 байт

  • -1 байт благодаря ими
 
 
 
 
 {^*({?x,((++:')'x),(|+:)'x}/,x)?,|x}
 

Попробуйте онлайн!

Объяснение

Хорошо, это немного математика. Хорошо известно, что группа вращений, описанная в задаче (т.е. группа, порожденная поворотами на 90 градусов вокруг одной из трех главных осей), изоморфна симметричной группе \$S_4\$, как описано здесь. Также известно, что \$S_4\$ порождается элементами \$(1\, 2\, 3\, 4),(1\, 3\, 2\, 4)\$.

Я пытаюсь сказать следующее: исправьте два отчетливый осей и назовите повороты на 90 градусов вокруг этих осей \$r_1\$ и \$r_2\$. Тогда мы сможем сгенерировать все вращения, неоднократно применяя \$r_1\$ и \$r_2\$. Немного грубая сила показывает, что нам нужно всего до 6 применений \$r_1\$ и \$r_2\$.

Таким образом, у нас есть следующий алгоритм: учитывая трехмерный текст \$s\$, мы применяем все возможные повороты к \$s\$ и проверяем, есть ли среди этих совпадений \$s\$ перевернутый вдоль оси. Вращения создаются путем объединения до шести поворотов на 90 градусов вокруг двух фиксированных осей.


~⊂∘⌽∊(⊢∪2 0 1∘⍉¨∪⌽∘⍉⍤2¨)⍣≡∘⊂

True is a 90 degrees rotation of a 2D list (also works on 3D lists, as those can be seen as 2D lists of 1D lists). The False это просто s from f , но короче.


s

s checks whether its argument (r s/=) является хиральным.

  • f1(f2(...f6(s)...) generates a list of all sequences of length 6 whose elements are any of foldr($)s (трансформация личности, т.е. ничего не делать), [f1,f2,...,f6] (90 degrees rotation about an axis), map g (поворот на 90 градусов вокруг другой оси).
  • дали список g of transformations, id вычисляет mapM(\_->[id,g,map g])[1..6] , and s проверяет, равен ли результат f reversed (i.e. a mirror image of f s=all(r s/=)$foldr($)s<$>mapM(\_->[id,g,map g])[1..6] ).

Ну и что Data.List does is check if any rotation of transpose соответствует своему зеркальному изображению, возвращая foldr(zipWith(:))e if it does and g в противном случае.

 

SergXploziv


Рег
24 Oct, 2006

Тем
76

Постов
190

Баллов
570
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно