삼각형의 종횡비 평가


35

삼각형의 세 변 길이가 주어지면 다음 공식을 고려하여 가로 세로 비율 AR을 평가 하십시오.

여기에 이미지 설명을 입력하십시오

어디

여기에 이미지 설명을 입력하십시오

삼각형이 등변에 가까울수록 1종횡비에 가까워집니다 . 1유효한 삼각형 의 종횡비가 크거나 같습니다 .

입력

입력 값은 세 개의 실수 양수이며 목록에 캡슐화 할 수 있거나 필요한 경우 유사한 항목으로 캡슐화 할 수 있습니다.

세 개의 측면 길이를 입력 한 순서에 관계없이 프로그램은 동일한 값을 출력해야합니다.

그 세 개의 숫자는 항상 유효 삼각형의 sidelengths 될 것입니다 (sidelengths와 같은 퇴화 삼각형 1, 12입력으로 제공되지 않습니다). 값이 변성 삼각형에 매우 가까워지면 부동 소수점 부정확에 대해 걱정할 필요가 없습니다 (예 : 프로그램 division by 0에서 입력 오류가 발생할 수 있음 [1, 1, 1.9999999999999999]).

입력은 STDIN함수 인수 또는 이와 유사한 것으로 통해 제공 될 수 있습니다 .

출력

출력은 1사용자 언어에서 허용되는 표준 정확도 보다 크거나 같은 실수 입니다.

출력은로 인쇄 STDOUT되거나 함수에서 반환되거나 이와 유사한 것으로 표시 될 수 있습니다 .

테스트 사례

Inputs                   Output

  1      1      1         1
  3      4      5         1.25
 42     42   3.14         ≈ 6.9476
 14      6     12         1.575
  6     12     14         1.575
0.5    0.6    0.7         ≈ 1.09375

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


s(a + b + c) / 3 이어야 합니까?
costrom

3
@costrom 아니요, 수식이 정확합니다. s는 삼각형반 둘레입니다 . 정삼각형에 대해서는 공식이 정의되지 않습니다.
페이탈 라이즈

입력을 위해 float를 얻을 수 있습니까? 아니면 정수도 가져와야합니까?
Outgolfer Erik

@ErikGolferE リ ッ ク ゴ ル フ ァ ー42.0대신에 입력 할 수 42있습니다.
페이탈 라이즈

@Fatalize 감사합니다. 또한 입력이 모두 될 수 0있습니까?
Outgolfer Erik

답변:


19

젤리 , 6 바이트

이 답변은 Emigna의 05AB1E 답변을 기반으로 합니다. 이 답변을 찾는 데 도움을 준 Dennis와 Lynn에게 많은 감사를드립니다. 골프 제안을 환영합니다! 온라인으로 사용해보십시오!

S_Ḥ⁸÷P

언 골핑

           Implicit argument [a, b, c].
S          Take the sum, a+b+c or 2*s
  Ḥ        Take the double, [2*a, 2*b, 2*c].
 _         Vectorized subtract, giving us [2*(s-a), 2*(s-b), 2*(s-c)].
   ⁸÷      Vectorized divide the initial left argument, the input [a, b, c],
             by [2*(s-a), 2*(s-b), 2*(s-c)].
     P     Take the product giving us the aspect ratio, abc/8(s-a)(s-b)(s-c).

4
6 바이트인데도 여전히 골프 제안을 원하십니까? :-D
Luis Mendo 2016

1
@LuisMendo 가능하다면, : D
Sherlock9

1
"푸시" 는 정확한 용어가 아닙니다. 젤리는 스택 기반이 아닙니다. 오히려, ⁸÷하나의 단위로 체인에서 빠져 나가고 , 초기 왼쪽 인수를 this 또는 다른 것으로 나누는 것으로 읽어야 합니다.
Lynn

1
@Lynn 저는 몇 달 동안 실제로 골프를 쳤습니다. 스택 기반의 용어가 제 뇌에 굳게 들어갔습니다.
Sherlock9

