사변형 분류 | 수학 시험을 도와주세요!


20

도움! 수학 시험이 곧오고 공부하지 않았습니다! 1 시험의 일부는 정점 좌표에 따라 사변형을 분류하는 것인데, 불행히도 어떻게 해야할지 모르겠습니다. 2

따라서 당신의 도전은 나를 위해이 작업을 수행하는 프로그램을 작성하는 것입니다.

도전

3 개의 정점이 동일하지 않은 4 개의 정점이 주어지면 4 개의 정점에 의해 형성된 사변형의 가장 구체적인 분류를 결정하십시오.

"가장 구체적인 분류"의 의미는 모든 정사각형이 사각형이지만 모양이 정사각형 인 경우 정사각형임을 나타내며 사각형임을 나타내지 않아야합니다.

입력

입력은 4 개의 (x, y) 좌표로 제공됩니다. 이것을 길이 4의리스트 / 튜플의 길이 4의리스트로 취할 수 있습니다. 또는 x 좌표리스트와 각 y 좌표리스트로 입력 할 수 있습니다.

내 모양이 지점에서 정점이있는 경우 예를 들어, (0, 0), (5, 0), (6, 1), 그리고 (1, 1), 당신은 다음과 같은 형식 또는 이와 유사한 중 하나에 입력을 선택할 수 있습니다 :

[(0, 0), (5, 0), (6, 1), (1, 1)]
([0, 5, 6, 1], [0, 0, 1, 1])

사변형이 자체 교차하지 않고 점이 올바른 순서로 제공된다고 가정 할 수 있습니다 (즉, 입력의 연속 된 두 점이 사변형의 선 세그먼트로 연결됨).

산출

다음과 같은 각 사변형 클래스 각각에 대해 고유 한 출력이 필요합니다.

  • 광장
  • 구형
  • 마름모
  • 평행 사변형
  • 사다리꼴 / 사다리꼴
  • 사변형

이것은 정확한 이름 자체, 문자, 정수 등일 수 있습니다.

규칙

  • 표준 허점 적용
  • 프로그래밍 언어에이 정확한 작업을 수행 할 수있는 기본 제공 기능이있는 경우 해당 기본 제공 기능은 허용되지 않습니다.
  • 두 지점 사이의 거리를 찾기위한 내장 기능이 허용됩니다.
  • 두 선 사이의 각도를 찾기위한 내장 기능이 허용됩니다.

이 시점에서 모든 용어를 알고 있으면 프로그래밍을 시작할 수 있습니다! (테스트 케이스가 끝났습니다)

술어

이 섹션은 다른 모양의 정의에 대한 설명이 필요한 사람을위한 것입니다.

광장

4 변은 4 변의 길이가 모두 같고 인접한 변의 모든 쌍이 직각 (즉, 직사각형과 마름모) 인 경우에만 정사각형입니다.

구형

사각형은 인접한 한 쌍의 모든면이 수직 인 경우에만 사각형입니다.

마름모

4 변은 4 변이 모두 같은 경우에만 마름모입니다.

평행 사변형

사변형은 각 쌍의 반대면이 평행하고 각 쌍의 반대 각이 동일한 경우에만 평행 사변형입니다. 이 두 조건은 서로를 암시하므로 그 중 하나만 확인하면됩니다.

사다리꼴 / 사다리꼴

사변형은 적어도 한 쌍의 평행면을 갖는 경우에만 사다리꼴 / 사다리꼴입니다.

인접한 두 변의 쌍이 길이가 같으면 사변형은 연입니다. 즉, 인접한 측면 중 두 개가 동일하고 다른 두 면도 동일합니다.

테스트 사례

input as (x, y) * 4 -> full name
[(0, 0), (1, 0), (1, 1), (0, 1)] -> square
[(0, 0), (1, 1), (-1, 3), (-2, 2)] -> rectangle
[(0, 0), (5, 0), (8, 4), (3, 4)] -> rhombus
[(0, 0), (5, 0), (6, 1), (1, 1)] -> parallelogram
[(0, 0), (4, 0), (3, 1), (1, 1)] -> trapezoid/trapezium
[(0, 0), (1, 1), (0, 3), (-1, 1)] -> kite  
[(0, 0), (2, 0), (4, 4), (0, 1)] -> quadrilateral

