고정밀 금속성


13

배경

유명한 황금 평균으로 시작 하는 금속성 수단 은 모든 자연수 (양의 정수)에 대해 정의되며, 각각의 비이성 상수입니다 (무한의 비 반복 십진 확장을 가짐).

자연수의 경우 금속 평균은 2 차 방정식의 근본입니다.

뿌리는 항상

그러나 금속성 평균은 보통 양의 근으로 주어집니다. 따라서이 질문에 대해 다음과 같이 정의됩니다.

대한 결과 유명한 황금 비율은 다음과 같습니다


도전

코드에는 n과 p의 두 가지 입력 이 필요합니다 (일관성이있는 한 순서는 중요하지 않음)

  • n은 어떤 금속 평균을 나타내는 자연수
  • p는 소수점 이하 자릿수를 나타내는 자연수입니다.

코드는 n 번째 금속 평균을 소수점 이하 p 자리까지 출력해야합니다.

타당성

코드는 n과 ​​p의 값이 1에서 65,535 사이 인 경우 유효합니다.

다음과 같은 형식으로 소수를 출력해야합니다

자릿수. 숫자 (공백없이)

예를 들어, 황금 평균은 소수점 이하 9 자리입니다.

1.618033988

소수점 이하 자릿수 확장으로 표시되므로 반올림하지 않고 마지막 숫자를 표시합니다. 황금 평균의 다음 숫자는 7이지만 예제의 마지막 8은 9로 반올림해서는 안됩니다.

소수점 이하 자릿수는 p 여야합니다. 즉, 뒤에 오는 0도 포함되어야합니다.

양식의 답변

유효하지 않습니다. 10 진수 확장을 사용해야합니다.

최대 1 개의 선행 줄 바꿈과 최대 1 개의 후행 줄 바꿈을 출력 할 수 있습니다. 공백이나 숫자 및 단일 점 / 마침표 / 마침표 이외의 다른 문자는 출력 할 수 없습니다.

점수

이것은 표준 코드 골프입니다. 점수는 코드의 바이트 수입니다.


리더 보드

( Martin의 리더 보드 스 니펫 사용 )

답변:


17

dc, 12

?kdd*4+v+2/p
  • ? 스택에 n과 p를 밀어 넣습니다.
  • k 정밀도를 p로 설정
  • dd n을 두 번 복제 (총 3 부)
  • * 곱하기 n * n
  • 4+ 4 추가
  • v 제곱근을 취하다
  • + n 추가 (스택의 마지막 사본)
  • 2/ 2로 나누다
  • p 인쇄

테스트 케이스 :

$ dc -f metalmean.dc <<< "1 9"
1.618033988
$

7
작업에 적합한 도구입니다.
Dennis

5
@Dennis는 CJam이 다른 것보다 거의 3 배나 긴 시간이되었습니다 ;-)
Digital Trauma

2

R, 116 바이트

library(Rmpfr);s=scan();n=mpfr(s[1],1e6);r=(n+(4+n^2)^.5)/2;t=toString(format(r,s[2]+2));cat(substr(t,1,nchar(t)-1))

STDIN에서 정수 2 개를 읽고 결과를 STDOUT에 인쇄합니다. 당신은 할 수 있습니다 온라인으로보십시오 .

언 골프 + 설명 :

# Import the Rmpfr library for arbitrary precision floating point arithmetic
library(Rmpfr)

# Read two integers from STDIN
s <- scan()

# Set n equal to the first input as an mpfr object with 1e6 bits of precision
n <- mpfr(s[1], 1e6)

# Compute the result using the basic formula
r <- (n + sqrt(4 + n^2)) / 2

# Get the rounded string representation of r with 1 more digit than necessary
t <- toString(format(r, s[2] + 2))

# Print the result with p unrounded digits
cat(substr(t, 1, nchar(t) - 1))

Rmpfr라이브러리가 설치되어 있지 않으면 install.packages("Rmpfr")모든 꿈을 이룰 수 있습니다.


1

Mathematica, 50 바이트

