Einfaches geometrisches Problem

8

Dieses Problem (siehe unten) wurde als Code-Golf-Herausforderung für die High School Programming League angegeben. Die kürzesten Codes, die während des Wettbewerbs eingereicht wurden, waren: 177 Bytes in Ruby, 212 Bytes in Python 2.5, 265 Bytes in C. Kann jemand es kürzer machen? Andere Programmiersprachen sind ebenfalls erlaubt.

Problemformulierung : Gegeben 8 ganze Zahlen: -1000 <x1, y1, x2, y2, x3, y3, x4, y4 <1000. Überprüfen Sie die Form des Schnittpunkts zweier achsenausgerichteter Rechtecke: P1 = (x1, y1) , (x1, y2), (x2, y2), (x2, y1) und 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*. 

Eingabedatenspezifikation : Die erste Zeile enthält die Anzahl der Testfälle t (1 <= t <1000). Jede der folgenden t Zeilen enthält 8 Ganzzahlen: x1, y1, x2, y2, x3, y3, x4, y4 (Die Fläche beider Rechtecke ist größer als 0).

Sie können Ihre Lösung testen hier .

Kuszi
quelle
Wie kommt es, dass ich keine eingereichten Lösungen für dieses Problem sehe?
Keith Randall
@ Keith Randall Die Wettbewerbssitzung ist vorbei, Ergebnisse für eingereichte Lösungen sind hier zusammengefasst
kuszi
Was ist, wenn die Koordinaten keine Rechtecke bilden? Was ist, wenn sich die Formen überlappen, um eine andere Form als ein Rechteck zu bilden?
0WJYxW9FMN
@ J843136028 Sie können davon ausgehen, dass sie ein Rechteck bilden. Zum zweiten Teil der Frage kann ich jetzt sehen, dass nicht erwähnt wird, dass Rechtecke achsenausgerichtet sind (fehlendes Wort hinzugefügt).
Kuszi

Antworten:

4

Python, 200 Zeichen

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 kehrt zurück:

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
quelle
3

OCaml, 265 Zeichen

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

Verwendet (missbraucht) die Tatsache, dass der Vergleich 0, 1 oder -1 zurückgibt. Dies ist laut Dokumentation nicht garantiert, gilt jedoch für OCaml 3.10.1.

bltxd
quelle
Nett! Ein Vorschlag: Ich würde Scanf.scanf "% d% d% d% d% d% d% d% d" (-1
Zeichen