Хто цей полігон?


14

Зручний і корисний спосіб представлення топологічних поверхонь - це фундаментальний багатокутник . Кожна сторона на полігоні збігається з іншою стороною і може бути паралельною або антипаралельною. Наприклад, ось основний багатокутник тору :

Торус

Щоб зрозуміти, чому це торус, ми могли б уявити наш полігон як аркуш паперу. Щоб зробити належну поверхню, ми хочемо зігнути наш папір так, щоб відповідні краї вирівнювались стрілками так само. Для нашого прикладу тору ми можемо почати з прокручування паперу в циліндр, щоб два синіх ребра (з позначкою b) були з'єднані. Тепер беремо нашу трубочку і згинаємо її так, щоб два червоні краї (позначені а) з'єдналися один з одним. Ми повинні мати форму пончика, яку ще називають тором.

Це може стати трохи складніше. Якщо ви спробуєте зробити те ж саме з наступним багатокутником, коли один з ребер йде в зворотному напрямку:

Кляйн пляшка

ви можете опинитися в якійсь неприємності. Це тому, що цей багатокутник являє собою пляшку Кляйна, яку неможливо вбудувати у три виміри. Ось схема вікіпедії, яка показує, як можна скласти цей багатокутник у пляшку Кляйна:

Складка пляшки Кляйна


Як ви, напевно, здогадалися, завдання тут - взяти фундаментальний багатокутник і визначити, яка це поверхня. Для чотирьох однобічних багатокутників (єдиних поверхонь, від яких вам потрібно буде обробити) є 4 різні поверхні.

Вони є

  • Торус

  • Кляйн пляшка

  • Сфера

  • Проективна площина

Тепер це не тому я не сподіваюсь, що ви візьмете зображення як вхід, замість цього ми використаємо зручне позначення для представлення основного багатокутника. Можливо, ви помітили в двох вище прикладах, що я назвав відповідні краї з тією самою буквою (або a, або b), і що я дав скрученому краю додаткову позначку, щоб показати його скрученим. Якщо ми починаємо з верхнього краю і записуємо мітку для кожного краю, рухаючись за годинниковою стрілкою, ми можемо отримати позначення, що представляє кожен основний багатокутник.

Наприклад, став би наданий Торус ABAB і пляшки Клейна стане ABAB . Для нашого завдання ми зробимо це ще простіше, замість того, щоб позначити вивернуті краї негативом, замість цього ми зробимо великі літери.

Завдання

Даний рядок визначте, чи він є основним багатокутником, і виведіть значення, яке відповідає належній його поверхні. Вам не потрібно точно називати поверхні, вам просто потрібно 4 різних значення виводу, кожне з яких представляє одну з 4 поверхонь з п'ятим значенням, що представляє неправильне введення. Усі основні випадки розглядаються в розділі Прості тести , кожен автомобіль буде ізоморфним для одного з або недійсних.

Правила

  • Сторони не завжди будуть позначені символами a і b, але вони завжди будуть позначені літерами.

  • Дійсне введення буде складатися з 4 букв, двох одного типу та двох інших. Ви завжди повинні виводити правильну поверхню для дійсного введення.

  • Вам слід відхилити (не виводити жодне з 4 значень, що представляють поверхні) недійсним вводом. Ви можете робити що завгодно, відхиляючи вхід, доки він відрізняється від 4 поверхонь

  • Це тому мета - мінімізувати кількість байтів у вихідному коді.

Тести

Прості тести

abab Torus
abAb Klein Bottle
abaB Klein Bottle
abAB Projective Plane
aabb Klein Bottle
aAbb Projective Plane
aabB Projective Plane
aAbB Sphere
abba Klein Bottle
abBa Projective Plane
abbA Projective Plane
abBA Sphere

Більш складні тести

ABAB  Torus
acAc  Klein Bottle
Emme  Projective Plane
zxXZ  Sphere
aaab  Bad input
abca  Bad input
abbaa Bad input
ab1a  Bad input

Чому ababторус і aabbпляшка Клейна?
Ніл

