単純な幾何学的問題


8

この問題(下記を参照)は、高校プログラミングリーグのコードゴルフチャレンジとして与えられています。コンテスト中に提出された最短のコードは、Rubyで177バイト、Python 2.5で212バイト、Cで265バイトでした。だれでも短くできますか?他のプログラミング言語も許可されています。

問題の定式化:与えられた8つの整数:-1000 <x1、y1、x2、y2、x3、y3、x4、y4 <1000。 、(x1、y2)、(x2、y2)、(x2、y1)および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*. 

入力データの仕様:最初の行には、テストケースの数t(1 <= t <1000)が含まれています。次の各t行には、8つの整数が含まれています:x1、y1、x2、y2、x3、y3、x4、y4(両方の長方形の面積が0より大きい)。

ここでソリューションをテストできます。


送信されたこの問題の解決策が表示されないのはなぜですか?
キースランドール

@キースランドールコンテストセッションは終了しました。提出されたソリューションの結果はここに
kuszi

座標が長方形にならない場合はどうなりますか?形状が重なり合って長方形以外の形状を形成するとどうなりますか?
0WJYxW9FMN 2017年

@ J843136028あなたはそれらが長方形を形成すると仮定することができます。質問の2番目の部分では、長方形が軸合わせされている(欠落している単語が追加されている)ことについて言及されていないことがわかります。
kuszi 2017年

回答:


4

Python、200文字

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 戻り値:

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文字

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

compareが0、1、または-1を返すという事実を使用(乱用)します。これはそのドキュメントによれば保証されていませんが、OCaml 3.10.1には当てはまります。


いいね!1つの提案:Scanf.scanf "%d%d%d%d%d%d%d%d"(-1文字)
kuszi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.