Yüksek Hassasiyetli Metalik Araçlar


13

Arka fon

Metalik araçlar , ünlü başlayarak altın ortalama , her bir doğal sayı (pozitif tamsayı) için tanımlandığı gibidir, ve her biri, bir akıl sabiti (sonsuz bir tekrarlamayan ondalık genişleme vardır).

Doğal bir sayı için , metalik ortalama ikinci dereceden bir denklemin köküdür

Kökler daima

ancak metalik ortalama genellikle pozitif kök olarak verilir. Yani bu soru için şu şekilde tanımlanacaktır:

İçin sonucu ünlü altın orandır:


Meydan okuma

Kodunuz 2 giriş almalıdır: n ve p (tutarlı olduğu sürece sipariş önemli değildir)

  • n, hangi metalik ortalama anlamına gelen doğal bir sayıdır
  • p, kaç ondalık basamak hassasiyet yerini gösteren doğal bir sayıdır

Kodunuz ondalık basamak hassasiyetini sağlamak için n'inci metalik ortalama çıktısını vermelidir.

Geçerlilik

Kodunuz, 1'den 65.535'e kadar n ve p değerleri için çalışıyorsa geçerlidir.

Formda bir ondalık sayı vermelisiniz

basamak (lar) (boşluklar olmadan)

Örneğin, 9 ondalık basamağın altın ortalaması

1,618033988

Son basamağı daha uzun ondalık genişlemede göründüğü gibi yuvarlamadan görüntüler. Altın ortalamadaki bir sonraki rakam 7'dir, ancak örnekteki son 8, 9'a yuvarlanmamalıdır.

Ondalık basamak sayısı p olmalıdır, yani sondaki sıfırlar da dahil edilmelidir.

Formun cevapları

geçerli değil - ondalık genişletme kullanmalısınız.

En fazla 1 önde gelen yeni satır ve en fazla 1 son satır için çıktı alabilirsiniz. Rakamlar ve tek nokta / tam durdurma / nokta dışında boşluk veya başka karakter çıktısı alamazsınız.

Puan

Bu standart kod golf: puanınız kodunuzdaki bayt sayısıdır.


Liderler Sıralaması

( Martin skor tablosu snippet'ini kullanma )

Yanıtlar:


17

dc, 12

?kdd*4+v+2/p
  • ? N ve p'yi yığının üzerine itin
  • k hassasiyeti p olarak ayarlayın
  • dd n'yi iki kez kopyala (toplam üç kopya)
  • * n * n ile çarp
  • 4+ 4 ekle
  • v karekök almak
  • + n ekle (yığındaki son kopya)
  • 2/ 2'ye böl
  • p Yazdır

Test durumu:

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

7
İş için doğru araç.
Dennis

5
@Dennis, CJam'in başka bir şeyden yaklaşık 3 kat daha uzun olduğu ilk kez olmalı ;-)
Digital Trauma

2

R, 116 bayt

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

Bu, STDIN'den iki tamsayıyı okur ve sonucu STDOUT'a yazdırır. Şunları yapabilirsiniz çevrimiçi denemek .

Ungolfed + açıklaması:

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

Eğer var yoksa Rmpfrkütüphane yüklü yapabilirsiniz install.packages("Rmpfr")ve hayallerinizdeki tüm gerçekleşecek.


1

Mathematica, 50 bayt

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

Anlaşılan nve psırayla anonim bir işlev tanımlar . Ondalık çıktı almak için ihtiyacım olan Flooryuvarlamayı önlemek için kullanıyorum SetAccuracy.


@Arcinde Ne yazık ki makine hassas sayılarını kullanamıyorum çünkü işleyemeyeceklerdi p>15.
2012rcampion

1

CJam, 35 bayt

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

Önce p'yi sonra n'yi okur .

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

Sadece n × 10 p için sorudan formülü hesaplıyoruz, sonucun tamsayı ve kesirli kısmını 10 p'ye bölüyoruz, p basamaklarını elde etmek ve bir nokta ile ayrılmış parçaları yazdırmak için kesirli kısmı önde gelen sıfırlarla dolduruyoruz .

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 Bayt

Şimdi cevaplara baktığım gibi, CJam cevabı bununla aynı temel yöntemi kullanıyor gibi görünüyor. Cevabını hesaplar ve n*10**pondalık noktaya ekler. Karekökün tamsayı kısmını hesaplama şekli nedeniyle inanılmaz derecede verimsizdir (oraya kadar sadece 1 ekleme).

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 bayt

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

Bazı sistemlerde bulunmayan BC Math matematik uzantısını kullanır . Komut satırı seçeneği belirtilerek derleme süresine dahil edilmesi gerekir --enable-bcmath. Her zaman Windows'ta kullanılabilir ve OSX ile birlikte verilen PHP sürümüne de dahil gibi görünüyor.

Güncelleme :

Yorumlarında @blackhole tarafından önerilen tüm kesmekleri uyguladım (teşekkür ederim!) Sonra $nilk kullanımına (3 bayt daha kaydedildi) ilklendirilmesini sıktım ve şimdi kod yukarıdaki kod kutusunda tek bir satıra sığar.


@Kara delik. 85. Muhtemelen 86 (biraz daha büyük bir seçim yaptım) okudum ve yanlışlıkla 68 yazdı. Şimdi düzeltildi.
axiac

1
Sorun değil :). Bu arada 1 bayt daha az olabilir: parantezleri kaldırın, echosonra bir boşluk bırakın.
Kara delik

1
Ve bcscalegeri dönmeyi beklediğiniz için true, $n=$argv[bcscale($argv[2])];2 bayt daha kullanabilir ve kaydedebilirsiniz.
Kara delik

Güzel bir hack.
axiac

Kod kirliliği bir sanattır: S. Ah, sonuncusu: bcpow($n,2)yerine bcmul($n,$n)1 bayt kazandırır.
Kara delik

1

J, 27 Bayt

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

Açıklama:

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

Buna şöyle deyin:

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

Başka, biraz daha soğuk bir çözüm:

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

Bu, polinomun x ^ 2 - nx - 1'in köklerini hesaplar. Ne yazık ki, J'nin sonucu formatlama şekli, istenen kökün biraz daha uzun sürmesini sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.