링크 (데스 모 그래프 계산기)

다음은 각 테스트 사례의 시각화에 대한 링크입니다.

정사각형
직사각형
마름모
평행 사변형
사다리꼴 / 사다리꼴

사변형

승리 기준

분명히 시험에 컴퓨터를 가져올 수는 없으므로 암기 할 수 있도록 가능한 가장 짧은 코드를 작성해야합니다. 여백에 쓰고 TryItOffline TM을 사용하여 실행 하여 프로그램이 가능한 한 작은 여백에 맞도록해야합니다!

1 물론 했어요 : P
2 물론하겠습니다 : P


1
난 당신의 여백 문제 xkcd.com/1381
Rohan Jhunjhunwala

@RohanJhunjhunwala 나는 새로운 Fermat입니다 (나는 그것이 올바른 사람이라고 생각합니까?). 그러나 멋진 XKCD ref : P
HyperNeutrino

CSV 입력이 가능합니까?
tuskiomi 2016 년

특이성의 부분적인 순서는 무엇입니까?
피터 테일러

답변:


6

APL (Dyalog) , 104 89 80 82 81 79 78 바이트

⍙←{⍵⍺⍺1⌽⍵}
⎕←(|x){⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}2|1+-⍙(12x←-⍙⎕+.×1 0J1)÷○1

온라인으로 사용해보십시오!


입출력

4 × 2 좌표의 좌표를 입력으로받습니다.

출력

  • 1 1 1 광장
  • 1 1 0 마름모
  • 1 0 1 사각형
  • 1 0 0 평행 사변형
  • 1 0
  • 0 1 사다리꼴
  • 0 0 사변형

연산

먼저 사변형의 4 변의 길이와 각도를 모두 찾으십시오.

반대 각도의 두 쌍이 같으면 ( OA) 모양은 일종의 평행 사변형입니다. 모든면의 길이가 같은지 ( AS, Adjacent Sides) 모든 각도가 같은지 확인합니다 ( AA).

+--------+----------------+----------------+
|        |       AA       |      ~AA       |
+--------+----------------+----------------+
|   AS   |     Square     |    Rhombus     |
|--------+----------------+----------------+
|  ~AS   |    Rectangle   |  Parallelogram |
+--------+----------------+----------------+

그렇지 않은 경우 OA:

  • 정확히 같은면이 2 쌍인지와 분리되어 있는지 ( aabb대신 aaab) 구분하십시오 . 그렇다면 모양은 연입니다.

  • 평행 한 반대쪽면이 정확히 1 쌍인지 확인하십시오. 그렇다면 모양은 사다리꼴입니다.

  • 그렇지 않으면, 모양은 사변형입니다.


암호

⍙←{⍵⍺⍺1⌽⍵}새로운 연산자를 정의합니다. APL에서 연산자는 고차 함수를 의미 합니다 . 이 연산자는 1 개의 함수 인수 ( ⍺⍺)를 가져와 다음 과 같은 모나드 함수를 반환합니다.

  1. 회전 ( 1⌽) 인수 ( )
  2. ⍺⍺그것과 사이에 적용

이것은 스칼라 함수에 특히 유용합니다. 대부분의 함수는 배열 인수를 통해 암시 적으로 맵핑되므로 랩핑 된 각 인접 요소 쌍 사이에 해당 함수 를 적용 할 수 있습니다. 예를 들어 +⍙1 2 3 41 2 3 4 + 2 3 4 1으로 평가한다 3 5 7 5.


