C (N) basamaklı A (N) / B (N) değerini hesaplama


15

Üç sayı dizisini düşünün A, Bve C:

  • A: Yineleme ilişkilerine dayanan f(n) = f(n-1)+f(n-2), ile başlayan bir dizi f(1) = 3, f(2) = 4. Yani, sıra şu şekilde başlar:3 4 7 11 18 29 47 76 ...
  • B: Kompozit sayılar , yani asal olmayan tamsayılar (veya 1):4 6 8 9 10 12 14 15 16 ...
  • C: Pi'nin rakamları: 3 1 4 1 5 9 2 6 5 ...

Pozitif bir tam sayı verilen N < 50fonksiyon bağımsız değişken veya STDIN'den olarak ya fraksiyon ondalık değer iade A(N)/B(N)ile C(N)noktadan sonraki basamak. Yuvarlama için normal kurallar geçerlidir (N + 1'inci basamak 5 veya daha yüksekse yuvarlayın). N'inci basamağı pisıfırsa, bir tam sayı yazdırılmalıdır. bilimsel gösterim / Standart form 1000'den büyük sayılar için kabul edilir.

Bu kod golf, yani bayt en kısa cevap kazanır.

Bazı örnekler:

N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750

Tabii ki, standart kod golf kuralları geçerlidir.

İşlev, herhangi bir modern dizüstü bilgisayarda iki dakikadan daha kısa sürede sona ermelidir.


C(n)Rakam dediğinizde , sondaki 0'ları eklememiz gerekir mi?
Maltysen

Zaman sınırı hangi girdiye uygulanır?
Dennis

@Dennis, hangisine demek istiyorsun N? Öyleyse, N = 49'a kadar. Ya da başka bir şey?
Stewie Griffin

JavaScript'in sınırlı kayan nokta doğruluğu 16'dır. Geçmişte, yanlış sonuçlar almaya başlayacaksınız. Bu iyi mi?
Downgoat

1
@vihan Çözümüm (yayınlanmamış ATM) pi'nin ilk 49 basamağını bir dizede saklar. Ve eğer endişeleniyorsanız, sonuçta 9 basamaktan fazla doğruluğa ihtiyacınız yoktur.
ETHproductions

Yanıtlar:


9

Pyth, 60 57 58 bayt

