내 치수는 무엇입니까?


18

작업 : 삼각형의 면적이 주어지면 해당 면적의 헤론 삼각형 을 찾으십시오 . 지정된 지역의 모든 헤 로니아 삼각형이 허용됩니다.

헤 로니아 삼각형은 정수 변과 정수 영역을 가진 삼각형입니다 . 헤론의 공식에 따르면, 변의 길이 a,b,c가 삼각형 은

sqrt(s*(s-a)*(s-b)*(s-c))

여기서 s=(a+b+c)/2삼각형의 절반 경계입니다. 이것은 또한 다음과 같이 쓸 수 있습니다

sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4

이러한 삼각형이 없으면 일관된 거짓 값으로 출력합니다.

입력 : 삼각형의 면적을 나타내는 단일 양의 정수입니다.

출력 : 이러한 삼각형 또는 잘못된 값의 세 변 길이.

예 :

Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error

표준 허점 적용

이것은 코드 골프이며 바이트 단위의 최단 답변입니다.


6
도전에 헤론 삼각형을 비교적 간결하게 정의 할 수 있습니까?
Okx

1
@Okx : 정 수면과 정수 영역이있는 삼각형인지 확실하지 않습니까?
닐 A.

@Okx : 아이디어입니다. 주어진 영역에 해당하는 예제가 하나만 있으면됩니다.
Neil A.

위키피디아 링크에서 : "헤 로니아 삼각형은 변의 길이와 면적이 모두 정수인 삼각형입니다."
닐 A.

5
질문의 정의에 대해 혼란스러운 점을 설명해 주시겠습니까?
닐 A.

답변:


6

젤리 , 17 16 바이트

outgolfer Erik 덕분에 -1 바이트 (빠른 활용 ¥)

SHð;_P
ṗ3Ç⁼¥Ðf²Ḣ

헤론 공식의 무차별 적용.

