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 .


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

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.


Nett! Ein Vorschlag: Ich würde Scanf.scanf "% d% d% d% d% d% d% d% d" (-1
— Zeichen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.