x←-⍙⎕+.×1 0J1 입력 좌표 행렬을 모양의 4면 벡터를 나타내는 복소수 배열로 변환합니다.

  • 참조되면 입력을 받아서 리턴합니다.

  • 1 0J1는 벡터 [1, i] (수학적 의미에서 "벡터", -1의 제곱근으로 "i")를 나타냅니다. APL에서는 복소수 a+bi가 작성됩니다aJb

  • +.×행렬 곱셈. 수학적으로 결과는 4 × 1 행렬입니다. 그러나 +.×APL에서는 행렬 곱셈과 벡터 내부 곱을 일반화하고 3 차원 배열에 2 차원 배열을 "곱셈"하는 것과 같은 작업을 수행 할 수 있도록하는 "내부 제품"이라고합니다. 이 경우 4 × 2 행렬과 2 요소 벡터를 곱하여 4 요소 벡터 (4 개의 주어진 정점의 복소수 표현)를 만듭니다.

  • -⍙위와 같이 랩 어라운드와 페어 단위 빼기입니다. 이렇게하면 모양의 4면 벡터가 복소수로 나타납니다. 이 벡터는 "역방향"방향을 가리 키지 만 중요하지 않습니다.

  • x← 변수에 저장 x


2|1+-⍙(12○x)÷○1 모양의 4 개의 꼭짓점에서 외부 각도를 찾습니다 (표현).

  • 12○x4 개의 측면 벡터 각각의 주요 인수 ( 라디안)를 찾습니다 .

  • ÷○1각도를 다루기 쉽도록 π로 나눕니다. 따라서 모든 각도는 직선 각도의 배수로 표현됩니다.

  • -⍙위에서 언급 한 것처럼 랩 어라운드와 페어 단위 빼기. 이것은 4 개의 외부 각도를 제공합니다.

  • 2|1+ 주 인수는 (-1,1)로 씌어지고 쌍별 빼기는 범위 (-2,2)를 만듭니다. 같은 각도에 2 개의 다른 표현이 있기 때문에 이것은 나쁩니다. "add 1 mod 2"를 수행하면 각도가 다시 모든 각도가 원래의 각도보다 1 배 더 많지만,이를 염두에 두는 것이 좋습니다.


|x4 개의 측면 벡터 각각의 크기 를 찾습니다.


{⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}4 개의 외부 각도 배열을 오른쪽 인수로 정의하고 4 변 길이 배열을 오른쪽 인수로 정의하고 적용합니다 .

  • 이 함수에는 보호 된 표현식이 있습니다. 이 경우 ⍵≡2⌽⍵경비원입니다.
  • 가드가 평가 1되면 다음 표현식 ≡⍙¨0⍺⍵이 실행되고 해당 값이 리턴됩니다.
  • 가드가로 평가 0되면 해당 표현식은 건너 뛰고 그 이후의 표현식이 2 4=...=⍙⍺)대신 실행됩니다.

⍵≡2⌽⍵ 두 쌍의 반대 각도가 같은지 확인합니다.

  • 2⌽⍵ 각도 배열을 2 곳씩 회전합니다.
  • ⍵≡그 자체 와 같은지 확인

≡⍙¨0⍺⍵ 각 평행 사변형 유형의 고유 한 값을 반환합니다.

  • 0⍺⍵스칼라 0, 측면 길이 배열 및 각도 배열 의 3 요소 배열입니다 .
  • ≡⍙¨≡⍙각 요소에 대해 실행 됩니다.
  • ≡⍙1만큼 회전하면 동일한 배열이 제공되는지 확인하여 배열의 모든 값이 동일한 지 확인합니다. 스칼라가 회전하지 않으므로 ≡⍙0돌아갑니다 1. 위에서 언급했듯이 ≡⍙⍺마름모를 ≡⍙⍵확인하고 사각형을 확인합니다.

2 4=+/1=2|+⍙↑⍵(=⍙⍺)평행하지 않은 각 유형의 고유 한 값을 반환합니다. 이것은 연과 사다리꼴에 대한 수표를 얽혀서 달성됩니다.


