정점 연결 합


14

양의 정수 N 이 있다고 가정 해 봅시다 . 먼저 N 개의 꼭짓점이 있고 인접한 꼭짓점 사이의 거리가 1 정다각형을 만듭니다 . 그런 다음 모든 꼭짓점에서 다른 꼭짓점으로 선을 연결합니다. 마지막으로 모든 줄의 길이를 합산하여 계산하십시오.

입력 N = 6 이면 모든 정점을 다른 정점과 연결하는 선 으로 육각형 을 만듭니다.

육각형

보시다시피, 총 6 개의 경계선 (길이 = 1), 경계 길이의 두 배 (길이 = 2)를 갖는 3 개의 선 및 피타고라스 정리를 사용하여 6 개의 다른 선이 있습니다. 입니다.

선의 길이를 더하면 (6 * 1) + (3 * 2) + (6 * 1.732) = 22.392가 됩니다.

추가 정보

정점이 2 개 이하인 구조는 다각형으로 간주 NaN되지 않으므로 단일 정점을 다른 정점에 연결할 수 없으므로 N = 1 인 경우 0을 출력합니다 (또는 단일 정점 사이의 거리가 의미가 없기 때문에). 두 개의 정점이 단일 선으로 연결되므로 N = 2입니다.

입력

합리적인 형식의 정수 N

산출

모든 행의 길이는 함께 반환되어 함수 반환 또는로 직접 인쇄되는 소수점 이하 3 자리까지 정확합니다 stdout.

규칙

  • 표준 허점은 금지되어 있습니다.
  • 이것은 이므로 모든 언어에서 가장 짧은 바이트 코드가 이깁니다.

행운을 빕니다!

테스트 사례

(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392

1
우리는 정말 처리해야 1합니까? 내 현재 항목은 nan예를 들어 0이 아닌 반환 되며 특별한 케이싱이 필요합니다.
Jonathan Allan

1
@JonathanAllan 나는 당신의 대답을 본 후에 그것에 대해 생각했습니다 nan. 단일 정점 사이의 거리는 어쨌든별로 의미가 없기 때문에 괜찮습니다.
Ian H.

6
아마 n=1내가 생각 하기에 오류가 발생하도록 허용해야합니다 .
Jonathan Allan

N출력이 커지고 수레가 덜 정확하기 때문에 소수점 이하 3 자리의 정확도가 무엇을 의미하는지 말하기는 어렵습니다 .
xnor

@xnor 합리적인 입력 N에 대해 소수점 이하 3 자리까지 정밀한 한 , 그 결과는 큰 숫자에 대해서는 정확도 가 떨어집니다.
Ian H.

답변:


13

Python 3 ( syppy 포함 ) ,  61 60 58 54  48 바이트

xnorn=1 덕분에 -6 ( 처리 할 필요가없는 경우 -10 일 수도 있음) (1 삼각대 를 처리하고 (불필요한) float캐스트를 이동하여 괄호를 절약하는 추가 삼각법 )

타사 라이브러리 가 없어도 이길 수 있기를 바랍니다 . 예!! 하지만 물건을 구르 자 ...

lambda n:1%n*n/2/(1-cos(pi/n))
from math import*

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

이것은 다각형이 단위 원 안에 새겨진 경우 길이의 합에 대한 공식을 사용하고 n*cot(pi/2/n)/2그 코드 길이의 죄로 나눠서 측면 길이가 1 인 결과를 조정합니다 sin(pi/n).

첫 번째 공식은 n-1한 모서리에서 나오는 모든 대각선 의 코드 길이를 sin(pi/n)(다시) sin(2*pi/n),, ..., sin((n-1)pi/n). 이것의 합 cot(pi/2/n)n모퉁이가 있으므로을 곱 n하지만 모든 코드를 두 번 세어 2로 나눕니다.

결과는 n*cot(pi/2/n)/2/sin(pi/n)다음에 XNOR함으로써 단순화 하였다 n/2/(1-cos(pi/n))(유지 한 n>1)

... 이제 (정확도가 수용 가능한 한) 더 이상 sympy내장 math모듈 ( math.pi=3.141592653589793)을 필요로하지 않습니다 .


2
예! 11 바이트를 절약했습니다. 멋진 공식!
J42161217

1
수식이 단순화 된 것처럼 보입니다 n/2/(1-cos(pi/n)).
xnor

좋은 스팟 @ xnor (우리가 출력 할 수있는 0.25n=1-그러나 특별한 케이싱은 더 짧을 수도 있습니다 ...)
Jonathan Allan

@JonathanAllan Huh 1/4의 결과는 이상합니다 n=1. 로 패치 할 수 있습니다 1%n*. 또한 float내부를 로 이동하여 파 렌스를 저장할 수 있습니다 float(1-cos(pi/n)). 나는 sympy를 많이 모르지만 float를 강제하는 산술 방법이있을 수 있습니다.
xnor

@xnor 감사합니다! ( float이동에 주목해야한다 ). sympy는 표현식을 출력합니다 (예 : 표현이있는 표현식에 n=6캐스트 결과가없는 3.0/(-sqrt(3)/2 + 1)경우). 더 짧은 방법이있을 수 있지만 아직 알 수 없습니다.
Jonathan Allan

7

파이썬 , 34 바이트

lambda n:1%n*n/abs(1-1j**(2/n))**2

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

Jonathan Allan에서n/2/(1-cos(pi/n)) 단순화 공식을 사용합니다 . Neil은 파이썬이 단일의 근을 분수의 거듭 제곱으로 계산할 수 있다는 점을 지적함으로써 10 바이트를 절약했습니다 1j.

가져 오기가없는 Python에는 내장 삼각 함수 pi, 또는이 없습니다 e. 하려면 n=10이 아니라 0.25, 우리가 앞에 추가 1%n*.

자연수 만 사용하는 더 긴 버전 :

lambda n:1%n*n/abs(1-(1+1e-8j/n)**314159265)**2

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


1
오이처럼 시원한.
Jonathan Allan

37 바이트 :lambda n:1%n*n/(1-(1j**(2/n)).real)/2
Neil

@Neil 와우, 파이썬은 단결의 근본을 계산할 수 있습니다.
xnor

글쎄, 그건 쉬운 일이었습니다. 나는 무엇을하는지 모른다 abs().
Neil

@ Neil은 절대 값을 얻습니다. 따라서 표준, 즉 원점과의 거리를 얻습니다.
Jonathan Allan

6

MATL , 16 15 바이트

t:=ZF&-|Rst2)/s

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

