Uma maneira conveniente e útil de representar superfícies topológicas é com um polígono fundamental . Cada lado de um polígono corresponde a outro lado e pode ser paralelo ou anti-paralelo. Por exemplo, o aqui é o polígono fundamental de um toro :
Para descobrir por que esse é um toro, poderíamos imaginar nosso polígono sendo uma folha de papel. Para criar a superfície adequada, queremos dobrar o papel para que as bordas correspondentes se alinhem com as setas seguindo o mesmo caminho. Para o nosso exemplo de toro, podemos começar enrolando o papel em um cilindro para que as duas bordas azuis (rotuladas b) sejam conectadas. Agora pegamos nosso tubo e dobramos para que as duas bordas vermelhas (rotuladas a) se conectem. Deveríamos ter uma forma de rosca, também chamada de toro.
Isso pode ficar um pouco mais complicado. Se você tentar fazer o mesmo com o polígono a seguir, onde uma das arestas está indo na direção oposta:
você pode encontrar-se em algum problema. Isso ocorre porque esse polígono representa a garrafa Klein que não pode ser incorporada em três dimensões. Aqui está um diagrama da wikipedia mostrando como você pode dobrar esse polígono em uma garrafa de Klein:
Como você deve ter adivinhado, a tarefa aqui é pegar um polígono fundamental e determinar qual é a superfície. Para polígonos de quatro lados (as únicas superfícies que você precisará manusear), existem 4 superfícies diferentes.
Eles são
Toro
Klein Bottle
Esfera
Plano projetivo
Agora, como este não é o processamento de imagens , não espero que você tire uma imagem como entrada. Em vez disso, usaremos uma notação conveniente para representar o polígono fundamental. Você deve ter notado nos dois exemplos acima que eu nomeei as arestas correspondentes com a mesma letra (a ou b), e que dei à borda torcida uma marca adicional para mostrar sua torção. Se começarmos pela borda superior e escrevermos o rótulo de cada borda à medida que avançamos no sentido horário, podemos obter uma notação que representa cada polígono fundamental.
Por exemplo, o Torus fornecido se tornaria abab e a Garrafa Klein se tornaria ab - ab . Para o nosso desafio, vamos torná-lo ainda mais simples. Em vez de marcar as bordas retorcidas com um negativo, em vez disso, tornaremos essas letras maiúsculas.
Tarefa
Dada uma sequência, determine se ela representa um polígono fundamental e gera um valor correspondente à superfície adequada. Você não precisa nomear as superfícies exatamente, você só precisa de 4 valores distintos de saída, cada um representando uma das 4 superfícies com um quinto valor representando entrada incorreta. Todos os casos básicos são abordados na seção Testes simples , todos os carros serão isomórficos para um dos ou inválidos.
Regras
Os lados nem sempre serão rotulados com aeb, mas sempre com letras.
A entrada válida será composta por 4 letras, duas de um tipo e duas de outro. Você sempre deve produzir a superfície correta para entrada válida.
Você deve rejeitar (não gerar nenhum dos 4 valores que representam superfícies) a entrada inválida. Você pode fazer qualquer coisa ao rejeitar uma entrada, desde que seja distinguível das 4 superfícies
Isso é código-golfe, portanto, o objetivo é minimizar o número de bytes no seu código-fonte.
Testes
Testes simples
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
Testes mais complicados
ABAB Torus
acAc Klein Bottle
Emme Projective Plane
zxXZ Sphere
aaab Bad input
abca Bad input
abbaa Bad input
ab1a Bad input
fonte
abab
um toro eaabb
uma garrafa de Klein?abab
é o exemplo no primeiro parágrafo, você pode procurar uma explicação aqui. Aqui está uma imagem mostrando por queaabb
é o mesmoabAb
que uma garrafa de Klein.Respostas:
Retina , 123 bytes
Experimente online! Agradeço a JonathanAllen por apontar um erro no meu código e também como salvar alguns bytes; Eu também joguei mais alguns bytes, então não posso dar crédito a ele por uma figura específica. Explicação:
Se as duas primeiras letras forem iguais (ignorar maiúsculas e minúsculas), mova a primeira para a quarta. Isso reduz o número de casos que eu preciso testar.
Se não houver exatamente quatro letras, ou as duas primeiras forem iguais, ou as duas últimas não duplicarem as duas primeiras, exclua tudo.
O toro é o caso mais fácil: um par de letras, maiúsculas e minúsculas.
Se um dos pares corresponder a maiúsculas e minúsculas (nesse caso, outro do par deve corresponder a maiúsculas e minúsculas), esse é um frasco de Klein. Como alternativa, se o par coincidir com maiúsculas e minúsculas, mas for revertido, também será uma garrafa de Klein.
Se, por outro lado, o par estiver invertido, mas apenas um dos pares corresponder ao caso, então esse é um plano projetivo.
E se o par estiver invertido, mas nenhum deles corresponder ao caso, então essa é uma esfera. (
i`.(.)\1.
também funcionaria.)Tudo o resto é um plano projetivo.
fonte
Geléia ,
52 5158 bytes+7 bytes, descobri que o mapeamento usado não funcionava em alguns cenários (fora do exemplo) de alteração de caso.
Um link monádico que pega uma sequência e retorna os cinco valores distintos e consistentes a seguir:
[-1,-1]
- entrada inválida[0,0]
- plano projetivo[1,0]
- Garrafa Klein[2,0]
- esfera[2,1]
- toroExperimente online! ou veja a suíte de testes .
Quão?
Qualquer polígono fundamental é:
a
s eA
s e / ou trocab
s eB
s sem efeito - uma vez que queremos para coincidir com as direções da etiqueta real é irrelevante.Como tal, existem nove classes de equivalência. O código cria listas de quatro números inteiros, cada um representando um exemplo de uma das nove classes de equivalência, cria as quatro rotações de cada, reflete cada uma delas e verifica se existe uma forma traduzida da entrada em cada lista. As classes são ordenadas
P,P,P,K,K,K,S,S,T
, portanto, pegar o número inteiro com base em 0 dividido por cada um[3,8]
produz as quatro saídas válidas (a indexação é baseada em 1 e o átomoe
retorna0
pela inexistência, subtraindo1
e dividindo o número inteiro por cada um dos[3,8]
rendimentos[-1,-1]
para o caso inválido )Nota: 11 bytes (
ŒlĠL€⁼2,2ȧ⁸
) validam apenas a sequência de entrada como tendo a forma correta - sem esse código, todos os casos de exemplo passam, exceto queab1a
são avaliados como se fossemabBa
um plano projetivo.fonte