.[K`.Rchu,eGsGQjT7e.ftPZQ)Je/u+/*GHhyHy^TQr^T3ZZT\0+xK\.hJ

Test donanımı

Oldukça basit - pi, fibonacci serisi ve kompozitleri, C (n) basamaklara yuvarla, pad'den C (n) basamaklara artı ondalık nokta basamaklarının yerini hesaplayın.

A (n): hu,eGsGQjT7

B (n): e.ftPZQ)

Cı (n): e/u+/*GHhyHy^TQr99ZZT

60 -> 57: Pi hesaplamasında n = 1 özel durumu temizledi.

57 -> 58: Tüm giriş aralığı için pi için yeterince yüksek bir öncelik kullanmıyordu - 99 yinelemeyi 1000 yinelemeye yükseltti.

Yuvarlama hakkında not: Bu, Python'un "sonsuzluğa doğru" olarak belirtilen OP yerine "en yakın çift" yuvarlama sistemini kullanır. Bununla birlikte, fark sadece yuvarlama noktasını hemen takip eden rakamlar 5000..., örneğin 1.25, 1 basamağa yuvarlanmışsa önemlidir . Giriş aralığını kontrol ettim ve bu asla olmaz, bu yüzden doğru sonuç her zaman döndürülür.


2

PowerShell, 420 Bayt (ayyyyyyyy) 378 Bayt

param($n);[int[]]$p="03141592653589793238462643383279502884197169399375"-Split'';$a=@(0,3,4);for($i=3;$i-lt50;$i++){$a+=$a[$i-1]+$a[$i-2]};$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111";$b=@(0);for($i=4;$i-le70;$i++){if($c[$i]-eq'1'){$b+=$i}};[double]$r=$a[$n]/$b[$n];$q=$p[$n+1];$s="";(0..($q-1))|%{$s+="0"};([math]::Round($r,$q,[MidpointRounding]::AwayFromZero)).ToString("0.$s")

Sorunun nasıl yuvarlandığını hesaplamak için 41 bayt tasarrufu sağlayan isaacg sayesinde . Ben dehşet verici dahil etmek [MidpointRounding]::AwayFromZerozorunda değildi ve açıkça bir olarak döküm gerek yoktu anlamına gelir [double].

Bu çok eğlenceliydi!

Expanded:

# Take input N
param($n)

# First digits of pi, stored as integer array
[int[]]$p="03141592653589793238462643383279502884197169399375"-Split''

# Fibonacci sequence A(N)
$a=@(0,3,4)
for($i=3;$i-lt50;$i++){
  $a+=$a[$i-1]+$a[$i-2]
}

# Zero-indexed bitmask for if the n-th integer is composite (1) or not (0)
$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111"

# Populate B(N) as an array using the $c mask
$b=@(0)
for($i=4;$i-le70;$i++){
  if($c[$i]-eq'1'){
    $b+=$i
  }
}

# Calculation Time!
$r=(a($n))/$b[$n]

# A small golf, as $p[$n+1] gets used a couple times
$q=$p[$n+1]

# Need to generate a string of zeroes for padding
$s=""
(0..($q-1))|%{$s+="0"}

# Round the number, then send it to a string so we get the necessary number of zeroes
([math]::Round($r,$q)).ToString("0.$s")

PowerShell'de özyineleme ... yavaş, diyelim mi, bu yüzden A(N)diğer yönü oluşturmalı ve bir dizide saklamalıyız, sonra dizine eklemeliyiz.


ESKİ

Ayrıca, kutsal inek, çıktı gereksinimleri bunu öldürdü mü? PowerShell, yuvarlama stillerini[MidpointRounding]::AwayFromZero değiştirmek için olağanüstü ayrıntılı bir şekilde kullanılması gereken varsayılan olarak en yakın a / k / bankacının yuvarlamasını gerektirir . Bunun da ötesinde, eğer varsa, sondaki sıfırları doldurmamız gerekir. Bu iki gereksinimleri gelen hatların son birkaç açmak için kombine 20 Bayt için 102 Bayt (dan için vay ...). [math]::Round($r,$q)$s=""+$s)


Harika açıklama / yorum! 32 karakter [MidpointRounding]::AwayFromZeroyalnız başına neredeyse gerçek olamayacak kadar iyi / kötü ... =)
Stewie Griffin

1
Cevabımda yuvarlama ile ilgili notuma bakın. PowerShell varsayılan yuvarlaması iyi olmalıdır.
isaacg

1

Javascript (ES6), 302 bayt

Tek kelime: Bitmemiş.

x=>{a=[0,3,4],b=[0],c='03141592653589793238462643383279502884197169399375';for(i=1;i<x;a[i+2]=a[i]+a[++i]);for(i=1,p=[];++i<70;v=p.every(x=>i%x),(v?p:b).push(i));r=''+Math.round(a[x]/b[x]*(l=Math.pow(10,c[x])))/l;if(x==33)return r;r.indexOf`.`<0&&(r+='.');while(!r[r.indexOf`.`+ +c[x]])r+='0';return r}

Pi'nin ilk 49 hanesi bir dizede saklanır ve diğer iki dizi otomatik olarak oluşturulur. Bu yaklaşık yarım golf edildi; Bundan 50 bayt daha sıkabileceğime eminim.

Tüm test senaryoları için çalışır ve geri kalanı için çalışmalıdır. 49'dan fazla veya 0'dan daha az bir şeyde çökmeler (bu durumlarla asla karşılaşılmamalıdır). Özellikle 0 sonucunu beğendim:

NaN.

Bu neden bitmemiş?
Beta Çürümesi

@BetaDecay Demek istediğim henüz golf oynamamıştım. En kısa zamanda vaktim olur.
ETHproductions 8:15

1

Oktav, 276 236 Bayt

Her şeyden önce bu matematiksel araçlarda sınırsız doğruluktan faydalanmanın (ve bu konuda bazı bilgileri yenilemenin) harika olacağını düşündüm, bu yüzden bazı algoritmalar yazmaya başladım ve sonunda pideğerin o kadar doğru olmadığını öğrendim. diziyi tekrar kullanmak zorunda kalacak. Yine, büyük bir başarı yok:

function c(A)p="3141592653589793238462643383279502884197169399375";f=ones (1,50);f(1)=3;f(2)=4;for i=3:53f(i)=f(i-1)+f(i-2);end
i=0;x=1;while i<A
x++;for j=2:x/2
if mod(x,j)==0 i++;break;end end end
printf(["%." p(A) "f\n"],f(A)/x);end

Hala okunabilir, değil mi?

kullanım

octave'ye kopyala yapıştır fonksiyonu c, gerekli değer argümanıyla çağrı fonksiyonu :

>>> c(1)
0.750
>>> c(49)
407880480.04348

optimizasyonları:

  • Yedek endif, endforve benzeri endaynı şekilde çalışır ki
  • değişkeni ibir bayt düşürme
  • num2str(str2num(p(A)))saçmalık kaldırmak :)

Bir Octave çözümü yayınlamanı beğendim (kendimi MATLAB'lı bir adamım!). Bu kodun MATLAB değil, sadece Oktav olduğunu unutmayın. MATLAB end, endifkaydedilen çok fazla bayt kullanmıyor . MATLAB için sembolik araç kutunuz da varsa, vpapi: için yeterli ondalık basamak almak için kullanabilirsiniz vpa(sym(pi),49). Ben bu dizüstü bilgisayar var, bu yüzden symorada gerekli olup olmadığından emin değilim , ama yine de oldukça bytes kurtarmak gerekir =) Ve okunabilir mutlaka kodu golf iyi bir şey değildir =)
Stewie Griffin

x ++ aynı zamanda bir MATLAB komutu değildir. İkisi arasında büyük farklar olduğunu bilmiyordum ... IMO, olmamalı. Octave'de yazılan tüm kodların MATLAB'a taşınabilir olması gerektiğini düşünüyorum (ancak MATLAB'ın daha fazla seçeneği olduğu için başka bir şekilde olması gerekmez).
Stewie Griffin

Düzenlemenizi onayladı. Burada matlab'ım yok, bu yüzden test edemedim. Oktavda daha fazla pi ondalık sayıları almak için çözüm arıyordum, ancak hiçbir şey maalesef sadece diziden daha kısa değildi. Ama ommiting whiledan endwhileben :) birkaç daha az karakterden oluşan cevabı güncelliyorum yüzden, ince ve benzeri işleri
Jakuje
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.