Python 97(複雑なポイントなし)
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
これは、[(x、y)、(x、y)、(x、y)、(x、y)]のポイントタプルのリストを任意の順序で受け取り、重複または間違った数のポイントを処理できます。他のPythonの回答のような複雑なポイントは必要ありません。
次のようにテストできます。
S1 = [(0,0),(1,0),(1,1),(0,1)] # standard square
S2 = [(0,0),(2,1),(3,-1),(1,-2)] # non-axis-aligned square
S3 = [(0,0),(1,1),(0,1),(1,0)] # different order
S4 = [(0,0),(2,2),(0,2),(2,0)] #
S5 = [(0,0),(2,2),(0,2),(2,0),(0,0)] #Redundant points
B1 = [(0,0),(0,2),(3,2),(3,0)] # rectangle
B2 = [(0,0),(3,4),(8,4),(5,0)] # rhombus
B3 = [(0,0),(0,0),(1,1),(0,0)] # only 2 distinct points
B4 = [(0,0),(0,0),(1,0),(0,1)] # only 3 distinct points
B5 = [(1,1),(2,2),(3,3),(4,4)] # Points on the same line
B6 = [(0,0),(2,2),(0,2)] # Not enough points
def tests(f):
assert(f(S1) == True)
assert(f(S2) == True)
assert(f(S3) == True)
assert(f(S4) == True)
assert(f(S5) == True)
assert(f(B1) == False)
assert(f(B2) == False)
assert(f(B3) == False)
assert(f(B4) == False)
assert(f(B5) == False)
assert(f(B6) == False)
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
tests(t)
これには少し説明が必要ですが、全体的な考え方は、正方形のポイント間に3つの距離しかないということです(側面、対角線、ゼロ(それ自体と比較したポイント)):
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
- タプルのリストp(x、y)
- set(p)を使用して重複を削除し、長さをテストします
- 点のすべての組み合わせを取得します(pのc、dに対してpのa、b)
- すべてのポイントから他のすべてのポイントまでの距離のリストを取得する
- セットを使用して、3つの固有の距離しかないことを確認します-ゼロ(それ自体と比較したポイント)-辺の長さ-対角線の長さ
コード文字を保存するには:
- 1文字の関数名を使用
- 1行の関数定義を使用する
- 一意のポイントの数が4であるかどうかを確認する代わりに、異なるポイントの長さが-1であることを確認します(保存== 3 ==)
- リストとタプルのアンパックを使用して、a [0]、a [1]を使用する代わりに、pのc、dの代わりにpのa、bを取得します。
- 数学を含める代わりにpow(x、.5)を使用してsqrt(x)を取得します
- )の後にスペースを入れない
- フロートに先行ゼロを置かない
誰かがこれを破るテストケースを見つけることができるのではないかと思う。そうしてください、そして、病気を修正してください。たとえば、abs()を実行して辺の長さと斜辺をチェックするのではなく、3つの距離をチェックするだけのことはエラーのようです。
初めてコードゴルフを試しました。ハウスルールを破ったら親切にしてください。