56

젤리 , 7 바이트

SH_÷@HP

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

설명

여기에 이미지 설명을 입력하십시오

이 체인을 읽으십시오.

  • 암시 적 인수는 목록 [a, b, c]입니다.

  • 먼저 우리는 읽습니다 S. 합계는 다음과 같습니다 a + b + c..

  • 그런 다음을 읽습니다 H. 반으로한다 : (a + b + c)/2. (이것은입니다 s.)

  • 그런 다음 dyad _(빼기)를 읽은 다음 다른 dyad를 읽습니다 . 이것은 훅입니다 . 올바른 주장이 없기 때문에이 사슬에 대한 주장을 받아 [a, b, c]들여 우리에게 [s-a, s-b, s-c]. (이것은 표의 다섯 번째 체인 패턴입니다 .)

  • 그런 다음 dyad-monad pair를 읽습니다 ÷@H. 이것은 포크입니다 : ÷@인수가 뒤집어지고 나뉘어지고 H반으로 나옵니다. 따라서 우리의 작업 가치는 H이 체인에 대한 주장을 대체 ÷합니다. 이것은 벡터화된다; 우리는 남았습니다 [(a/2)/(s-a), (b/2)/(s-b), (c/2)/(s-c)]. (이것은 표의 두 번째 체인 패턴입니다 .)

  • 마지막으로, 우리는 상품을 P우리를 받고, abc/(8(s-a)(s-b)(s-c)).

링크가 어떻게 맞는지 트리 모양의 그래프를 봅니다.


8
이미지가 좋아 보인다! 좋은 터치!
DavidC

2
상단 이미지를 더 작게 만들고 두 번째 이미지를 링크로 만들었습니다 (말장난 의도가 없음).
Lynn

나는 그 이미지를보고 즉시, "좋은 하나, 린!" 누가 그것을 게시
했는지

7
젤리 프로그램에 대해 가장 잘 설명했습니다. 나는 여전히 이해하지 못하지만 더 가깝습니다!
Sparr

