일반 다각형의 면적 계산


19

정수가 주어지면 n여기서 apothem이 1 3 <= n < 2^32인 정규 n-곤의 면적을 계산합니다 . 의 공식은 n * tan(π / n)입니다. 대변자가 무엇인지 모르는 사람들을 위해 :

정다각형의 대변은 한 변의 중심에서 중간 점까지 선분입니다.

n-gon 의 면적을 소수점 이하 8 자리 이상의 부동 소수점으로 출력합니다 .

테스트 사례

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

참고 : 위의 테스트 사례에는 출력하는 데 필요한 것보다 2 자리 더 많은 숫자가 포함되어 있습니다.

답변:


9

매스 매 티카, 16 바이트

N[Tan[Pi/#]#,9]&

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

물론 수학은 이것을 위해 내장되어 있습니다

Area@*RegularPolygon

Area@RegularPolygon이어야한다 Area@*RegularPolygon; 지금은 변수에서 캡처 할 수 없습니다. 즉, f = Area@RegularPolygon; f[3]작동하지 않습니다. 관련 메타 토론
JungHwan Min

확인 @JungHwanMin, 나는 그것을 고정 (AN의 대답은 단지 재미를 위해 내장 된 기능 보여주는데 나는 그것을 게시하지 않았지만).
J42161217


6

실제로 5 바이트

╦/Tß*

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


어떻게?

╦ / Tß * 전체 프로그램.

Pi Pi를 누릅니다.
 /를 입력으로 ^를 나눕니다.
  T 탄젠트.
   ß * 입력에 곱하십시오.
        암시 적으로 출력합니다.

대안 : ß╦/T*. o_O 실제로 실제로 젤리를 이깁니다 !


2 바이트 내장 이름 ...
Outgolfer Erik

그래, 나도 알아 ... Pyth에서 @EriktheOutgolfer 3 바이트 내장 인 생각을> <.
씨 Xcoder

3
" 실제로 젤리보다 낫다 " +1 ;)
Kevin Cruijssen

4

x87 머신 코드, 11 바이트

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

위의 바이트 코드는 apothem이 1 인 일반 n-gon의 면적을 계산하는 함수를 정의합니다. x87 FPU 명령어 (x86 프로세서의 클래식 부동 소수점 단위)를 사용하여이 계산을 수행합니다.

표준 x86 레지스터 기반 호출 규칙 (이 경우 __fastcall)에 따라 함수의 인수는 ECX레지스터에 전달 된 정수에 대한 포인터 입니다. 함수의 결과는 부동 소수점 값이며 x87 부동 소수점 스택 (register ST0) 의 맨 위에 반환됩니다 .

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

ungolfed 어셈블리 니모닉 :

D9 EB  fldpi                  ; load constant PI at top of FPU stack
DA 31  fidiv DWORD PTR [ecx]  ; divide PI by integer input (loaded from pointer
                              ;   in ECX), leaving result at top of FPU stack
D9 F2  fptan                  ; compute tangent of value at top of FPU stack
DD D8  fstp  st0              ; pop junk value (FPTAN pushes 1.0 onto stack)
DA 09  fimul DWORD PTR [ecx]  ; multiply by integer input (again, loaded via ECX)
C3     ret                    ; return control to caller

보시다시피, 이것은 기본적으로 주어진 공식의 간단한 계산입니다.
     result = n * tan (π / n)
몇 가지 흥미로운 것들만 지적합니다.

  • x87 FPU에는 상수 값 PI ( FLDPI) 를로드하기위한 전용 명령이 있습니다. 이것은 당시에도 거의 사용되지 않았으며 (지금은 훨씬 적습니다), 바이너리에 상수를 삽입하고로드하는 것보다 크기가 짧습니다.
  • 계산 접선 x87의 FPU 명령어는 FPTAN결과와 상기 입력 레지스터 (FPU에 스택의 맨 위)의 값을 대체하지만 FPU에 스택의 상단에 일정 1.0 민다. 이것은 8087과의 이전 버전과의 호환성을 위해 수행됩니다 (8087에서 왜 이런 일이 있었는지 전혀 알지 못합니다. 아마도 버그 일 것입니다). 즉,이 불필요한 값을 스택에서 팝해야합니다. 가장 빠르고 짧은 방법은 FSTP st0여기서 사용하는 것처럼 간단 합니다. 우리는 또한 multiply-and-pop을 수행 할 수 있습니다 .1.0을 곱해 도 결과가 변경되지는 않지만 2 바이트 (코드 크기에서 이기지 않음)이며 더 느리게 실행되며 불필요한 불확실성을 초래할 수 있습니다 결과.

최신 프로그래머 나 컴파일러는 에이징 x87 대신 SSE (및 이후) ​​명령어 세트를 사용하지만 새로운 ISA에서는 탄젠트를 계산하는 단일 명령어가 없기 때문에 구현하는 데 더 많은 코드가 필요합니다.









2

var'aq , 51 바이트

'Ij latlh HeHmI' tam boqHa''egh qojmI' boq'egh cha'

설명

'Ij        - read from STDIN
latlh      - duplicate top of stack
HeHmI'     - push PI onto stack
tam        - swap first 2 elements on stack
boqHa''egh - divide
qojmI'     - take tangent
boq'egh    - multiply
cha'       - print


2

자바 스크립트 (ES6), 24 바이트

x=>x*Math.tan(Math.PI/x)

시도 해봐

o.innerText=(f=
x=>x*Math.tan(Math.PI/x)
)(+i.value);oninput=_=>o.innerText=f(+i.value)
<input id=i min=3 type=number value=3><pre id=o>


1

파이썬 2 , 45 바이트

from math import*
n=input()
print n*tan(pi/n)

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



이와 같은 캘랭에서 나는 바닥 글에 인쇄물을 넣어 바이트를 절약하기 위해 람다를 사용하는 것을 정말로 싫어합니다 ... 따라서 : 44 바이트
Simon

4
@ 시몬 왜? 함수는 유효한 제출입니다. 값을 출력하거나 함수에서 반환 할 수 있습니다. 바닥 글에 인쇄 할 필요는 없습니다.
Stephen

1

Pyth , 9 바이트

*.tc.n0Q2

테스트 스위트.


어떻게?

* .tc.n0Q2 전체 프로그램. Q는 입력을 의미합니다.

    .n0 파이. 
   c :
       Q 입력.
 .t 2 탄젠트.
* Q 입력 값을 곱합니다.
             암시 적으로 출력합니다.




1

펄, 14 + 16 = 30

perl -MMath::Trig -ple'$_*=tan(pi/$_)'

적절한 프로그램의 경우 14 바이트, 명령 행 스위치의 경우 16 바이트



0

IBM / Lotus Notes 공식 언어, 13 바이트

a*@Tan(@Pi/a)

수식이 포함 된 필드와 같은 형식의 a라는 필드를 통해 입력을받습니다. 사용 가능한 TIO가 없으므로 아래에 표시된 모든 테스트 사례의 스크린 샷 :

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





0

3
불행히도 이것은 완전한 프로그램이 아니며 기능이 아닙니다. 대신 스 니펫이며 여기에서는 허용되지 않습니다. 그러나, 당신은 n=>이것을 화살표 기능으로 만들기 위해 시작에 추가 할 수 있다고 생각합니다 (소금 한 덩어리로 이것을 가져 가십시오, 나는 C #을 알지 못합니다).
caird coinheringaahing

스 니펫을에 입력 System.Func<T, T>할 수 있습니다. float이 입력은 입력으로 사용하고 다른 입력은 출력으로 사용합니다. 선언은 다음과 같습니다. System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);여기서 바이트 수는에서 시작 n=>합니다. 내 예에서는 2 바이트를 절약하기 위해 두 개의 괄호를 생략했습니다.)
Ian H.

0

RPNGolf 0.6 / 0.7 , 12 바이트

tbp-1mBsdmcc

새로운 스택 기반 언어 인 RPNGolf를 사용한 첫 번째 게시물!

이것은 표준 입력에서 정수를 읽고 출력을 표준 출력으로 출력합니다 (후행 줄 바꿈 없음).

설명:

tb              # push user input from STDIN as int
  p             # duplicate top of stack
   -1           # push -1
     mB         # pop i, push inverse cosine of i
       s        # swap top two items on the stack
        d       # pop b, pop a, push a/b
         mc     # pop i, push tangent of i
           c    # pop b, pop a, push a*b
# RPNGolf implicity prints the stack upon normal exit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.