Escriba un programa para determinar si el polígono de entrada es convexo . El polígono se especifica con una línea que contiene N , el número de vértices, luego N líneas que contienen las coordenadas x e y de cada vértice. Los vértices se enumerarán en sentido horario a partir de un vértice arbitrario.
Ejemplo 1
entrada
4
0 0
0 1
1 1
1 0
salida
convex
ejemplo 2
entrada
4
0 0
2 1
1 0
2 -1
salida
concave
ejemplo 3
entrada
8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0
salida
convex
x y y son números enteros, n <1000 , y | x |, | y | <1,000 . Puede suponer que el polígono de entrada es simple (ninguno de los bordes se cruza, solo 2 bordes tocan cada vértice). El programa más corto gana.
code-golf
math
geometry
decision-problem
Keith Randall
fuente
fuente
Respuestas:
J, 105
Pasa las tres pruebas anteriores.
Editar: (111-> 115) Manejar puntos co-lineales eliminando ángulos de pi. Obtuve algunos personajes en otros lugares.
Editar: (115-> 105) Menos tonto.
Explicación para los discapacitados en J:
(1!:1)3
lea STDIN a EOF. (Yo creo que.)0&".;._2
es un buen modismo para analizar este tipo de entrada.j./"1}.
corte la primera línea de entrada (N 0) y convierta los pares en complejos.(,2&{.)
agregue los dos primeros puntos al final de la lista.3(f)\
aplica f a la ventana deslizante de longitud 3 (3 puntos para un ángulo)[:-/12 o.-@-/@}.,-/@}:
es un verbo que transforma cada 3 puntos en un ángulo entre -pi y pi.-@-/@}.,-/@}:
produce (p1 - p2), (p3 - p2). (Recuerde que estos son complejos).12 o.
da un ángulo para cada complejo.[:-/(...)
da la diferencia de los dos ángulos.(o.1)([:>-.~)(o.2)|
mod 2 pi, elimine los ángulos de pi (segmentos rectos) y compárelos con pi (mayor que, menor que, no importa a menos que se suponga que los puntos están enrollados en una dirección).1=#=
si todos esos resultados de comparación son 1 o 0 (con autoclasificación. Esto parece tonto).echo>('concave';'convex'){~
impresión convexafuente
Python - 149 caracteres
fuente
Ruby 1.9,
147133130124123fuente
scala: 297 caracteres
fuente
def main(a:...
lugar dedef main(args:...
.