O problema : conte o número de furos em um polígono conectado. A conectividade do polígono é garantida pela condição de que cada triângulo na triangulação de entrada compartilhe pelo menos um lado com outro triângulo e que exista apenas um desses conjuntos de triângulos conectados.
Entrada é uma lista L
de n
pontos no plano e uma lista T
de três tuplas com entradas de 0...n-1
. Para cada item T
da tupla (t_1,t_2,t_3)
representa os três vértices (da lista L
) de um triângulo na triangulação. Observe que essa é uma triangulação no sentido de 'triangulação de polígono' , por isso nunca haverá dois triângulos T
nessa sobreposição. Uma estipulação adicional é que você não precisará higienizar a entrada L
e T
não contém repetições.
Exemplo 1 : se L = {{0,0},{1,0},{0,1},{1,2}}
e, em T = {{0,1,2},{1,2,3}}
seguida, o polígono especificado tem uma contagem de orifícios de 0.
Exemplo 2 : Se L = {{0,0},{1,0},{2,0},{2,1},{2,2},{1,2},{0,2},{0,1},{.5,.5},{1.5,.5},{1.5,1.5},{.5,1.5}}
e, em T = {{5,6,11},{5,10,11},{4,5,10},{3,8,10},{2,3,9},{2,8,9},{1,2,8},{0,1,8},{0,8,11},{0,7,11},{6,7,11},{3,4,10}}
seguida, a entrada do polígono deve resultar em uma saída 2.
A tarefa é escrever o programa (ou função) mais curto que recebe L
e T
como entrada e retorna o número de furos. O 'vencedor' será reconhecido como a entrada com o menor número de caracteres (data final prevista para 1º de junho).
Exemplo de formatação de entrada (observe a indexação 0):
0,0
1,0
0,1
1,2
0,1,2
1,2,3
T=1,2,3/1,2,4/5,6,7/5,6,8
,. Cada triângulo compartilha uma borda com outro triângulo, mas a triangulação está desconectadaT=1,2,3/1,4,5
está ligado, mas não edge-conectado)Respostas:
GolfScript (23 caracteres)
Assume o formato de entrada usando a notação de matriz GolfScript e as coordenadas entre aspas (ou integrais). Por exemplo
( Equivalente online )
ou
( Equivalente online )
fonte
Python, 71
O que se segue é um programa (não uma função ) que calcula o número desejado.
Exemplo de uso:
fonte
APL, 36
A função assume
L
como argumento à esquerda eT
à direita.Por exemplo:
Explicação, indo da direita para a esquerda:
⍴⍺,⍵
concatena os dois vetores de entrada e retorna seu comprimento (V + F
)¨⍵
aplica a função à esquerda a todos os elementos do argumento certo e retorna o resultado⍵,⍵
retorna o argumento correto concatenado consigo mesmo3 2⍴
molda o argumento do vetor em três pares. Nesse caso, ele une o primeiro e o segundo, o terceiro e o primeiro e o segundo e o terceiro itens do vetor.,/
une o argumento do vetor⍵[⍋⍵]
classifica o argumento certo∪/
filtra quaisquer duplicatas⍴⊃
transforma um escalar aninhado em um vetor e retorna o comprimento dele.E
)1
é auto-explicativo (espero ...)A função inteira retorna
1+E-(V+F)
, ou1-(F+V-E)
.fonte
Mathematica, 93 (ainda não jogou muito golfe)
(Espaços adicionados para maior clareza)
Teste:
fonte
Erosion
)?Ruby, 239 caracteres (227 corpo)
observe que estou considerando apenas a topologia. Eu não estou usando as posições de vértice de forma alguma.
chamador (espera T no formato Mathematica ou JSON):
Teste:
fonte
Mathematica
76 73 72 6762Após muita experimentação, percebi que a localização precisa dos vértices não era preocupante, então representei o problema com os gráficos. Os invariantes essenciais, o número de triângulos, arestas e vértices permaneceram invariáveis (desde que a passagem de linha fosse evitada).
Havia dois tipos de "triângulos" internos no gráfico: esses eram presumivelmente uma face, isto é, um triângulo "cheio" e aqueles onde não havia. O número de faces internas não teve nenhuma relação com as arestas ou vértices. Isso significava que fazer furos em gráficos totalmente "preenchidos" reduzia apenas o número de faces. Joguei sistematicamente com variações entre triângulos, acompanhando os rostos, vértices e arestas. Eventualmente, percebi que o número de furos sempre era igual a 1 - #faces - # vértices + #edges. Isso acabou por ser 1 menos a característica de Euler (que eu só conhecia no contexto dos poliedros regulares (embora o comprimento das bordas não tenha claramente nenhuma importância).
A função abaixo retorna o número de furos quando os vértices e triângulos são inseridos. Ao contrário do meu envio anterior, ele não depende da digitalização de uma imagem. Você pode pensar nisso como 1 - característica de Euler, ou seja, 1 - (F + V-E) onde
F
= #faces,V
= # vértices,E
= # arestas. A função retorna o número de furos,1 - (F + V -E)
considerando as faces reais (triângulos) e vértices.Pode-se mostrar facilmente que a remoção de qualquer triângulo na parte externa do complexo não afeta a característica de Euler, independentemente de compartilhar um ou dois lados com outros triângulos.
Nota: A minúscula
v
será usada no lugar daL
formulação original; isto é, contém os próprios vértices (não V, o número de vértices)f
é usado para aT
partir da formulação original; isto é, contém os triângulos, representados como o triplo ordenado dos índices de vértices.Código
(Agradecemos ao Sr. Wizard por cortar 5 caracteres ao eliminar a regra de substituição.)
Exemplo 1
v = {{0, 0}, {1, 0}, {0, 1}, {1, 2}}; f = {{0, 1, 2}, {1, 2, 3}};
Zero orifícios.
Exemplo 2
v = {{0, 0}, {1, 0}, {2, 0}, {2, 1}, {2, 2}, {1, 2}, {0, 2}, {0, 1} , {.5, .5}, {1.5, .5}, {1.5, 1.5}, {.5, 1.5}}; f = {{5, 6, 11}, {5, 10, 11}, {4, 5, 10}, {3, 8, 10}, {2, 3, 9}, {2, 8, 9} , {1, 2, 8}, {0, 1, 8}, {0, 8, 11}, {0, 7, 11}, {6, 7, 11}, {3, 4, 10}};
Assim, 2 furos estão no exemplo 2.
fonte
MorphologicalEulerNumber[]
). Mma 9.01, Win XP.MorphologicalEulerNumber
às vezes requer uma imagem; ele se recusa a aceitar um objeto gráfico. Nesses casos, o tamanho do furo e a resolução são críticos (consulte codegolf.stackexchange.com/questions/8706/… ). Mas aqui ele trabalha diretamente com o objeto Graphics, que contém explicitamente todos os vértices. Imaginei (ou esperava) que usasse uma abordagem que não dependesse da imagem. Eu gostaria de saber como ele tentou resolver o problema. Talvez alguma spelunking no código fonte da função esclareça as coisas.Python, 107
Percebi que pegar os pares diretamente era mais curto
from itertools import*
e digitarcombinations()
. No entanto, também notei que minha solução contava com as faces triangulares de entrada com seus vértices listados em ordem consistente. Portanto, os ganhos na contagem de caracteres não são tão grandes.Python, 115
Abordagem característica de Euler, a verbosidade dos instrumentos de controle parece impossível de evitar. Gostaria de saber se seria mais barato usar uma técnica mais direta para fazer pares de vértices.
Exemplo de uso:fonte