Высокоточные металлические средства


13

Фон

Эти металлические средства , начиная с известной золотой середины , определены для любого натурального числа (положительное целое число), и каждый из них является иррациональным константа (она имеет бесконечное расширение единовременных десятичную).

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

Корни всегда

но металлическое среднее обычно дается как положительный корень. Так что по этому вопросу он будет определяться:

В результате получается знаменитое золотое сечение:


Вызов

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

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

Ваш код должен выводить n-е металлическое среднее с точностью до десятичных знаков.

Период действия

Ваш код действителен, если он работает для значений n и p от 1 до 65 535.

Вы должны вывести десятичное число в виде

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

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

1,618033988

Выведите последнюю цифру без округления, как это будет отображаться в более длинном десятичном разряде. Следующая цифра в золотом среднем - 7, но последние 8 в примере не следует округлять до 9.

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

Ответы формы

не действительны - вы должны использовать десятичное расширение.

Вы можете вывести до 1 новой строки и до 1 новой строки. Вы не можете выводить пробелы или любые другие символы, кроме цифр и одиночной точки / полной остановки / периода.

Гол

Это стандартный код гольфа: ваш счет - это количество байтов в вашем коде.


Leaderboard

(Используя фрагмент списка лидеров Мартина )

Ответы:


17

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. Вы можете попробовать это онлайн .

Ungolfed + объяснение:

# 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 , дополняем дробную часть начальными нулями, чтобы получить 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

Python 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 по ошибке. Исправлено сейчас.
Axiac

1
Нет проблем :). Кстати, вы можете иметь на 1 байт меньше: уберите круглые скобки echo, просто оставьте после них пробел.
Blackhole

1
А так как вы ожидаете bcscaleвозврата true, вы можете использовать $n=$argv[bcscale($argv[2])];и сохранить еще 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 форматирует результат, делает получение нужного корня немного длиннее.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.