number i (set p)
g=card(p);h=g;n=0;e=p[0];q=e.e
for d in p
if h<g-1
q=q.e
n=card(intersection(d.e,q))>1or d on q?1|n
end
e=d;h=h-1
end;return n;end
Função denominada i
that, passou por um conjunto de pontos, retorna 0 ou 1. Ponto-e-vírgula e quebras de linha são intercambiáveis para finalizar um comando. Apenas agrupei algumas coisas para manter o código visivelmente curto, pois não estamos acostumados a legibilidade. código por aqui de qualquer maneira.
Eukleides é uma linguagem de geometria plana principalmente para saída gráfica, mas com habilidades programáticas decentes também. Eu pensei que seria ótimo para esta tarefa, mas algumas coisas me frustraram. Primeiro, é importante notar que os conjuntos no Eukleides são essencialmente matrizes de pontos e, quando aplicáveis, são renderizados como caminhos feitos de segmentos de linha conectados. Eukleides suporta a geração iterativa de conjuntos via loci, semelhante a um loop for que cria um conjunto no processo. Se eu fosse capaz de usar um locus, ele teria raspado bytes, mas aparentemente Eukleides não gosta de fazer referência a um locus parcialmente formado a partir de si.
A outra grande frustração foi que, se, aparentemente, dois segmentos de linha idênticos estiverem em cima um do outro, intersection
retornará apenas um ponto ofensivo (o que faz sentido, suponho, haveria interseções infinitas). Meu método é essencialmente construir o caminho um passo atrás e testar o próximo segmento de linha para interseções com o caminho. Devido ao comportamento de interseção mencionado acima, verifico separadamente se o ponto está ou não no caminho.
Editar : corte 1 byte reordenando a or
instrução para permitir a remoção de um espaço antes or
; 5 bytes a mais, alterando esse if
bloco para uma operação ternária.
Casos de teste:
ta=point(0,0).point(1,0)
tb=point(0,0).point(1,0).point(0,0)
tc=point(0,0).point(1,0).point(1,1).point(0,0)
td=point(0,0).point(2,0).point(1,1).point(1,-1)
te=point(0,0).point(10,0).point(0,1).point(10,1).point(0,2).point(10,2)
print i(ta);print i(tb);print i(tc);print i(td);print i(te)
0
1
1
1
0