Escreva um programa para determinar se o polígono de entrada é convexo . O polígono é especificado com uma linha contendo N , o número de vértices, em seguida, N linhas que contêm o x e y coordenadas de cada vértice. Os vértices serão listados no sentido horário a partir de um vértice arbitrário.
Exemplo 1
entrada
4
0 0
0 1
1 1
1 0
saída
convex
exemplo 2
entrada
4
0 0
2 1
1 0
2 -1
saída
concave
exemplo 3
entrada
8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0
saída
convex
x e y são números inteiros, N <1000 e | x |, | y | <1000 . Você pode assumir que o polígono de entrada é simples (nenhuma das arestas se cruza, apenas duas arestas tocam em cada vértice). O programa mais curto vence.
code-golf
math
geometry
decision-problem
Keith Randall
fonte
fonte
Respostas:
J, 105
Passa nos três testes acima.
Editar: (111-> 115) Lide com pontos co-lineares eliminando ângulos de pi. Ganhou alguns caracteres em outro lugar.
Editar: (115-> 105) Menos burro.
Explicação para os deficientes em J:
(1!:1)3
leia STDIN para EOF. (Eu acho que.)0&".;._2
é um bom idioma para analisar esse tipo de entrada.j./"1}.
corte a primeira linha de entrada (N 0) e converta pares em complexos.(,2&{.)
coloque os dois primeiros pontos no final da lista.3(f)\
aplica-se f à janela deslizante de comprimento 3 (3 pontos para um ângulo)[:-/12 o.-@-/@}.,-/@}:
é um verbo que transforma cada 3 pontos em um ângulo entre -pi e pi.-@-/@}.,-/@}:
produz (p1 - p2), (p3 - p2). Lembre-se de que são complexos.12 o.
dá um ângulo para cada complexo.[:-/(...)
dá a diferença dos dois ângulos.(o.1)([:>-.~)(o.2)|
mod 2 pi, elimine ângulos de pi (segmentos retos) e compare com pi (maior que, menor que, não importa, a menos que os pontos devam ser enrolados em uma direção).1=#=
se todas essas comparações resultarem 1 ou 0 (com auto-classificação. Isso parece idiota.)echo>('concave';'convex'){~
impressão convexa.fonte
Python - 149 caracteres
fonte
Ruby 1.9,
147133130 130124123fonte
scala: 297 caracteres
fonte
def main(a:...
vez dedef main(args:...
.