2=+/1=2|+⍙⍵ 사다리꼴을 확인합니다.

  • +⍙⍵인접한 각도 합계를 제공합니다. 평행선의 내부 각도는 직선 각도와 합치므로 사변형의 평행 한 측면의 외부 각도도 마찬가지입니다. 따라서 각 평행면 쌍은 2 개 1또는 -1인접한 각도 합으로 이어져야합니다.

  • 1=2|그러나의 각도는 실제 각도 보다 1 이상이므로 실제로 각도의 합은 1또는 3입니다. "mod 2 equals 1"로 확인할 수 있습니다.

  • +/배열을 합산합니다. 이것은 1또는 인 인접 각도 합의 수를 제공합니다 3.

  • 2= 그것이 2와 같은지 확인하십시오 (즉, 정확히 한 쌍의 평행면이 있다면)


4=+/1=2|+⍙(=⍙⍺) 연을 확인합니다.

  • (=⍙⍺)어떤 인접면이 같은지를 나타내는 배열을 제공합니다. 달리 , =작업 요소 현명한. 따라서 이것은 1측면의 길이가 "다음"측면의 길이와 동일한 s를 갖는 4 요소 배열입니다 .

  • +⍙ 랩핑 된 페어 와이즈 합.

  • 1=2|이후 (=⍙⍺)부울 배열 준다 (단지 하나의 0S와 1S), 페어 합 유일한 가능한 값은 0, 12. 그래서 1=2|그냥 동일합니다 1=.

  • +/배열을 합산합니다. 이것은 페어 단위 합계의 개수를 제공합니다 1.

  • 4=그 경우 발생하는 유일한 방법은 4. 동일한 경우 확인 (=⍙⍺)입니다 1 0 1 00 1 0 1. 위에서 언급했듯이 이것은 모양이 연임을 의미합니다.


2 4=+/1=2|+⍙↑⍵(=⍙⍺) 위의 수표를 얽습니다.

  • ⍵(=⍙⍺)배열 과 배열의 2 요소 중첩 배열입니다.(=⍙⍺)

  • 중첩 배열을 적절한 행렬로 승격합니다. 이후 ⍵(=⍙⍺)4 소자 어레이의 2 소자 어레이는, 결과는 2 × 4 행렬이다.

  • +⍙이후 (확장자, 및 ) 마지막 (수평) 축 회전 +⍙행렬을 적용하는 것과 동일하다 +⍙개별적 행.

  • 1=2|잔차 / mod ( |)와 equals ( =)는 모두 요소 단위로, 심지어 행렬에서도 작동합니다.

  • +/기본적으로 축소 ( /)는 마지막 (가로) 축을 따라 작동합니다. 따라서 +/행을 따라 합산하고 2 × 4 행렬을 2 요소 단순 배열로 바꿉니다.

  • 2 4==요소별로 작동 하므로 연 및 사다리꼴 조건을 동시에 확인합니다.


3

Mathematica, 195 바이트