SetAccuracy[Floor[(#+Sqrt[4+#^2])/2,10^-#2],#2+1]&

소요 익명 함수를 정의 n하고 p순서를. 로 Floor반올림을 방지하기 위해 사용 합니다 SetAccuracy. 십진수 출력을 얻으려면 필요합니다.


@Arcinde 불행히도 기계 정밀도 숫자를 사용할 수 없으므로 처리 할 수 ​​없습니다 p>15.
2012rcampion

1

CJam, 35 바이트

1'el+~1$*_2#2$2#4*+mQ+2/1$md@+s0'.t

p를 먼저 읽은 다음 n을 읽습니다 .

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

우리는 단순히 n × 10 p에 대한 문제의 공식을 계산하고 결과의 정수와 소수 부분을 10 p 로 나눈 다음 소수 부분을 선행 0으로 채우고 p 자리 를 얻고 점으로 구분 된 부분을 인쇄합니다.

1'e  e# Push 1 and 'e'.
l+   e# Read a line from STDIN and prepend the 'e'.
~    e# Evaluate. This pushes 10**p (e.g., 1e3 -> 1000) and n.
1$*  e# Copy 10**p and multiply it with n.
_2#  e# Copy n * 10**p and square it.
2$   e# Copy 10**p.
2#4* e# Square and multiply by 4.
+    e# Add (n * 10**p)**2 and 4 * 10**2p.
mQ   e# Push the integer part of the square root.
+2/  e# Add to n * 10**p and divide by 2.
1$md e# Perform modular division by 10**p.
@+s  e# Add 10**p to the fractional part and convert to string. 
0'.t e# Replace the first character ('1') by a dot.

1

파이썬 2, 92 바이트

이제 답변을 살펴보면 CJam 답변이 이와 동일한 기본 방법을 사용하는 것처럼 보입니다. 답을 계산 한 n*10**p다음 소수점을 더합니다. 제곱근의 정수 부분을 계산하는 방식으로 인해 엄청나게 비효율적입니다.

n,p=input()
e=10**p;r=0
while(n*n+4)*e*e>r*r:r+=1
s=str((n*e+r-1)/2);print s[:-p]+'.'+s[-p:]

1

PHP, 85 78 바이트

echo bcdiv(bcadd($n=$argv[bcscale($argv[2])],bcsqrt(bcadd(4,bcpow($n,2)))),2);

그것은 사용 BC 수학 , 일부 시스템에서는 사용할 수 없습니다 수학적 확장을. 명령 행 옵션 을 지정하여 컴파일 시간 에 포함시켜야합니다 --enable-bcmath. 항상 Windows에서 사용할 수 있으며 OSX와 함께 제공되는 PHP 버전에도 포함되어 있습니다.

업데이트 :

@blackhole이 제안한 모든 해킹을 의견에 적용했습니다 (감사합니다!). 초기 $n사용 (3 바이트 이상 절약)으로 초기화를 짜 넣었고 이제 코드는 위의 코드 상자에서 한 줄에 맞습니다.


@블랙홀. 실제로 85입니다. 아마 86을 읽고 (약간 더 큰 선택을 했음) 실수로 68을 썼습니다. 지금 수정했습니다.
axiac

1
문제 없어요 :). 그런데 1 바이트를 줄일 수 있습니다 : 주위의 괄호를 제거하고 그 뒤에 echo공백을 남겨 두십시오.
Blackhole

1
그리고 bcscalereturn 을 기대 하기 때문에 2 바이트를 더 true사용 $n=$argv[bcscale($argv[2])];하고 저장할 수 있습니다 .
Blackhole

좋은 해킹입니다.
axiac

코드 더러움은 예술입니다 : P. 아, 마지막 하나 : bcpow($n,2)대신 bcmul($n,$n)1 바이트 를 절약합니다.
Blackhole

1

J, 27 바이트

4 :'}:":!.(2+x)-:y+%:4+*:y'

설명:

4 :'                      '   | Define an explicit dyad
                       *:y    | Square y
                     4+       | Add 4
                   %:         | Square root
                 y+           | Add y
               -:             | Half
      ":!.(2+x)               | Set print precision to 2+x
    }:                        | Remove last digit, to fix rounding

다음과 같이 호출하십시오.

    9 (4 :'}:":!.(2+x)-:y+%:4+*:y') 1
1.618033988

약간 더 시원한 또 다른 솔루션 :

4 :'}:":!.(2+x){.>{:p._1,1,~-y'

다항식 x ^ 2-nx-1의 근을 계산합니다. 불행하게도, J가 결과를 형식화하는 방식은 원하는 근을 조금 더 길게 만듭니다.

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