Berarti Logam Presisi Tinggi

13

Latar Belakang

The berarti logam , dimulai dengan terkenal rata-rata emas , didefinisikan untuk setiap nomor alam (bilangan bulat positif), dan masing-masing merupakan konstanta irasional (memiliki ekspansi non-recurring desimal tak terbatas).

Untuk bilangan alami , rata- rata logam adalah akar dari persamaan kuadrat

Akarnya selalu

tetapi rata-rata logam biasanya diberikan sebagai akar positif. Jadi untuk pertanyaan ini akan ditentukan oleh:

Untuk hasilnya adalah rasio emas yang terkenal:


Tantangan

Kode Anda harus mengambil 2 input: n dan p (urutannya tidak penting asalkan konsisten)

  • n adalah bilangan alami yang menunjukkan rata-rata logam mana
  • p adalah bilangan alami yang menunjukkan berapa banyak tempat desimal presisi

Kode Anda harus menampilkan rata-rata logam n ke presisi tempat desimal.

Keabsahan

Kode Anda valid jika berfungsi untuk nilai n dan p dari 1 hingga 65.535.

Anda harus mengeluarkan desimal dalam formulir

digit .digit (tanpa spasi)

Misalnya, rata-rata emas ke 9 tempat desimal adalah

1.618033988

Tampilkan digit terakhir tanpa pembulatan, karena akan muncul dalam ekspansi desimal yang lebih panjang. Angka berikutnya dalam mean emas adalah angka 7, tetapi angka 8 terakhir pada contoh tidak boleh dibulatkan menjadi angka 9.

Jumlah digit desimal harus p, yang berarti setiap trailing nol juga harus dimasukkan.

Jawaban formulir

tidak valid - Anda harus menggunakan ekspansi desimal.

Anda dapat menampilkan hingga 1 baris baru dan hingga 1 baris baru. Anda tidak boleh mengeluarkan spasi apa pun, atau karakter lain selain digit dan titik tunggal / berhenti penuh / periode.

Skor

Ini adalah golf kode standar: skor Anda adalah jumlah byte dalam kode Anda.


Papan peringkat

(Menggunakan cuplikan leaderboard Martin )

trichoplax
sumber

Jawaban:

17

dc, 12

?kdd*4+v+2/p
  • ? Tekan n dan p ke tumpukan
  • k atur presisi ke hal
  • dd duplikat n dua kali (total tiga salinan)
  • * kalikan n * n
  • 4+ tambahkan 4
  • v ambil akar kuadrat
  • + tambah n (salinan terakhir di tumpukan)
  • 2/ bagi dengan 2
  • p mencetak

Kasus cobaan:

$ dc -f metalmean.dc <<< "1 9"
1.618033988
$
Trauma Digital
sumber
7
Alat yang tepat untuk pekerjaan itu.
Dennis
5
@ Dennis ini menjadi pertama kalinya CJam hampir 3 kali lebih lama dari yang lain ;-)
Digital Trauma
2

R, 116 byte

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

Ini membaca dua bilangan bulat dari STDIN dan mencetak hasilnya ke STDOUT. Anda dapat mencobanya secara online .

Penjelasan + tidak dikumpulkan:

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

Jika Anda tidak memiliki Rmpfrperpustakaan yang diinstal, Anda dapat install.packages("Rmpfr")dan semua impian Anda akan menjadi kenyataan.

Alex A.
sumber
1

Mathematica, 50 byte

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

Menentukan fungsi anonim yang mengambil ndan pberurutan. Saya gunakan Flooruntuk mencegah pembulatan SetAccuracy, yang saya butuhkan untuk mendapatkan output desimal.

2012 Arcampion
sumber
@ Arcinde sayangnya saya tidak bisa menggunakan angka presisi mesin, karena mereka tidak akan bisa menangani p>15.
Arcampion
1

CJam, 35 byte

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

Baca p pertama, lalu n .

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

Kami cukup menghitung rumus dari pertanyaan untuk n × 10 p , dapatkan bagian bilangan bulat dan fraksional dari hasil dibagi 10 p , pad bagian fraksional dengan nol terkemuka untuk mendapatkan angka p dan mencetak bagian-bagian yang dipisahkan oleh titik.

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
sumber
1

Python 2, 92 Bytes

Saat saya sekarang melihat jawabannya, sepertinya jawaban CJam menggunakan metode dasar yang sama seperti ini. Ini menghitung jawaban untuk n*10**pdan kemudian menambahkan dalam titik desimal. Ini sangat tidak efisien karena cara menghitung bagian integer dari akar kuadrat (hanya menambahkan 1 sampai tiba di sana).

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
sumber
1

PHP, 85 78 byte

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

Ini menggunakan ekstensi matematika BC Math yang, pada beberapa sistem, tidak dapat tersedia. Itu perlu dimasukkan pada waktu kompilasi dengan menentukan --enable-bcmathopsi baris perintah. Itu selalu tersedia di Windows dan tampaknya itu termasuk dalam versi PHP yang dibundel dengan OSX juga.

Perbarui :

Saya menerapkan semua peretasan yang disarankan oleh @blackhole dalam komentar mereka (terima kasih!) Lalu saya meremas inisialisasi $npenggunaan pertama (3 lebih byte disimpan) dan sekarang kode tersebut cocok dalam satu baris pada kotak kode di atas.

aksioma
sumber
@Lubang hitam. 85, memang. Saya mungkin telah membaca 86 (melakukan pilihan yang sedikit lebih besar) dan menulis 68 karena kesalahan. Diperbaiki sekarang
axiac
1
Tidak masalah :). Anda dapat memiliki 1 byte lebih sedikit dengan cara: menghapus tanda kurung di sekitar echo, cukup sisakan spasi setelahnya.
Blackhole
1
Dan karena Anda berharap bcscaleuntuk kembali true, Anda dapat menggunakan $n=$argv[bcscale($argv[2])];dan menyimpan 2 byte lebih banyak.
Blackhole
Itu hack yang bagus.
axiac
Kekotoran kode adalah suatu seni: P. Oh, yang terakhir: bcpow($n,2)bukannya bcmul($n,$n)menghemat 1 byte.
Blackhole
1

J, 27 Bytes

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

Penjelasan:

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

Sebut saja seperti ini:

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

Solusi lain yang sedikit lebih dingin:

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

Yang menghitung akar polinomial x ^ 2 - nx - 1. Sayangnya, cara J memformat hasil membuat retreving root yang diinginkan sedikit lebih lama.

Bolce Bussiere
sumber