테스트 케이스 '6.0,12.0,14.0'에 대해 샘플을 실행했으며 테스트 케이스에 표시된대로 1.575 대신`-0.8888888888888888 '을 제공했습니다. 테스트 사례 또는 코드에 문제가 있습니까?
MBaas

13

젤리 , 6 바이트

S÷_2Pİ

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

작동 원리

S÷_2Pİ  Main link. Argument: [a, b, c]

S       Sum; compute 2s := a + b + c.
 ÷      Divide; yield [2s ÷ a, 2s ÷ b, 2s ÷ c].
  _2    Subtract 2; yield [2s ÷ a - 2, 2s ÷ b - 2, 2s ÷ c - 2].
    P   Product; yield (2s ÷ a - 2)(2s ÷ b - 2)(2s ÷ c - 2).
     İ  Invert; yield 1 ÷ (2s ÷ a - 2)(2s ÷ b - 2)(2s ÷ c - 2).

아, 그리고 ³⁴⁵인수 로 사용하려고했습니다 ...
Outgolfer Erik

11

자바 스크립트, 38 바이트

이것은 ( 카레 ) 람다입니다.

a=>b=>c=>a*b*c/(b+c-a)/(a+c-b)/(a+b-c)

(변수에 할당하면 다음 f과 같이 호출해야합니다 f(3)(4)(5))


몇 초 만에 나에게 이길 수 있습니다.
Kritixi Lithos

@KritixiLithos s = 1/2(a+b+c)공식에 꽂고 간단히 : D (예를 들어 s-a = .5*b+.5*c-.5*a, 및 .5취소 의 세 가지 요소 8)
flawr

5
(a,b,c)=>같은 길이이며 호출하는 데 적은 바이트가 필요합니다.;)
ETHproductions

4
그러나 나는 카레를 좋아한다 : D
flawr


8

MATL , 8 7 바이트

tsGE-/p

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

설명

입력 [3 4 5]을 예로 들어 봅시다

t    % Take input implicitly. Duplicate
     % STACK: [3 4 5], [3 4 5]
s    % Sum of array
     % STACK: [3 4 5], 12
G    % Push input again
     % STACK: [3 4 5], 12, [3 4 5]
E    % Multiply by 2, element-wise
     % STACK: [3 4 5], 12, [6 8 10]
-    % Subtract, element-wise
     % STACK: [3 4 5], [6 4 2]
/    % Divide, element-wise
     % STACK: [0.5 1 2.5]
p    % Product of array. Implicitly display
     % STACK: 1.25

8

R, 34 29 바이트

x=scan();prod(x/(sum(x)-2*x))

stdin에서 입력을 읽고 R-vector로 저장합니다 x. 그런 다음 R의 벡터화를 사용하여 분모를 형성하십시오.


7

하스켈, 36 바이트

이것은 #세 개의 인수를 취하는 함수 를 정의합니다 .

(a#b)c=a*b*c/(b+c-a)/(a+c-b)/(a+b-c)

다음과 같이 호출해야합니다. (3#4)5

조금 더 길지만 골프를 더 잘하는 사람 :

p=product
f v=p v/p((sum v-).(2*)<$>v)

6

MATLAB, 64 38 25 바이트

제공된 수식을 구현하는 익명 함수입니다.

@(v)prod(v./(sum(v)-2*v))

입력이 3 가지 값의 목록이라고 가정합니다 (예 :) [3,4,5]. 이 예제는 다음 설명에서 사용됩니다.

             sum(v)        = 3+4+5 = 12
             sum(v)-2*v    = 12 - 2*[3,4,5] = 12 - [6,8,10] = [6,4,2]
         v./(sum(v)-2*v))  = [3,4,5] ./ [6,4,2] = [0.5,1,2.5]
    prod(v./(sum(v)-2*v))  = 0.5 * 1 * 2.5 = 1.25

6

Mathematica, 20 바이트

1##&@@(#/(Tr@#-2#))&

#함수 내부 라고하는 3 개의 값 목록으로 입력을 받습니다. Tr@리스트를 요약하는 방법은 짧은 (도착 2s)와 1##&@@(...)승산 세 요소를 i/(2s-2i)위한 i에서 a, b, c.

입력 값이 정수 또는 유리수이면 정확한 결과를 얻을 수 있습니다.



5

OCaml, 51 바이트

fun a b c->a*.b*.c/.(b+.c-.a)/.(a+.c-.b)/.(a+.b-.c)

예, 수레에 대한 별도의 연산자 ...


5

Wonder , 48 바이트

@@@prod[#0#1#2/1- +#1#0#2/1- +#2#0#1/1- +#2#1#0]

삼가 고인의 명복을 빕니다

용법:

(((@@@prod[#0#1#2/1* * - +#1#0#2- +#2#0#1- +#2#1#0])3)4)5

설명

함수 호출은 다른 언어의 중위 연산자와 비교할 때 Wonder에서 비용이 많이 듭니다. 이 때문에 모든 용어를 배열에 포함시키고 모든 단일 항을 곱하는 대신 결과의 결과를 얻었습니다. 코드는 다음과 같습니다.

(a,b,c)=>product([a,b,c,1/(b+c-a),1/(a+c-b),1/(a+b-c)])

1
흠, 왜 "RIP"인가?
Luis Mendo

필요 / 예상보다 훨씬 길다
Mama Fun Roll

5

사실 , 10 8 바이트

이 답변은 Dennis의 탁월한 Jelly 답변을 기반으로 합니다. 골프 제안을 환영합니다! 온라인으로 사용해보십시오!

;Σ♀/♂¬πì

언 골핑

     Implicit input [a, b, c].
;    Duplicate [a, b, c].
Σ    sum() to get twice the semiperimeter, 2*s.
♀/   Vectorized divide 2*s by [a, b, c] to get [2*s/a, 2*s/b, 2*s/c].
♂¬   Vectorized subtract 2 to get [2*s/a-2, 2*s/b-2, 2*s/c-2].
π    Get the product of the above to get 8*(s/a-1)*(s/b-1)*(s/c-1).
     This is the same as 8(s-a)(s-b)(s-c)/abc.
ì    Invert to get the aspect ratio, abc/8(s-a)(s-b)(s-c).
     Implicit return.

5

마인 크래프트 1.8, 1607 바이트 + 85 블록 = 1692 블 레이트

경고 : 하지 golfed. Golfed 최대 소요됩니다 (1) / 3 이하 blytes을.

다음은 댓글이있는 스크린 샷입니다.

여기에 이미지 설명을 입력하십시오

  • 입력은 a, b, 및 c, 상기 출력은fin

  • finMinecraft의 다른 모든 변수는 정수이므로 표준 Minecraft 정확도는 소수점 0입니다.

  • 녹색 테두리 : 왼쪽의 명령 블록은 오른쪽의 명령 블록 다음에 활성화되며 변수 초기화입니다.

  • 레버 (오른쪽 아래의 회색 갈색 사각형)는 잠금 트리거입니다.

  • Minecraft가 변수를 처리하는 방식 때문에 너무 많이 걸립니다 . 매우 단순화 된 개요 :

    • /scoreboard objectives add name dummy" name" 라는 새 변수를 만듭니다.

    • /scoreboard players set @p name number변수 name를로 설정합니다 number. 숫자는 변수가 아니라 실수 여야합니다.

    • /scoreboard players operation @p name += @p name2씩 증가 name합니다 name2. name2숫자가 아닌 변수 여야합니다.

      • -=, /=, *=, =등을 대신 사용할 수 +=감소, 곱하기, 나누기 등으로
  • 여기에 43 개의 명령을 모두 게시하지는 않겠습니다. 골프를 치는 데 도움이되지만 미친 카피 붙여 넣기를 도와 줄 수도 있습니다.

  • 1.9 명령 블록을 사용하는 경우 솔루션은 (적어도) 42 블록을 적게 사용합니다. 한 글자 변수를 사용하면 거의 200 바이트가 저장됩니다.


4

자바, 38 바이트

(a,b,c)->a*b*c/(b+c-a)/(a-b+c)/(a+b-c)

테스트 및 언 골프

public class Pcg101234 {
  interface F {
    double f(double a, double b, double c);
  }
  public static void main(String[] args) {
    F f = (a,b,c)->a*b*c/(b+c-a)/(a-b+c)/(a+b-c);

    System.out.println(f.f(1,1,1));
    System.out.println(f.f(3,4,5));
    System.out.println(f.f(42,42,3.14));
    System.out.println(f.f(14,6,12));
    System.out.println(f.f(6,12,14));
    System.out.println(f.f(0.5,0.6,0.7));
  }
}

그것을 테스트하십시오!

산출

1.0
1.25
6.947606226693615
1.575
1.575
1.09375

(a,b,c)여기에는 유형 정보가 없기 때문에 속이는 것 같습니다 . IMO 암시 적 람다 인터페이스 (귀하의 경우 F)는 총 바이트 합계로 계산해야합니다.
F. George

4
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Lambdas 를 적극 권장합니다. 또한 대부분의 Java 8 항목은 아무런 언급없이 작동합니다. 당신이 동의하지 않고 내가 속인 것을 고려한다면, 나는 당신이이 표기법이 받아 들여 지는지 공식적으로 메타로 물어볼 것을 권합니다. 한편, 나는 이전 Java 8 답변에 정렬합니다.
Olivier Grégoire

4

해파리 , 17 16 바이트

1 바이트를 저장해 준 Zgarb에게 감사합니다.

p%/*-)/+i
    2%

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

설명

이것은 Dennis의 답변 과 동일한 상호 수식을 기반으로합니다 .

보다 전통적인 기능 표기법에서 위의 프로그램은 다음과 같이 읽습니다.

print(
  1 / fold(
    multiply,
    fold(add, i) / i - 2
  )
)

i입력 목록은 어디에 있습니까 ? 참고 fold(multiply, ...)단지 제품과 계산 fold(add, ...)우리가 더에이 문제를 단순화 할 수 있도록, 합계 :

print(1 / product(sum(i) / i - 2))

sum(i) / i후크를 통해 구현 )/+한 번에 두 단계를 수행하기 위해 새로운 함수를 정의 단항.


후크 로 바이트를 저장하십시오 .
Zgarb

4

Dyalog APL , 10 9 바이트

×/⊢÷+/-+⍨

이것은 익명 함수 트레인 (포크 포크의 꼭대기 꼭대기)으로, 모든 하위 함수가 다음 구조 내에서 인수에 적용됨을 의미합니다.

 ┌─┴─┐          
×/ ┌─┼───┐      
    ÷ ┌─┼──┐  
      +/ - +⍨

TryAPL 온라인!

×/ 의 제품

논쟁

÷ 로 나눈

+/ 인수의 합

- 마이너스

+⍨ 인수가 두 배가되었습니다 (점등 됨)

수학적 배경.

ngn은 바이트를 면도했습니다.


안녕하세요 Adám, pls. 내가 잊어 버린 경우 :-) '⊢' 다음 주에 대해 물어 생각 나게
MBaas

알고리즘이 전혀 없기 때문에 "백그라운드"링크가이 답변과 어떤 관계가 있을지 모르겠습니다. 또한 작업 순서에 대한 정보를 추가 할 수 있습니까? 나는이 답변을 다양한 순서로 여러 언어로 재현하려고 시도했지만 항상 질문의 답변과는 다른 답변을 얻습니다.
cat

@cat 글쎄, 위키 백과에 해당 페이지가 없기 때문에 종횡비가 무엇인지 설명하기 위해 알고리즘을 제공하는 것이 아닙니다. APL은 오른쪽에서 왼쪽입니다. 즉, 모든 함수는 오른쪽에있는 모든 것을 인수로 사용합니다. 따라서 설명과 같이 왼쪽에서 오른쪽으로 읽을 수 있습니다.
Adám


3

dc, 49 바이트

5k?dsa?dsb?dsc++2/sslalblc**lsla-lslb-lslc-8***/p

주어진 공식의 직접적인 구현. 3 개의 개별 라인에서 호출시 3 개의 입력을 프롬프트하고 소수점 다음에 5 자리의 부동 소수점 값을 다음 라인으로 출력합니다.

설명

5k                                                # Set the output precision to 5 digits after the decimal
  ?dsa                                            # Prompt for first input value on first line, duplicate it, and then store it in register `a`
      ?dsb                                        # Prompt for second input, duplicate it, and store it in register `b`
          ?dsc                                    # Prompt for third input, duplicate it, and store it in register `c`
              ++2/ss                              # Sum up the 3 values on the main stack, then divide sum by 2 and store the result in register `s`
                    lalblc**                      # Copy all three values from registers `a`,`b`,`c` onto the main stack, find their product, and push result to top of main stack
                            lsla-                 # Copy value from register `s` onto main stack, subtract register `a`'s value from it, and push result to main stack
                                 lslb-            # Copy value from register `s` onto main stack, subtract register `b`'s value from it, and push result to main stack
                                      lslc-       # Copy value from register `s` onto main stack, subtract register `c`'s value from it, and push result to main stack
                                           8***   # Find the product of the top three values and 8 and then push the result to main stack
                                               /p # Divide the second to top value (a*b*c) by the top of stack value (8*(s-a)*(s-b)*(s-c)), push the result to the main stack, and then output the result to STDOUT

3

TI 기본, 11 바이트

입력은 다음과 같은 목록 형식이어야합니다 {A B C}.

prod(Ans)/prod(sum(Ans)-2Ans

아마도이 시각 자료가 도움이 될 것입니다 (을 기억하십시오 2s = a+b+c).

      abc abc abc prod (답)
---------------- = --------------------- = ----------- -------- = -------------------
8 (sa) (sb) (sc) (2s-2a) (2s-2b) (2s-2c) (a + b + c) (1-2 {a, b, c}) prod (sum (Ans) -2Ans)



2

넷째, 83 바이트

부동 소수점 매개 변수가 부동 소수점 스택에서 시작한다고 가정합니다. 부동 소수점 스택에 결과를 남깁니다. 매개 변수 / 반환에 스택을 사용하는 것이 Forth의 표준입니다.

: p 3 fpick ;
: T p p p ;
: f 0 s>f T f- f+ f- T f+ f- f* T f- f- f* 1/f f* f* f* ;

온라인으로 사용해보십시오 - 모든 테스트 사례가 포함되어 있습니다

수식을 사용합니다 a*b*c * 1/ ( -(a+b-c) * -(b+c-a) * (a+c-b) ). 거의 모든 프로그램이 부동 소수점 스택만을 사용하고 있습니다. 3in 은 예외입니다 3 fpick. 이 프로그램은 fpick(Ideone works, repl.it not not) 을 지원하는 통역사가 필요합니다 .

설명 : 약간 덜 골프

\ 3 fpick takes the 3rd element (0-indexed) and pushes a copy
\ Used to copy parameters on the stack over another number 'x' ( a b c x -> a b c x a b c )
: f3p 3 fpick 3 fpick 3 fpick ;

: f                     \ define a function f
0 s>f f3p f- f+ f-      \ push a zero, copy params, compute 0-(a+b-c)
                        \ the zero allows me to copy (I need an 'x' to jump over)
f3p f+ f- f*            \ copy params and compute -(b+c-a), multiply by previous result
                        \ the negatives miraculously cancel
f3p f- f- f*            \ copy and compute (a+c-b), multiply by previous result
1/f f* f* f* ;          \ take the reciprocal and multiply by a*b*c
                        \ the result is left on the floating point stack

2

ised : 19 바이트

@*$1/@*{@+$1-2.*$1}

공백으로 분리 된 배열을 가진 파일이 될 수 있거나 파이프 / stdin에서 수신 할 수있는 ised --l 'inputfile.txt' '@*$1/@*{@+$1-2.*$1}' 위치 로 호출하십시오 .inputfile.txt-

유니 코드 버전 (같은 바이트 수이지만 3 자 미만) :

Π$1/Π{Σ$1-2.*$1}

불행히도, ised입력 인수 구문으로 많은 문자를 낭비합니다.


2

VBA, 76

Function r(a,b,c)
s=(a+b+c)/2:r=(a*b*c)/(8*(s-a)*(s-b)*(s-c))
End Function

와 전화

σr (3,4,5)

또는

= r (5,12,13)


@ SuperJedi224의 알고리즘으로 6 바이트를 절약 할 수 있습니다 :Public Function r(a,b,c):r=a*b*c/(b+c-a)/(a-b+c)/(a+b-c):End Function
steenbergh

2

C #, 82 바이트

void ar(double a,double b,double c)=>Console.Write(a*b*c/(b+c-a)/(a+c-b)/(a+b-c));

용법:

ar(42, 42, 3.14);


2

k, 19 바이트

{(*/x)%8*/-x-+/x%2}

오른쪽에서 왼쪽으로 평가-x를 2로 나누고 결과를 합산하여 원래 x에서 빼십시오. 답을 부정하고 결과의 곱을 구하십시오. 8 결과는 분 모이고 분자는리스트의 곱입니다.


1

루아, 45 바이트

a,b,c=...print(a*b*c/(b+c-a)/(a+c-b)/(a+b-c))

JavaScript 답변에 크게 의존합니다.

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