Problema geométrico simples

8

Esse problema (veja abaixo) foi apresentado como um desafio de golfe com código da High School Programming League. Os códigos mais curtos enviados durante o concurso foram: 177 bytes em Ruby, 212 bytes em Python 2.5 e 265 bytes em C. Alguém pode torná-lo mais curto? Outras linguagens de programação também são permitidas.

Formulação do problema : Dado 8 números inteiros: -1000 <x1, y1, x2, y2, x3, y3, x4, y4 <1000. Verifique qual é a forma da interseção de dois retângulos alinhados ao eixo: P1 = (x1, y1) , (x1, y2), (x2, y2), (x2, y1) e 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*. 

Especificação dos dados de entrada : A primeira linha contém o número de casos de teste t (1 <= t <1000). Cada uma das seguintes linhas t contém 8 números inteiros: x1, y1, x2, y2, x3, y3, x4, y4 (a área de ambos os retângulos é maior que 0).

Você pode testar sua solução aqui .

kuszi
fonte
Como é que não vejo soluções enviadas para esse problema?
Keith Randall
@Keith Randall A sessão concurso é longo, os resultados para soluções apresentadas são resumidos aqui
kuszi
E se as coordenadas não fizerem retângulos? E se as formas se sobrepuserem para formar uma forma diferente de um retângulo?
0JJxW9FMN
@ J843136028 você pode assumir que eles formam um retângulo. Para a segunda parte da pergunta, posso ver agora que não é mencionado que os retângulos estão alinhados com o eixo (palavra que falta foi adicionada).
kuszi

Respostas:

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 retorna:

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
fonte
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

Usa (abusa) o fato de comparar retornar 0, 1 ou -1. Isso não é garantido de acordo com a documentação, mas é verdade no OCaml 3.10.1.

bltxd
fonte
Agradável! Uma sugestão: Eu iria escrever Scanf.scanf "% d% d% d% d% d% d% d% d" (-1 carvão animal)
kuszi