@Neil abab- приклад у першому пункті, ви можете шукати там пояснення. Ось зображення, яке показує, чому aabbце те саме, abAbщо є пляшка Кляйна.
Пост Рок-Гарф Мисливець

1
Які погані вклади ми маємо обробити та визначити як погані? Усі можливі струни? Друкований ASCII? Будь-які обмеження по довжині? Якщо ми запишемо функцію, чи може вона передаватися нестроковим об'єктом? Дійсно, весь цей бізнес, що займається обробкою матеріалів, сприймає мене як хамелеонську проблему.
xnor

1
@WheatWizard У такому випадку ви можете прояснити це в назві та тілі? Він читається як математика аж до Правил, і навіть там легко пропустити вимогу зміни в грі, щоб перевірити, а не просто класифікувати.
xnor

2
Окремо, я думаю, що немає пояснень того, що змушує класифікувати рядок до даної категорії, оскільки, здається, ви не очікуєте, що люди будуть робити математику за класифікацією. Я думаю, що я міг би задавити правила з тестових випадків, але це далеко не ідеально.
xnor

Відповіді:


6

Сітківка , 123 байти

i`(.)(\1..)
$2$1
iG`^([a-z])(?!\1)([a-z])(\1\2|\2\1)$
(..)\1
T
.*(.).\1.*|(.)(.)\3\2
B
(.)..\1|.(.)\2.
P
i`(.)..\1
S
....
P

Спробуйте в Інтернеті! Дякую @JonathanAllen за вказівку на помилку в моєму коді, а також як зберегти деякі байти; Я також гольфував ще декілька байтів, тому не можу визначити його за конкретну фігуру. Пояснення:

i`(.)(\1..)
$2$1

Якщо перші дві літери однакові (ігноруючи регістр), перемістіть першу букву на четверту. Це зменшує кількість випадків, які мені потрібно перевірити.

iG`^([a-z])(?!\1)([a-z])(\1\2|\2\1)$

Якщо немає точно чотирьох літер, або перші дві букви однакові, або дві останні літери не дублюють перші дві, тоді видаліть усе.

(..)\1
T

Торус - це легкий випадок: пара букв, повторний збіг справи.

.*(.).\1.*|(.)(.)\3\2
B

Якщо одна з пар відповідає випадковій справі (у такому випадку інша пара має відповідати випадку), то це пляшка Клейна. Крім того, якщо пара відповідає випадку, але є зворотним, то це також пляшка Кляйна.

(.)..\1|.(.)\2.
P

Якщо, з іншого боку, пара обернена, але лише одна з пар відповідає випадку, то це проективна площина.

i`(.)..\1
S

