多角形が凸面かどうかを判別


21

入力ポリゴンが凸面かどうかを判断するプログラムを作成します。ポリゴンを含む一行で指定されたN、頂点の数を、次いでN含む行のxyの各頂点の座標を。頂点は、任意の頂点から時計回りにリストされます。

例1

入力

4
0 0
0 1
1 1
1 0

出力

convex

例2

入力

4
0 0
2 1
1 0
2 -1

出力

concave

例3

入力

8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0

出力

convex

xおよびyは整数、N <1000、および| x |、| y | <1000です。入力ポリゴンは単純であると仮定できます(エッジが交差せず、各頂点に接触するエッジは2つだけです)。最短のプログラムが勝ちます。


「シンプル」には「連続したエッジは非共線的」は含まれません!?また、さらにいくつかのテストケース:(0,0)(0,2)(2,2)(2,0)(1,1); および(1,1)(0,0)(0,2)(2,2)(2,0)-凹状の頂点を見つけるには、端から端まで折り返す必要がある場合をテストします。
ピーターテイラー

この質問は高齢化していますが、...例2の変更のように、2つのセグメントが整列した凹面の例を追加することを検討してください:(0,0)、(2,1)、(4,2)、(1,0)( 2、-1)。例3を気付かずにごまかしたので、これを取り上げます。
ジェシーミリカン

回答:


4

J、105

echo>('concave';'convex'){~1=#=(o.1)([:>-.~)(o.2)|3([:-/12 o.-@-/@}.,-/@}:)\(,2&{.)j./"1}.0&".;._2(1!:1)3

上記の3つのテストすべてに合格します。

編集:(111-> 115)piの角度を削除することにより、同一直線上の点を処理します。他の場所でいくつかのキャラクターを獲得しました。

編集:(115-> 105)より少ないダム。

J障害者の説明:

  • (1!:1)3STDINからEOFを読み取ります。(おもう。)
  • 0&".;._2 この種の入力を解析するための素晴らしいイディオムです。
  • j./"1}. 入力の最初の行(N 0)を切り取り、ペアを複素数に変換します。
  • (,2&{.) リストの最後に最初の2つのポイントを追加します。
  • 3(f)\ 長さ3のスライディングウィンドウにfを適用します(角度に対して3ポイント)
  • [:-/12 o.-@-/@}.,-/@}: は、各3点を-piとpiの間の角度に変換する動詞です。
    • -@-/@}.,-/@}:(p1-p2)、(p3-p2)を生成します。(これらは複合体であることを思い出してください。)
    • 12 o. 各複合体に角度を与えます。
    • [:-/(...) 2つの角度の差を与えます。
  • (o.1)([:>-.~)(o.2)| mod 2 pi、piの角度(直線セグメント)を除去し、piと比較します(ポイントが一方向に巻かれていると想定されない限り、より大きい、より小さい、重要ではありません)。
  • 1=#= それらの比較結果がすべて1または0の場合(自己分類あり。これは馬鹿げているようです。)
  • echo>('concave';'convex'){~ 凸を印刷します。

3

Python-149文字

p=[map(int,raw_input().split())for i in[0]*input()]*2
print'ccoonncvaevxe'[all((a-c)*(d-f)<=(b-d)*(c-e)for(a,b),(c,d),(e,f)in zip(p,p[1:],p[2:]))::2]

<=が必要だと思います。先ほど追加した例3をご覧ください。
キースランドール

1
dammn、そのスライス...
st0le

2

ルビー1.9、147 133 130 124 123

gets
puts ($<.map{|s|s.split.map &:to_i}*2).each_cons(3).any?{|(a,b),(c,d),(e,f)|(e-c)*(d-b)<(d-f)*(a-c)}?:concave: :convex

1

スカラ:297文字

object C{class D(val x:Int,val y:Int)
def k(a:D,b:D,c:D)=(b.y-a.y)*(c.x-b.x)>=(c.y-b.y)*(b.x-a.x) 
def main(a:Array[String]){val s=new java.util.Scanner(System.in)
def n=s.nextInt
val d=for(x<-1 to n)yield{new D(n,n)}print((true/:(d:+d.head).sliding(3,1).toList)((b,t)=>b&&k(t(0),t(1),t(2))))}}

1
def main(a:...代わりにを使用して、3つの文字を削ることができdef main(args:...ます。
ガレス

はい、私は自分自身に気づきましたが、299から149は私を他の誰かの領域に連れて行きません。たぶん他の改善点を見つけたら-ああ、1つあります:nは関数名(次)と変数名です。
ユーザー不明
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.