Металеві засоби високої точності


13

Фон

Ці металеві гроші , починаючи з відомої золотої середини , визначені для будь-якого натурального числа (позитивне ціле число), і кожен з них є ірраціональним константа (вона має нескінченне розширення одноразових десяткову).

Для натурального числа , то металеве середнє є коренем квадратного рівняння

Коріння завжди є

але металеве середнє зазвичай подається як позитивний корінь. Тож для цього питання воно буде визначене:

Для результату є знаменитої золотої пропорцією:


Виклик

Ваш код повинен мати 2 входи: n і p (порядок не важливий, поки він відповідає)

  • n - натуральне число, яке вказує, яке металеве значення означає
  • p - натуральне число, що вказує, скільки десяткових знаків точності

Ваш код повинен виводити n-ту металеву середню до p точності після коми.

Дійсність

Ваш код дійсний, якщо він працює для значень n і p від 1 до 65,535.

Ви повинні вивести десяткову форму

цифра (и). цифра (цифри) (без пробілів)

Наприклад, золота середина до 9 знаків після коми

1.618033988

Останню цифру відображайте без округлення, як це відображатиметься при більш тривалому розширенні десятків. Наступна цифра в золотому середині - це 7, однак підсумкова 8 у прикладі не повинна округлюватися до 9.

Кількість десяткових цифр повинна бути p, що означає, що будь-які кінцеві нулі також повинні бути включені.

Відповіді форми

недійсні - потрібно використовувати десяткове розширення.

Ви можете вивести до 1 провідного нового рядка і до 1 зворотного нового рядка. Ви не можете виводити пробіли та будь-які інші символи, окрім цифр та єдиної точки / повної зупинки / періоду.

Оцінка

Це стандартний код гольфу: ваш рахунок - кількість байтів у вашому коді.


Таблиця лідерів

(Використання фрагмента таблиць лідерів Мартіна )

Відповіді:


17

DC, 12

?kdd*4+v+2/p
  • ? Натисніть n і p на стек
  • k встановити точність на p
  • dd дублікат n двічі (всього три примірники)
  • * помножити n * n
  • 4+ додати 4
  • v взяти квадратний корінь
  • + додати n (остання копія в стеці)
  • 2/ ділимо на 2
  • p друк

Тестова шафа:

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

7
Правильний інструмент для роботи.
Денніс

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 і друкує результат у 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

Математика, 50 байт

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

Визначає анонімну функцію, яка бере nі pв порядку. Я використовую Floorдля запобігання округлення SetAccuracy, яке мені потрібно для отримання десяткового виводу.


@Arcinde Я, на жаль, не можу використовувати точні цифри машини, оскільки вони не зможуть впоратися p>15.
2012рcampion

1

CJam, 35 байт

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

Спочатку читає p , потім n .

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

Ми просто обчислюємо формулу з питання на n × 10 p , отримуємо цілу і дробову частину результату, поділену на 10 p , прокладаємо дробову частину провідними нулями для отримання 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а потім додає у десятковій точці. Це неймовірно неефективно через те, як він обчислює цілу частину квадратного кореня (просто додаючи 1, поки він не потрапить).

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 Math, яке в деяких системах не може бути доступним. Його потрібно включити до часу компіляції , вказавши параметр --enable-bcmathкомандного рядка. Він завжди доступний у Windows, і, здається, він також включений у версію PHP, що постачається в комплекті з OSX.

Оновлення :

Я застосував усі хаки, запропоновані @blackhole у своїх коментарях (спасибі!), Тоді я видавив ініціалізацію $nв перше її використання (збережено ще 3 байти), і тепер код вписується в один рядок у полі коду вище.


@Чорна діра. 85, дійсно. Я, напевно, прочитав 86 (зробив трохи більший вибір) і написав 68 помилково. Виправлено зараз.
аксіак

1
Без проблем :). Ви можете мати на 1 байт менше: видаліть дужки навколо echo, просто залиште пробіл після нього.
Blackhole

1
А оскільки ви розраховуєте bcscaleповернутися true, ви можете використовувати $n=$argv[bcscale($argv[2])];та зберігати ще 2 байти.
Blackhole

Це хороший хак.
аксіак

Кодова брудність - це мистецтво: 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 форматування результату робить відновлення потрібного кореня дещо довшим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.