І якщо пара перевернута, але жоден з них не відповідає випадку, то це сфера. ( i`.(.)\1.також працював би.)

....
P

Все інше - проективна площина.


1
@JonathanAllan Дякую за пораду; сподіваємось, ця версія має кращу валідацію.
Ніл

Якби тільки я міг сам опрацювати логіку: p
Джонатан Аллан

1

Желе , 52 51 58 байт

+7 байт, я виявив, що використовуване відображення не працює для деяких сценаріїв зміни випадків.

“nḲ⁾⁶ƥ¦ṃṗḋ’b4s4‘µṙJ;U$µ€
,ŒsṢÞṪµŒlĠL€⁼2,2ȧ⁸i@€ṢeЀ¢TṪ’:3,8

Монадійне посилання, що бере рядок і повертає наступні п'ять чітких послідовних значень:

  • [-1,-1] - неправильні дані
  • [0,0] - проективна площина
  • [1,0] - пляшка Клейна
  • [2,0] - сфера
  • [2,1] - тору

Спробуйте в Інтернеті! або перегляньте тестовий набір .

Як?

Будь-який фундаментальний багатокутник:

  • незмінний при обертанні - можна обертати папір, як кермо
  • без змін при відображенні - можна перевернути папір
  • без змін при обертанні регістру - можна поміняти місцями as і As та / або поміняти bs і Bs без ефекту - оскільки ми хочемо відповідати вказівкам, фактична мітка не має значення.

Як таке існує дев'ять класів еквівалентності. Код створює списки з чотирьох цілих чисел, кожне з яких представляє приклад одного з дев'яти класів еквівалентності, створює чотири обертання кожного, відображає кожне з них і потім перевіряє, чи є перекладена форма вводу в кожному списку. Класи впорядковані P,P,P,K,K,K,S,S,T, тому, беручи ціле число індексу на основі 0, розділене на кожне з [3,8]отриманих чотирьох дійсних результатів (індексація заснована на 1, атом eповертається 0за неіснування, тому віднімання 1та ділення цілого числа на кожний з [3,8]доходів [-1,-1]для недійсного випадку ).

“nḲ⁾⁶ƥ¦ṃṗḋ’b4s4‘µṙJ;U$µ€ - Link 1, symmetries of the 9 equivalence classes: no arguments
“nḲ⁾⁶ƥ¦ṃṗḋ’              - base 250 number                 1704624888339951310984
           b4            - convert to base 4               [1,1,3,0,1,2,2,0,1,2,3,0,0,2,2,0,1,3,1,0,2,1,2,0,2,3,1,0,3,1,2,0,2,0,2,0]
             s4          - split into 4s                   [[1,1,3,0],[1,2,2,0],[1,2,3,0],[0,2,2,0],[1,3,1,0],[2,1,2,0],[2,3,1,0],[3,1,2,0],[2,0,2,0]]
               ‘         - increment (vectorises)          [[2,2,4,1],[2,3,3,1],[2,3,4,1],[1,3,3,1],[2,4,2,1],[3,2,3,1],[3,4,2,1],[4,2,3,1],[3,1,3,1]]
                µ     µ€ - for €ach:                       ...e.g. [2,2,4,1]:
                  J      -   range of length               [1,2,3,4]
                 ṙ       -   rotate left by (vectorises)   [[2,4,1,2],[4,1,2,2],[1,2,2,4],[2,2,4,1]]
                     $   -   last two links as a monad:
                    U    -     upend (reverse each)        [[2,1,4,2],[2,2,1,4],[4,2,2,1],[1,4,2,2]]
                   ;     -     concatenate                 [[2,4,1,2],[4,1,2,2],[1,2,2,4],[2,2,4,1],[2,1,4,2],[2,2,1,4],[4,2,2,1],[1,4,2,2]]

,ŒsṢÞṪµŒlĠL€⁼2,2ȧ⁸i@€ṢeЀ¢TṪ’:3,8 - Main link: string s      e.g. "xOxO"
 Œs                               - swap case                     "XoXo"
,                                 - pair with s                   ["xOxO","XoXo"]
    Þ                             - sort by:
   Ṣ                              -   sort                        ["xOxO","XoXo"]
     Ṫ                            - tail                          "XoXo"
      µ                           - monadic chain separation, call that v
       Œl                         - convert to lowercase          "xoxo"
         Ġ                        - group indices by value        [[2,4],[1,3]]
          L€                      - length of each                [2,2]
             2,2                  - 2 pair 2                      [2,2]
            ⁼                     - equal? (1 if so, 0 if not)    1
                 ⁸                - link's left argument, v       "XoXo"
                ȧ                 - and (v if equal, 0 if not)    "XoXo"
                     Ṣ            - sort v                        "XoXo"
                  i@€             - first index for €ach          [1,3,1,3]
                         ¢        - call the last link (1) as a nilad
                       Ѐ         - map over right:
                      e           -   exists in?                  [0,0,0,0,0,0,0,0,1]
                          T       - truthy indexes                [                9]
                           Ṫ      - tail (empty list yields 0)    9
                            ’     - decrement                     8
                              3,8 - 3 pair 8                      [3,8]
                             :    - integer division (vectorises) [2,1]

Примітка: 11 байтів ( ŒlĠL€⁼2,2ȧ⁸) підтверджують лише вхідний рядок як належної форми - без цього коду проходить кожен приклад, за винятком того, що ab1aоцінюється як би abBaпроективна площина.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.