Metalowe środki o wysokiej precyzji

13

tło

Środki metaliczne , zaczynając od słynnego złotego środka , są zdefiniowane dla każdej liczby naturalnej (dodatnia liczba całkowita), a każda z nich jest stałą nieracjonalną (ma nieskończoną, powtarzającą się ekspansję dziesiętną).

W przypadku liczby naturalnej średnia metaliczna jest pierwiastkiem równania kwadratowego

Korzenie są zawsze

ale średnia metaliczna jest zwykle podawana jako dodatni pierwiastek. Tak więc dla tego pytania zostanie zdefiniowane przez:

Na wyniku jest słynny Złoty stosunek:


Wyzwanie

Twój kod powinien przyjmować 2 dane wejściowe: nip (kolejność nie jest ważna, dopóki jest spójna)

  • n jest liczbą naturalną wskazującą, który środek metaliczny
  • p jest liczbą naturalną wskazującą liczbę miejsc dziesiętnych dokładności

Twój kod powinien wyświetlać n-ty metaliczny średni do p miejsc po przecinku.

Ważność

Twój kod jest poprawny, jeśli działa dla wartości nip od 1 do 65 535.

Musisz podać liczbę dziesiętną w postaci

cyfry. cyfry (bez spacji)

Na przykład złoty oznacza do 9 miejsc po przecinku

1.618033988

Wyświetl ostatnią cyfrę bez zaokrąglania, ponieważ pojawiłaby się w dłuższym rozwinięciu dziesiętnym. Następna cyfra złotego środka to 7, ale ostatnich 8 w tym przykładzie nie należy zaokrąglać w górę do 9.

Liczba cyfr dziesiętnych musi wynosić p, co oznacza, że ​​muszą być również uwzględnione wszystkie zera końcowe.

Odpowiedzi z formularza

są niepoprawne - musisz użyć rozszerzenia dziesiętnego.

Możesz wygenerować do 1 wiodącej nowej linii i do 1 końcowej nowej linii. Nie możesz wyprowadzać spacji ani żadnych innych znaków oprócz cyfr i pojedynczego punktu / kropki / kropki.

Wynik

To jest standardowy kod golfowy: twój wynik to liczba bajtów w twoim kodzie.


Tabela liderów

(Korzystanie z fragmentu tabeli liderów Martina )

trichopaks
źródło

Odpowiedzi:

17

dc, 12

?kdd*4+v+2/p
  • ? Naciśnij nip na stosie
  • k ustaw precyzję na p
  • dd zduplikuj n dwa razy (łącznie trzy kopie)
  • * pomnóż n * n
  • 4+ dodaj 4
  • v oblicz pierwiastek kwadratowy
  • + dodaj n (ostatnia kopia na stosie)
  • 2/ podziel przez 2
  • p wydrukować

Testcase:

$ dc -f metalmean.dc <<< "1 9"
1.618033988
$
Cyfrowa trauma
źródło
7
Odpowiednie narzędzie do pracy.
Dennis
5
@Dennis musi to być pierwszy raz, gdy CJam jest prawie 3 razy dłuższy niż coś innego ;-)
Digital Trauma
2

R, 116 bajtów

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))

Odczytuje dwie liczby całkowite ze STDIN i drukuje wynik do STDOUT. Możesz spróbować online .

Niegolfowane + wyjaśnienie:

# 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))

Jeśli nie masz Rmpfrzainstalowanej biblioteki, możesz install.packages("Rmpfr")i wszystkie twoje marzenia się spełnią.

Alex A.
źródło
1

Mathematica, 50 bajtów

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

Definiuje anonimową funkcję, która przyjmuje ni pporządkuje. Używam, Flooraby zapobiec zaokrąglaniu za pomocą SetAccuracy, którego potrzebuję, aby uzyskać wynik dziesiętny.

2012 rcampion
źródło
@Arcinde Nie mogę niestety użyć liczb dokładności maszyny, ponieważ nie byłyby one w stanie obsłużyć p>15.
2012rcampion
1

CJam, 35 bajtów

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

Najpierw czyta p , a następnie n .

Wypróbuj online w interpretatorze CJam .

Jak to działa

Po prostu obliczamy wzór z pytania dla n × 10 p , otrzymujemy liczbę całkowitą i ułamkową wyniku podzieloną przez 10 p , wypełniamy część ułamkową wiodącymi zerami, aby uzyskać cyfry p i drukujemy części oddzielone kropką.

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.
Dennis
źródło
1

Python 2, 92 bajty

Gdy patrzę teraz na odpowiedzi, wygląda na to, że odpowiedź CJam używa tej samej podstawowej metody, co ta. Oblicza odpowiedź, n*10**pa następnie dodaje kropkę dziesiętną. Jest niewiarygodnie nieefektywny ze względu na sposób, w jaki oblicza całkowitą część pierwiastka kwadratowego (wystarczy dodać 1, aż do niego dojdzie).

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:]
KSab
źródło
1

PHP, 85 78 bajtów

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

Wykorzystuje rozszerzenie matematyczne BC Math, które w niektórych systemach może być niedostępne. Należy uwzględnić czas kompilacji , określając --enable-bcmathopcję wiersza poleceń. Jest zawsze dostępny w systemie Windows i wygląda na to, że jest również zawarty w wersji PHP dołączonej do OSX.

Aktualizacja :

Zastosowałem wszystkie hacki sugerowane przez @blackhole w ich komentarzach (dziękuję!), A następnie ścisnąłem inicjalizację $ndo pierwszego użycia (zapisane jeszcze 3 bajty), a teraz kod mieści się w jednym wierszu w polu kodu powyżej.

aksjomat
źródło
@Czarna dziura. 85, rzeczywiście. Prawdopodobnie przeczytałem 86 (zrobiłem nieco większy wybór) i przez pomyłkę napisałem 68. Naprawiono teraz.
axiac
1
Nie ma problemu :). Nawiasem mówiąc, możesz mieć 1 bajt mniej: usuń nawias wokół echo, po prostu zostaw po nim spację.
Blackhole,
1
A ponieważ spodziewasz bcscalesię powrotu true, możesz użyć $n=$argv[bcscale($argv[2])];i zapisać jeszcze 2 bajty.
Blackhole,
To niezły hack.
axiac
Brudność kodu to sztuka: P. Och, ostatni: bcpow($n,2)zamiast bcmul($n,$n)oszczędzać 1 bajt.
Blackhole,
1

J, 27 bajtów

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

Wyjaśnienie:

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

Nazwij to tak:

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

Kolejne, nieco chłodniejsze rozwiązanie:

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

Który oblicza pierwiastki wielomianu x ^ 2 - nx - 1. Niestety, sposób, w jaki J formatuje wynik, powoduje, że pobieranie pożądanego pierwiastka jest nieco dłuższe.

Bolce Bussiere
źródło