이것은 FFT (Fast Fourier Transform) 기능을 도입하고 8 일 전에 문제를 해결 하는 커밋 을 사용합니다 .

설명

코드는 이 트릭 (MATL에 적응)을 사용하여 통일의 근본을 생성합니다. 연속 정점 사이의 거리가 1로 정규화되지 않는다는 점을 제외하고는 정점의 위치를 ​​복소수로 제공합니다.이를 해결하기 위해 모든 쌍별 거리를 계산 한 후 프로그램은 연속 정점 사이의 거리로이를 나눕니다.

t       % Implicit input, n. Duplicate
:       % Range: [1 2 ... n-1 n]
=       % Isequal, element-wise. Gives [0 0 ... 0 1]
ZF      % FFT. Gives the n complex n-th roots of unity
&-|     % Matrix of pairwise absolute differences
R       % Upper triangular matrix. This avoids counting each line twice.
s       % Sum of each column. The second entry gives the distance between
        % consecutive vertices
t2)/    % Divide all entries by the second entry
s       % Sum. Implicit display

1
이것은 아름답다
Jonah

@Jonah Complex numbers FTW :-)
Luis Mendo

5

메뚜기, 프리미티브 25 개 (구성 요소 11 개, 와이어 14 개)

GH와 LabVIEW의 프로그램에 대한 메타 게시물을 읽었으며 유사한 지침에 따라 시각적 언어를 측정합니다.

메뚜기 프로그램

모서리가 2 개 이하인 다각형을 생성 할 수 없으므로 빈 줄 목록이 표시 되므로 <null>N =로 인쇄 합니다.0, 1, 2Polygon Primitive

왼쪽에서 오른쪽으로 구성 요소 :

  • Side count 슬라이더 : 입력
  • 다각형 기본 요소 : 캔버스에 다각형 그리기
  • 분해 : 폴리 라인을 퇴적물과 정점으로 분해
  • 상호 참조 : 모든 정점 사이의 전체적인 상호 참조 구축
  • 선 : 모든 쌍 사이에 선을 그립니다.
  • 중복 줄 삭제
  • 곡선의 길이
  • (위) 합계
  • (하단) 구분 : 때문에 Polygon Primitive 반지름을 기준으로 다각형을 그리 모양의 크기를 조정해야합니다
  • 다각화
  • 패널 : 출력

코뿔소



2

하스켈 , 27 바이트

f 1=0
f n=n/2/(1-cos(pi/n))

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

방금 Haskell에 뛰어 들었으므로 이것은 공정한 초보자 골프 (즉, 다른 답변에서 수식을 복사)로 판명되었습니다.

나는 또한 $어딘가에 두려고 열심히 노력 했지만 컴파일러는 계속 소리 지르고있어 이것이 내가 가진 최고입니다. :피


2

젤리 , 13 12 11 바이트

Jonathan Allan의 공식을 사용합니다 (2 바이트를 절약 한 덕분에)

ØP÷ÆẠCḤɓ’ȧ÷

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

나는 항상 젤리에 매료되어 왔지만 많이 사용하지 않았으므로 가장 간단한 형태는 아닐 수도 있습니다.


"argument swapping dyadic chain isolation"을 사용하여 ɓ다음과 같이 도우미 링크를 인라인하여 바이트를 저장하십시오 .ØP÷ÆẠCḤɓn1×÷
Jonathan Allan

@JonathanAllan 감사합니다. 저는 여전히 초보자이며 새로운 체인을 이용하는 것보다 더 나은 방법이 있을지 모르지만 어떻게해야할지 몰랐습니다
Jeffmagma

오, 우리는 decrement, 및 logical-and, ȧ: ØP÷ÆẠCḤɓ’ȧ÷:) 를 사용하여 다른 파일을 저장할 수 있습니다 .
Jonathan Allan

오, 와우 고마워 내가 생각하지 않았다
Jeffmagma

1

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

n=>1%n*n/2/(1-Math.cos(Math.PI/n))

@JonathanAllan의 Python 3 답변 포트

f=n=>1%n*n/2/(1-Math.cos(Math.PI/n))
<input id=i type=number oninput="o.innerText=f(i.value)" /><pre id=o>

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