온라인으로 사용해보십시오! (114 테스트 사례의 경우 60 초 시간 초과에 도달합니다. 로컬로 3m 30 초 소요-114 3 = 1,481,544 3 배검사

어떻게?

진정한 골프 솔루션 - 지역 주어진이 a발견 한 모든 사이 세 정수의 튜플 1a(심지어 반복 삼각형없이 지역의 사람과)를, 그렇지 않은 경우에도 정지 한 빨리 수행 (원하는 지역과 사람들을 위해 자신의 영역과 필터를 얻는다 하나가 발견되면 모두 쟁기질하고 나중에 첫 번째 결과가 나타납니다. 산출 0존재하지 않는 경우는.

SHð;_P - Link 1, get the square of the area of a triangle: list of sides
S      - sum the sides (get the perimeter)
 H     - halve
  ð    - dyadic chain separation (call that p)
    _  - subtraction (vectorises) =    [p-side1,  p-side2,  p-side3]
   ;   - concatenate              = [p, p-side1,  p-side2,  p-side3]
     P - product                  =  p*(p-side1)*(p-side2)*(p-side3)
                                  = the square of Heron's formula = area squared

ṗ3Ç⁼¥Ðf²Ḣ - Main link: number a (area)
ṗ3        - third Cartesian power (all triples of [1,area] : [[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2], ... ,[a,a,a]]
       ²  - square a
     Ðf   - filter keep if:
    ¥     -   last two links as a dyad:
  Ç       -     call last link (1) as a monad f(list of sides)
   ⁼      -     left (that result) equals right (square of a)?
        Ḣ - head - get the first one (an empty list yields 0, perfect for the falsey case)

나는 누군가가 이것을 무차별하게 만들려고 생각했다.
닐 A.

@NeilA. 나는 대부분의 골프 출품작이이 도전에 대한 무력한 힘이 될 것이라고 생각하지만, 일부는 이것보다 덜 비효율적이지만 골프를 칠 수 있습니다.
Jonathan Allan

당신은 대체 할 수 çÇ⁼¥전적으로 두 번째 줄을 제거합니다.
Outgolfer Erik

@EriktheOutgolfer 오, 고마워요, 그 방법에 대해 궁금해했습니다 ...
Jonathan Allan

5

자바 스크립트 (ES7) 109 102 100 98 바이트

3 개의 정수 배열 또는을 반환합니다 false. 젤리 답변 과 마찬가지로 , 이것은 헤론의 공식을 강요하는 무차별입니다.

A=>[...Array(A**3)].some((_,a)=>A*A/(r=[b=a/A%A|0,c=a/A/A|0,a%=A],p=a+b+c>>1)/(p-a)/(p-b)==p-c)&&r

테스트 사례


재귀 버전, 83 바이트

3 개의 정수 배열을 반환하거나 재귀 오류를 발생시킵니다. 안타깝게도 작은 입력에만 작동합니다.

f=(A,n)=>A*A/(r=[a=n%A,b=n/A%A|0,c=n/A/A|0],p=a+b+c>>1)/(p-a)/(p-b)==p-c?r:f(A,-~n)

데모


4

하스켈 , 69 바이트

f a=take 1[t|t<-mapM(\_->[1..a])":-)",a*a==product[sum t/2-x|x<-0:t]]

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

처럼 세 개의 삼각형 변 목록의 단일 톤을 출력합니다 [[3.0,4.0,5.0]]. 입력이 불가능합니다 []. 기술적으로 False는 Haskell의 Falsey 뿐이지 만 Haskell은 가능한 모든 출력이 동일한 유형이어야하므로 사용할 수 없습니다. 오류가 Falsey로 사용될 수 있으면 [...]!!03 바이트 이상을 절약 할 수 있습니다 take 1[..].

t가능한 1영역 길이의 모든 3 배 를 영역에서 영역 까지 모두 시도합니다 a. 헤론의 공식은 지역을 통해 일치 여부를 확인하는 데 사용되는 (s-0)(s-x)(s-y)(s-z)==a*as=(x+y+z)/2입니다 sum t/2. 생성물 (s-0)(s-x)(s-y)(s-z)A와 표현 product찍은 요소 0:t뿐만 아니라 0 트리플 즉.


웃는 얼굴이더라도 웃는 얼굴에 +1
Julian Wolf

2

F 번호, 170 (156) 152 바이트

let f(a,b,c)=
 let s=(a+b+c)/2.0
 s*(s-a)*(s-b)*(s-c)
let g A=[for a in 1.0..A do for b in a..A do for c in b..A do yield a,b,c]|>List.find(f>>(=)(A*A))

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

"언 골프 드"

let calculateArea (a, b, c) =
    let s = (a+b+c)/2.0
    s*(s-a)*(s-b)*(s-c)

let getTriangle A =
    [  for a in 1.0..A do
       for b in a..A do
       for c in b..A do yield a,b,c
    ]
    |> List.find(calculateArea>>(=)(A * A))

결과가 없으면 프로그램에 오류가 발생합니다. 이것이 바람직하지 않은 경우 아무것도 발견되지 않으면 빈 목록을 생성하는 (+2 바이트) 또는 삼각형이 발견되지 않은 경우 없음을 반환하는 (+3 바이트) 로 바꿔야 List.find합니다 .List.filterList.tryFind

나는 항상 골프 용 F # 버전이 여전히 합리적인 가격이라는 것을 알고 있습니다.


1
나는 F #을 모른다. 그러나 당신이 생략 System.Math.Sqrt하고 결과 값을 비교할 수 있다고 상상해보십시오 A * A.
Sean

@Sean 물론! 팁 주셔서 감사합니다 :)
Brunner

교체 1.0..A [...] 1.0..A [...] 1.0..A로하는 것은 1.0..A [...] a..A [..] b..A(그것이 작동하는 경우에, 나는 아주 최소한의 F 번호 경험이) 당신에게 몇 바이트 속도 당신을 조금을 저장해야합니다.
CAD97

@ CAD97 그렇습니다! 지적 해 주셔서 감사합니다.
Brunner

2

파이썬 2 (PyPy) , 131 (123) 118 바이트

n=input()
t=n*3;r=i=c=0
while c<t:
 i+=1;a,b,c=i%t,i/t%t,i/t/t;s=a+b+c>>1
 if(s-a)*s*(s-b)*(s-c)==n**2:r=a,b,c
print r

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

CPython에서도 작동하지만 PyPy는 훨씬 빠르며 TIO의 시간 제한에서 114의 삼각형을 계산할 수 있습니다.

내 컴퓨터의 타이밍 :

$ echo 114 | time pypy2 d.py
        0.55 real         0.52 user         0.02 sys
$ echo 114 | time python2 d.py
       52.46 real        51.76 user         0.27 sys

1

Pyth-23 바이트

/mu*G-/sd2Hd/sd2^UQ3^Q2

진실 / 거짓 값을 인쇄하거나

fq^Q2u*G-/sT2HT/sT2^UQ3

가능한 모든 솔루션을 인쇄하고 큰 입력의 경우 엄청나게 느립니다. 하나만 인쇄하려면 처음에 'h'를 입력하십시오.

설명:

fq^Q2u*G-/sT2HT/sT2^UQ3
                    UQ    # List of numbers from 0 to input-1
                   ^  3   # All triples of these numbers
f                         # Filter this by the following test (on variable T, based on Hero's formula)
     u*G-/sT2HT/sT2       # s*(s-a)*(s-b)*(s-c), where s is the sum of the triple over 2 (calclated as /sT2 )
 q^Q2                     # Test if equal to input ^2

시도 해봐


1

펄 6 , 54 바이트

->\a{first {a*a==[*] .sum/2 «-«(0,|$_)},[X] ^a xx 3}

a입력 영역 보다 최대 1 개 이하의 모든 가능한 측면을 무차별 적으로 검색 합니다.

  • ^a0에서 사이의 숫자 범위입니다 a - 1.
  • [X] ^a xx 3교차 산물에 의해 해당 범위의 3 개 사본이 감소하여 모든 삼중 항이 (으)로 생성 (0, 0, 0)됩니다 (a - 1, a - 1, a - 1).
  • 우리는 first그 변이있는 삼각형의 면적이 같은 삼중 항을 찾습니다a 헤론의 공식을 사용하여 .

주어진 코드 블록 내에서 first:

  • $_삼중 항입니다. (x, y, z)여기로 불러
  • (0,|$_) 같은 삼중 항이지만 0 앞에 추가됩니다 (0, x, y, z).
  • .sum / 2 둘레의 절반 (이름이 지정된 수량) s 일반적으로 헤론 공식 표현에서 된 ).
  • .sum / 2 «-« (0, |$_)s왼쪽에 뺄셈 하이퍼 오퍼레이터가 있고(0, x, y, z) 오른쪽(s - 0, s - x, s - y, s - z) 있습니다.
  • [*] 그런 다음 곱셈으로 해당 쿼드 러 플렛을 줄이고 면적의 제곱을 제공합니다.
  • a * a == 주어진 영역의 제곱과 동일한 제곱 영역을 찾습니다.

삼중 Nil항이 없으면 (거짓) 반환됩니다.


1

하스켈 , 76 바이트

f s=[[a,b,c]|a<-[1..s],b<-[1..a],c<-[1..b],a*a*c*c-(a*a+c*c-b*b)^2/4==4*s*s]

이렇게하면 무차별 대입을 통해 올바른 영역을 생성하는 가능한 모든 정수 크기가 포함 된 목록 목록이 출력됩니다 (빈 목록이없는 경우 빈 목록 출력). 경고는 중간에 그 분할로 인해 두 배로 출력하지만 분수 부분은 항상 0입니다.

어떤 이유로 든 그것을 취할 수 없다면

f s=[[a,b,c]|a<-[1..s],b<-[1..a],c<-[1..b],4*a*a*c*c-(a*a+c*c-b*b)^2==16*s*s]

전체 89 77 바이트 또는 13 1 여분 바이트에 대한 정수 목록으로 응답을 출력합니다 . (닐에게 감사합니다)

첫 번째 요소 만 필요하거나 원하는 경우 !!0끝에 배치하면 숫자가 적용되는 경우 첫 번째 요소 만 제공하고 3 바이트가 더 없으면 오류가 발생 take 1하지 않고 첫 번째 요소는 오류없이 첫 번째 요소를 취합니다. 6 바이트 더.

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


복식을 피하려면 각면에 방정식에 4를 곱하면 안됩니까?
Neil

0

TI 기본, 70 69 바이트

Prompt A
For(B,1,A
For(C,1,B
For(D,1,C
(B+C+D)/2
If A2=Ansprod(Ans-{B,C,D
Then
Disp B,C,D
Return
End
End
End
End
/

삼각형이있는 경우 세 변의 길이를 표시하고없는 경우 구문 오류가 발생합니다 ( /끝에 감사 ).

다른 답변에 대한 Sean의 의견 덕분에 -1 바이트


0

수학, 77 바이트

mathematica의 Solve 와 함께

s=(a+b+c)/2;d=Sqrt[s(s-a)(s-b)(s-c)];Solve[d==#&&0<a<b<c<#,{a,b,c},Integers]&

수학, 117 바이트

무차별

s=(a+b+c)/2;l="error";(For[a=1,a<#,a++,For[b=1,b<a,b++,For[c=1,c<b,c++,If[Sqrt[s(s-a)(s-b)(s-c)]==#,l={a,b,c}]]]];l)&

1
Mathematica는 내장되어 있지 않습니까? 놀라운.
Neil A.

@ovs 당신도 1 바이트를 저장할 수 Area@SSSTriangle[a,b,c]있습니다.
numbermaniac

0

실제로 , 22 바이트

;╗R3@∙⌠;Σ½;)♀-π*╜²=⌡░F

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

설명:

;╗R3@∙⌠;Σ½;)♀-π*╜²=⌡░F  (implicit input: A)
;╗                      store a copy of A in register 0
  R                     range(1, A+1)
   3@∙                  ternary Cartesian product (all triples with values in [1, A])
      ⌠;Σ½;)♀-π*╜²=⌡░   filter: take triples where function returns truthy
       ;Σ½                make a copy of the triple, compute s = (a+b+c)/2
          ;)              make a copy of s, move it to the bottom of the stack
            ♀-            subtract each value in the triple from s
              π*          product of those values and s (s*(s-a)*(s-b)*(s-c))
                ╜²        A*A
                  =       compare equality (does area of triangle with given dimensions equal input?)
                     F  take first triple that satisfies the filter (or empty list if none)

0

카시오 베이직, 123 바이트

For 1⇒a To n
For 1⇒b To n
For 1⇒c To n
If(s*(s-a)*(s-b)*(s-c)|s=(a+b+c)/2)=n^2
Then
Print{a,b,c}
Stop
IfEnd
Next:Next:Next

표준 무차별 대입 솔루션. 코드의 경우 122 바이트 n, 매개 변수 로 지정할 1 바이트


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.