Удобный и полезный способ представления топологических поверхностей с помощью фундаментального многоугольника . Каждая сторона многоугольника совпадает с другой стороной и может быть параллельной или антипараллельной. Например, вот фундаментальный многоугольник тора :
Чтобы понять, почему это тор, мы можем представить, что наш многоугольник - это лист бумаги. Чтобы получить правильную поверхность, мы хотим согнуть нашу бумагу так, чтобы соответствующие ребра совпали со своими стрелками, идущими одинаковым образом. Для нашего примера тора мы можем начать, свернув бумагу в цилиндр так, чтобы два синих края (помеченные буквой b) были соединены. Теперь возьмем нашу трубку и согнем ее так, чтобы два красных края (обозначенных буквой а) соединились друг с другом. Мы должны иметь форму пончика, также называемого тор.
Это может стать немного сложнее. Если вы попытаетесь сделать то же самое со следующим многоугольником, где одно из ребер идет в противоположном направлении:
Вы можете оказаться в беде. Это потому, что этот многоугольник представляет бутылку Кляйна, которая не может быть встроена в трех измерениях. Вот диаграмма из Википедии, показывающая, как вы можете сложить этот многоугольник в бутылку Кляйна:
Как вы уже догадались, задача здесь состоит в том, чтобы взять фундаментальный многоугольник и определить, какая это поверхность. Для четырехсторонних полигонов (единственные поверхности, с которыми вам придется обращаться) есть 4 разных поверхности.
Они есть
торус
Бутылка Кляйна
сфера
Проективная плоскость
Теперь это не обработка изображения, поэтому я не ожидаю, что вы возьмете изображение в качестве ввода, вместо этого мы будем использовать удобную запись для представления основного многоугольника. Вы, возможно, заметили в двух приведенных выше примерах, что я назвал соответствующие ребра одной и той же буквой (или a или b), и что я дал скрученному ребру дополнительную метку, чтобы показать его скрученный. Если мы начнем с верхнего края и запишем метку для каждого края по часовой стрелке, мы можем получить обозначение, представляющее каждый фундаментальный многоугольник.
Например, предоставленный Торус станет abab, а Бутылка Кляйна станет ab - ab . Для нашей задачи мы сделаем это еще проще, вместо того, чтобы пометить скрученные края отрицательным, мы вместо этого сделаем эти буквы заглавными.
задача
По заданной строке определите, представляет ли она фундаментальный многоугольник, и выведите значение, соответствующее ее правильной поверхности. Вам не нужно точно называть поверхности, вам просто нужно 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
бутылка Кляйна?abab
- это пример в первом абзаце, вы можете найти там объяснение. Вот изображение, показывающее, почемуaabb
это то же самое,abAb
что и бутылка Кляйна.Ответы:
Сетчатка , 123 байта
Попробуйте онлайн! Спасибо @JonathanAllen за указание на ошибку в моем коде, а также за то, как сохранить несколько байтов; Я также играл в гольф еще несколько байтов, поэтому я не могу отдать ему должное за конкретную цифру. Объяснение:
Если первые две буквы совпадают (без учета регистра), переместите первую букву на четвертую. Это уменьшает количество случаев, которые мне нужно проверить.
Если не совсем четыре буквы, или первые две буквы совпадают, или последние две буквы не дублируют первые две, то удалите все.
Тора - это простой случай: пара букв, повторяющиеся совпадения.
Если одна из пары соответствует случаю (в этом случае другая из пары должна не соответствовать случаю), то это бутылка Кляйна. Альтернативно, если пара соответствует случаю, но перевернута, то это также бутылка Кляйна.
Если, с другой стороны, пара перевернута, но только одна пара соответствует регистру, то это проективная плоскость.
И если пара перевернута, но не соответствует регистру, то это сфера. (
i`.(.)\1.
также будет работать.)Все остальное - проективная плоскость.
источник
Желе ,
52 5158 байт+7 байт, я обнаружил, что отображение, которое я использовал, не работало для некоторых (вне примера) сценариев изменения случая.
Монадическая ссылка, принимающая строку и возвращающая следующие пять различных согласованных значений:
[-1,-1]
- Неверный Ввод[0,0]
- проективная плоскость[1,0]
- бутылка Кляйна[2,0]
- сфера[2,1]
- торусПопробуйте онлайн! или посмотрите набор тестов .
Как?
Любой фундаментальный многоугольник это:
a
s иA
s и / илиb
s иB
s без эффекта - поскольку мы хотим совпасть с направлениями, фактическая метка несущественна.Таким образом, существует девять классов эквивалентности. Код создает списки из четырех целых чисел, каждый из которых представляет пример одного из девяти классов эквивалентности, создает четыре поворота каждого, отражает каждый из них и затем проверяет, существует ли переведенная форма ввода в каждом списке. Классы упорядочены
P,P,P,K,K,K,S,S,T
, поэтому взятие целочисленного индекса на основе 0, деленного на каждый из,[3,8]
дает четыре допустимых выхода (индексирование основано на 1, а атомe
возвращается0
за несуществование, поэтому вычитание1
и деление целого числа на каждое из выходных[3,8]
значений[-1,-1]
для недопустимого случая ).Примечание: 11 bytes (
ŒlĠL€⁼2,2ȧ⁸
) только проверяют правильность входной строки как правильной формы - без этого кода проходит каждый пример, за исключением того, чтоab1a
он оценивается какabBa
проективная плоскость.источник