Which[s=Differences@{##,#};l=Norm/@s;r=#.#2==#2.#3==0&@@s;Equal@@l,If[r,1,2],#==#3&&#2==#4&@@l,If[r,3,4],MatchQ[l,{a_,b_,b_,a_}|{a_,a_,b_,b_}],5,#+#3=={0,0}||#2+#4=={0,0}&@@Normalize/@s,6,1>0,7]&

공백으로 :

Which[
    s = Differences @ {##,#};
    l = Norm /@ s;
    r = #.#2 == #2.#3 == 0& @@ s;

    Equal @@ l, If[r, 1, 2],
    # == #3 && #2 == #4& @@ l, If[r, 3, 4],
    MatchQ[l, {a_,b_,b_,a_}|{a_,a_,b_,b_}], 5,
    #+#3 == {0,0} || #2+#4 == {0,0}& @@ Normalize /@ s, 6,
    1 > 0, 7
]&

출력 1사각형에 대한, 2rhombi를 들어, 3직사각형, 4평행 사변형을위한, 5연에 대한, 6사다리꼴을 위해, 그리고 7무엇을 위해. TIO 링크를 게시했지만 Mathics에서는 작동하지 않습니다.

네 개의 포인트 인 경우 P, Q, RS다음 {##,#}되어 {P,Q,R,S,P}있으므로 s측면 벡터의리스트는 {Q-P,R-Q,S-R,P-S}, l그 벡터의 길이이고, r상태이고 그 사이의 각도 Q-PR-Q도 사이의 각도 등 R-QS-R모두 90도의.

따라서 모든 변의 길이가 같으면 사변형은 마름모입니다. r보유하고있는 경우 실제로는 정사각형이며, 그렇지 않으면 일반 마름모 일뿐입니다.

마름모를 배제하고, 반대쪽 길이의 두 쌍이 모두 같으면 사변형은 여전히 ​​평행 사변형입니다. r보유하는 경우 실제로는 사각형이고 그렇지 않은 경우 일반 평행 사변형 일뿐입니다.

평행 사변형을 배제 할 때, 측면 길이의 목록은 l형식 {a,b,b,a}이거나 {a,a,b,b}일부 a이며 b사변형은 연입니다. 추가로 사다리꼴이 될 수 없거나 실제로 마름모가 될 수 있습니다.

평행 사변형과 연을 배제하는데, 사변형에 한 쌍의 평행 한면이 있으면 사다리꼴입니다. 우리 Normalize는 측면 벡터를 연결하고 한 쌍의 반대 벡터가에 추가되는지 여부를 확인하여이를 확인합니다 {0,0}.

위의 모든 것을 배제하면 1 > 0(더 나은 것이면 ) 사변형은 평범한 오래된 사변형입니다.


1

파이썬 (2) , 463 (410) 408 397 바이트

여섯 번째 줄에서 튜플을 사용하여 목록으로 색인화하는 대신 53 바이트를 절약했습니다.

각 모양의 첫 글자 대신 1에서 7까지의 정수로 출력하여 11 바이트를 절약했습니다. 정수는 다음과 같습니다.

  1. 광장
  2. 구형
  3. 마름모
  4. 평행 사변형
  5. 사다리꼴
  6. 사변형
from numpy import *;D=dot
from numpy.linalg import *;N=norm
def P(a,b):x=D(a,b);y=N(a)*N(b);return x==y or x==-y
def Q(a,b):return int(N(a)==N(b))
L=input()
a,b,c,d=tuple([(L[i][0]-L[(i+1)%4][0],L[i][1]-L[(i+1)%4][1]) for i in range(4)])
g=7
e=Q(a,c)+Q(b,d)
if e==2:
 g=(1if D(a,b)==0 else 3) if Q(a,b) else 2 if D(a,b)==0 else 4
elif P(a,c) or P(b,d):
 g = 5
elif Q(a,b) or Q(b,c):
 g = 6
print g

온라인으로 사용해보십시오!

논리를 보여주기 위해 ungolfed

다른 테스트 입력에 대한 출력을 표시하는 함수로 표시됩니다. 참고 사각형에서가 아니라 질문에 원래 제공된 예제에서 "사각형"테스트 예제를 변경했습니다.

이 논리는 사변의 측면에 의해 형성된 벡터의 표준 (길이)과 내적에 기초하여 변의 길이가 같은지, 반대쪽에 평행한지 또는 인접한 변에 수직인지를 평가합니다.

def S(va, vb):
    return (va[0]-vb[0], va[1]-vb[1])
def dot(sa,sb):      # Eventually replaced with numpy.dot
    return(sa[0]*sb[0]+sa[1]*sb[1])
def norm(s):         # Eventually replaced by numpy.linalg.norm
    return (s[0]**2+s[1]**2)**.5
def isperp(a,b):     # Test if lines/vectors are perpendicular
    return dot(a,b)==0
def ispar(a,b):      # Test if lines/vectors are parallel
    x = dot(a,b)
    y = norm(a)*norm(b)
    return x == y or x == -y
def iseq(a,b):       # Test if lines/vectors are equal in length
    return norm(a)==norm(b)
   
def f(L):
    #Define the four sides
    s = []
    for i in range(4):
        s.append(S(L[i],L[(i+1)%4]))  # I refer often so shorter names may eventually

    guess = 'Q'
    eqsides = 0           # These 6 lines eventually golfed using integer arithmetic by returning an int from iseq()
    if iseq(s[0], s[2]):
        eqsides += 1
    if iseq(s[1],s[3]):
        eqsides += 1
    if eqsides == 2:
    # Opposite sides are equal, so square, rhombus, rectangle or parallelogram
        if iseq(s[0],s[1]):       #Equal adjacent sides, so square or rhombus
            guess='S' if isperp(s[0], s[1]) else 'H'
        else:                     # rectangle or Parallelogram
            guess='R' if isperp(s[0], s[1]) else 'P'
    elif ispar(s[0],s[2]) or ispar(s[1],s[3]):
        guess = 'T'
    elif iseq(s[0],s[1]) or iseq(s[1],s[2]):
        guess = 'K'
    return guess
    

#test suite:
print f([(0, 0), (1, 0), (1, 1), (0, 1)]) # -> square
print f([(0, 0), (1, 1), (-1, 3), (-2, 2)]) # -> rectangle
print f([(0, 0), (5, 0), (8, 4), (3, 4)]) #  -> rhombus
print f([(0, 0), (5, 0), (6, 1), (1, 1)]) #  -> parallelogram
print f([(0, 0), (4, 0), (3, 1), (1, 1)]) # -> trapezoid/trapezium
print f([(0, 0), (1, 1), (0, 3), (-1, 1)]) #-> kite  
print f([(0, 0), (2, 0), (4, 4), (0, 1)]) #-> quadrilateral

온라인으로 사용해보십시오!


1
[(0, 0), (2, 2), (4, 0), (0,-2)]연으로 잘못 분류
TwiNight

이게 효과가 있을까요? repl.it/JRzE
Zacharý

@TwiNight 감사합니다. 이 가능성을 보지 못했습니다. 문제는 초기 알고리즘이 길이가 일치하는 한 쌍의 변이 있는지 확인하는 것입니다. 예제에서 알 수 있듯이 충분하지 않습니다. 일치하는 한 쌍의 쌍을 확인한 다음 반대쪽 쌍의 길이도 비슷한 지 확인해야합니다. 구현하기에는 너무 바빴습니다.
CCB60

0

배치, 287 바이트

@set/aa=%3-%1,b=%4-%2,c=%5-%1,d=%6-%2,e=%7-%1,f=%8-%2,g=a*a+b*b,h=(h=c-a)*h+(h=d-b)*h,i=(i=c-e)*i+(i=d-f)*i,j=e*e+f*f,p=!(i-g)+!(j-h),q=!(h-g),r=!(a*e+b*f),k=q+!(j-i)^|!(j-g)+!(h-i),t=!(a*(f-d)-b*(e-c))+!((c-a)*f-(d-b)*e)
@if %p%==2 (echo 1%r%%q%)else if %k%==2 (echo 1)else (echo 1%t%)

이진수로 출력 : 1= 연, 10= 사변형, 11= 사다리꼴, 100= 평행 사변형, = 마름모꼴 101, 110= 직사각형, 111= 정사각형. 설명 : g, h, i, j변의 길이의 제곱입니다. p길이가 동일한 반대쪽 쌍의 수이며 q, 반대 쌍이 실제로 같은지 확인하여 평행 사변형 / 사각형과 마름모 / 사각형을 r구분하고, 직각도 검사를 통해 평행 사변형 / 마름모꼴과 사각형 / 사각형을 구분 k합니다. 동일한 측면의 쌍을 찾고 t연이은 두 개의 측면 검사를 통해 사다리꼴을 확인하여 연.


만나다 이 의견
TwiNight

@TwiNight Bah, 연을 확인하는 것은 정말 어색합니다.
Neil

그래, 나는 그것을 할 수있는 간단한 방법을 찾아서 운이 좋았다
TwiNight

@TwiNight 나는 당신의 말을 받아 들일 것입니다; APL은 완전히 읽을 수 없습니다.
Neil

연을 확인하는 부분은 2=|-.=⍙⍺입니다. 계산하는 작업 (4 변 길이)과 정의 할 전체 행을 무시하면 확실히 컴팩트 해 보입니다.
TwiNight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.