Problema geométrico simple

8

Este problema (ver más abajo) se ha dado como un desafío de golf de código de la liga de programación de la escuela secundaria. Los códigos más cortos enviados durante el concurso fueron: 177 bytes en Ruby, 212 bytes en Python 2.5, 265 bytes en C. ¿Alguien puede acortarlo? Otros lenguajes de programación también están permitidos.

Formulación del problema : dados 8 enteros: -1000 <x1, y1, x2, y2, x3, y3, x4, y4 <1000. Comprueba cuál es la forma de la intersección de dos rectángulos alineados a los ejes: P1 = (x1, y1) , (x1, y2), (x2, y2), (x2, y1) y P2 = (x3, y3), (x3, y4), (x4, y4), (x4, y3).

* If the rectangles do not intersect print *nothing*.
* If there is exactly one point in common print *point*.
* If the intersections of P1 and P2 is a line segment print *line*.
* If they have a rectangular area in common print *rectangle*. 

Especificación de datos de entrada : La primera línea contiene el número de casos de prueba t (1 <= t <1000). Cada una de las siguientes líneas t contiene 8 enteros: x1, y1, x2, y2, x3, y3, x4, y4 (el área de ambos rectángulos es mayor que 0).

Puedes probar tu solución aquí .

kuszi
fuente
¿Cómo es que no veo ninguna solución presentada para este problema?
Keith Randall el
@Keith Randall La sesión del concurso terminó, los resultados de las soluciones enviadas se resumen aquí
kuszi
¿Qué pasa si las coordenadas no hacen rectángulos? ¿Qué pasa si las formas se superponen para formar una forma que no sea un rectángulo?
0WJYxW9FMN
@ J843136028, puede suponer que forman un rectángulo. En la segunda parte de la pregunta, puedo ver ahora que no se menciona que los rectángulos estén alineados con el eje (se agrega la palabra que falta).
kuszi

Respuestas:

4

Python, 200 caracteres

f=lambda a,b,c,d:min(2,sum((x-c)*(x-d)<=0for x in range(min(a,b),max(a,b)+1)))
for i in' '*input():z=map(int,raw_input().split());print('nothing','point','line',0,'rectangle')[f(*z[::2])*f(*z[1::2])]

f devoluciones:

0 if the intervals [a,b] and [c,d] don't overlap
1 if the intervals [a,b] and [c,d] overlap in only one point
2 if the intervals [a,b] and [c,d] overlap in a range of points
Keith Randall
fuente
3

OCaml, 265 caracteres

let a,c,p=abs,compare,print_endline
let q s t u v w x y z=match
c(a(s-u)+a(w-y))(a(s+u-w-y)),
c(a(t-v)+a(x-z))(a(t+v-x-z))with
0,0->p"point"|0,1|1,0->p"line"|1,1->p"rectangle"|_->p"nothing"
let()=for n=1 to read_int()do Scanf.scanf"%d %d %d %d %d %d %d %d\n"q done

Utiliza (abusa) el hecho de que compare devuelve 0, 1 o -1. Esto no está garantizado de acuerdo con su documentación, pero es cierto con OCaml 3.10.1.

bltxd
fuente
¡Agradable! Una sugerencia: escribiría Scanf.scanf "% d% d% d% d% d% d% d% d" (-1 char)
kuszi