Wygodnym i użytecznym sposobem przedstawienia powierzchni topologicznych jest fundamentalny wielokąt . Każda strona wielokąta jest dopasowana do innej strony i może być równoległa lub antyrównoległa. Na przykład tutaj jest podstawowy wielokąt torusa :
Aby dowiedzieć się, dlaczego jest to torus, możemy sobie wyobrazić, że naszym wielokątem jest kartka papieru. Aby uzyskać odpowiednią powierzchnię, chcemy wygiąć papier, tak aby odpowiadające mu krawędzie zrównały się ze strzałkami w tę samą stronę. W naszym przykładzie torusa możemy zacząć od zrolowania papieru do cylindra, aby połączyć dwie niebieskie krawędzie (oznaczone b). Teraz bierzemy naszą rurkę i wyginamy ją tak, aby dwie czerwone krawędzie (oznaczone a) łączyły się ze sobą. Powinniśmy mieć kształt pączka, zwany także torusem.
Może to być nieco trudniejsze. Jeśli spróbujesz zrobić to samo z następującym wielokątem, w którym jedna z krawędzi biegnie w przeciwnym kierunku:
możesz mieć kłopoty. Wynika to z faktu, że ten wielokąt reprezentuje butelkę Kleina, której nie można osadzić w trzech wymiarach. Oto schemat z wikipedii pokazujący, jak możesz złożyć ten wielokąt w butelkę Kleina:
Jak można się domyślać, zadaniem tutaj jest wzięcie podstawowego wielokąta i określenie, która to powierzchnia. W przypadku wielokątów czworokątnych (jedyne powierzchnie, które będziesz musiał obsługiwać) istnieją 4 różne powierzchnie.
Oni są
Torus
Butelka Kleina
Kula
Samolot projekcyjny
Teraz nie jest to przetwarzanie obrazu, więc nie oczekuję, że weźmiesz obraz jako dane wejściowe, zamiast tego użyjemy wygodnej notacji do przedstawienia podstawowego wielokąta. Być może zauważyłeś w dwóch powyższych przykładach, że nazwałem odpowiednie krawędzie tą samą literą (albo a lub b) i że nadałem skręconej krawędzi dodatkowy znak, aby pokazać jej skręcenie. Jeśli zaczniemy od górnej krawędzi i zapiszemy etykietę dla każdej krawędzi, postępując zgodnie z ruchem wskazówek zegara, możemy otrzymać notację reprezentującą każdy fundamentalny wielokąt.
Na przykład Torus warunkiem staną abab a Bottle Klein staną abab . Dla naszego wyzwania sprawimy, że będzie to jeszcze prostsze, zamiast oznaczać skręcone krawędzie znakiem minus, zamiast tego litery te będą pisane wielką literą.
Zadanie
Biorąc pod uwagę ciąg, określ, czy reprezentuje on podstawowy wielokąt, i wypisz wartość odpowiadającą jego właściwej powierzchni. Nie trzeba dokładnie nazywać powierzchni, wystarczy 4 wyjściowe odrębne wartości, każda reprezentująca jedną z 4 powierzchni, a piąta wartość reprezentuje nieprawidłowe dane wejściowe. Wszystkie podstawowe przypadki są omówione w części Proste testy , każdy samochód będzie izomorficzny w stosunku do jednego lub nieważny.
Zasady
Strony nie zawsze będą oznaczone a i b, ale zawsze będą oznaczone literami.
Prawidłowe dane wejściowe będą się składały z 4 liter, dwóch jednego typu i dwóch innych. Zawsze należy wyprowadzać poprawną powierzchnię dla poprawnego wprowadzania.
Należy odrzucić (nie wypisać żadnej z 4 wartości reprezentujących powierzchnie) nieprawidłowe dane wejściowe. Możesz zrobić wszystko, odrzucając dane wejściowe, o ile można je odróżnić od 4 powierzchni
To jest golf golfowy, więc celem jest zminimalizowanie liczby bajtów w kodzie źródłowym.
Testy
Proste testy
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
Trudniejsze testy
ABAB Torus
acAc Klein Bottle
Emme Projective Plane
zxXZ Sphere
aaab Bad input
abca Bad input
abbaa Bad input
ab1a Bad input
źródło
abab
torus iaabb
butelka Kleina?abab
jest przykładem z pierwszego akapitu, możesz tam znaleźć wyjaśnienie. Oto obraz pokazujący, dlaczegoaabb
jest taki sam, jakabAb
butelka Kleina.Odpowiedzi:
Siatkówka , 123 bajty
Wypróbuj online! Dzięki @JonathanAllen za wskazanie błędu w moim kodzie, a także za zapisanie niektórych bajtów; Grałem też w trochę więcej bajtów, więc nie mogę mu przypisać określonej liczby. Wyjaśnienie:
Jeśli dwie pierwsze litery są takie same (ignorując wielkość liter), przenieś pierwszą literę na czwartą. Zmniejsza to liczbę przypadków, które muszę przetestować.
Jeśli nie ma dokładnie czterech liter lub dwie pierwsze litery są takie same lub dwie ostatnie litery nie duplikują pierwszych dwóch, usuń wszystko.
Torus jest łatwym przypadkiem: para liter, powtarzająca się wielkość liter.
Jeśli jedna z par pasuje do skrzynki (w którym to przypadku druga para musi niedopasować skrzynkę), to jest to butelka Kleina. Alternatywnie, jeśli para pasuje do wielkości liter, ale jest odwrócona, oznacza to również butelkę Kleina.
Jeśli z drugiej strony para jest odwrócona, ale tylko jedna z nich pasuje do wielkości liter, oznacza to, że jest to płaszczyzna rzutowa.
A jeśli para jest odwrócona, ale nie pasuje do wielkości liter, to jest to kula. (
i`.(.)\1.
również by działało.)Cała reszta to płaszczyzna rzutowa.
źródło
Galaretka ,
52 5158 bajtów+7 bajtów, odkryłem, że mapowanie, którego użyłem, nie działało w niektórych (poza przykładowych) scenariuszach zmiany wielkości liter.
Monadyczny link pobierający ciąg znaków i zwracający pięć następujących spójnych wartości:
[-1,-1]
- nieprawidłowe wejście[0,0]
- płaszczyzna rzutowa[1,0]
- Butelka Kleina[2,0]
- kula[2,1]
- torusWypróbuj online! lub zobacz pakiet testowy .
W jaki sposób?
Każdy fundamentalny wielokąt to:
a
s iA
si i / lubb
sw iB
s bez efektu - ponieważ chcemy dopasować kierunki, w których rzeczywista etykieta jest nieistotna.Jako takie istnieje dziewięć klas równoważności. Kod tworzy listy czterech liczb całkowitych, z których każda reprezentuje przykład jednej z dziewięciu klas równoważności, tworzy cztery obroty każdej z nich, odzwierciedla każdą z nich, a następnie sprawdza, czy na każdej liście istnieje przetłumaczona postać danych wejściowych. Klas są sortowane
P,P,P,K,K,K,S,S,T
, więc przyjmując całkowitą indeks 0 opartych podzieloną przez każdy z[3,8]
wydajnością czterech poprawnych wyników (indeksowania 1 opartych i atome
powraca0
do nieistnienie tak odjęcie1
i całkowitą podzielenie przez każdy z[3,8]
wydajnością[-1,-1]
dla nieprawidłowej przypadku ).Uwaga: 11 bajtów (
ŒlĠL€⁼2,2ȧ⁸
) sprawdza tylko poprawność wejściowego ciągu znaków - bez tego kodu każdy przykładowy przypadek przechodzi, z wyjątkiem tego, żeab1a
jest oceniany tak, jakby byłabBa
płaszczyzną rzutową.źródło