Yaklaşık Dottie numarası


17

Benekli numarası kosinüs fonksiyonu sabit nokta veya denklem çözüm cos (x) = . 1

Senin görevin bu sabit yaklaşık kod yapmak olacaktır. Kodunuz girdi olarak bir tamsayı alan ve gerçek bir sayı çıkaran bir işlevi temsil etmelidir. Girdi büyüdükçe işlevinizin sınırı Dottie numarası olmalıdır.

Bir sayının kesir, ondalık veya cebirsel bir temsili olarak çıktı alabilirsiniz. Çıktınız keyfi olarak hassas olmalı, yüzer ve çiftler bu zorluk için yeterli değildir. Diliniz rasgele kesinlik sayılarına sahip değilse, bunları uygulamalısınız veya yeni bir dil seçmelisiniz.

Bu bir sorusudur, bu nedenle cevaplar bayt cinsinden puanlandırılacak, daha az bayt daha iyi olacaktır.

İpuçları

Sabiti hesaplamanın bir yolu, herhangi bir sayı almak ve kosinüsü ona tekrar tekrar uygulamaktır. Uygulama sayısı sonsuza doğru gittikçe, sonuç kosinüsün sabit noktasına doğru yönelir.

İşte sayının oldukça doğru bir yaklaşımı.

0.739085133215161

1: Burada kosinüsü radyan olarak alacağız


Peki, Python kullanıyorsanız, kendi tipimizi veya ithalatımızı uygulamalıyız Decimal?
Bay Xcoder

Gönderimlerimiz ne kadar doğru olmalıdır?
Bay Xcoder

ÆẠȷ¡Geçersiz olduğunu fark etmek için Jelly öğreticisine gider. Brachylog'u dener; Ah hiçbir Brachylog şamandıra bile yapmaz.
Outgolfer Erik

1
Ben "keyfi kesin" gereksinimi biraz çok sıkı gibi hissediyorum. Bir cevabı neden bir kez geçerli saymıyorsunuz x=cos(x)?
kamoroso94

2
Bunu Haskell, APL ve bazı Lisp lezzetlerinde görmek istiyorum.
Mark C

Yanıtlar:


8

MATL , 34 30 19 bayt

Sanchises sayesinde 11 bayt kapalı !

48i:"'cos('wh41hGY$

Çıktıdaki son ondalık sayılar kapalı olabilir. Bununla birlikte, soldan başlayan doğru rakamların sayısı girişle artar ve sonuç gerçek sabite yakınsar.

Çevrimiçi deneyin!

açıklama

N girişi için ve x = 1'den başlayarak , bu işlev uygulanır

              x ↦ cos ( x )

ile n -digit değişken duyarlıklı aritmetik n zamanlarda.

48         % Push 48, which is ASCII for '1': initial value for x as a string
i:"        % Do n times, where n is the input
  'cos('   %   Push this string
  w        %   Swap. Moves current string x onto the top of the stack
  h        %   Concatenate
  41       %   Push 41, which is ASCII for ')'
  h        %   Concatenate. This gives the string 'cos(x)', where x is the
           %   current number
  GY$      %   Evaluate with variable-prevision arithmetic using n digits
           %   The result is a string, which represents the new x
           % End (implicit). Display (implicit). The stack contains the last x

1
Neden sadece n basamak hassasiyetinde n kez uygulama? Bu çok karmaşık görünüyor.
Sanchises

1
Bu inanılmaz. APL'de görmek istiyorum.
Mark C


5

GNU bc -l, 30

Skor, -lişaretlemek için +1 içerir bc.

for(a=1;a/A-b/A;b=c(a))a=b
a

Son satırsonu önemli ve gereklidir.

Çevrimiçi deneyin .

-l 2 şey yapar:

  • c()cos (x) dahil olmak üzere "math" kütüphanesini etkinleştir
  • hassasiyeti (ölçek) 20 ondalık basamağa ayarlar ( bcrastgele hassasiyet hesaplamasına sahiptir)

Hassasiyet gereksinimi konusunda net değilim. Olduğu gibi, bu program 20 ondalık basamak hesaplar. Farklı bir hassasiyet gerekiyorsa, scale=n;programın başlangıcına yerleştirilmelidir, nondalık basamak sayısı. Bunu puanıma eklemem gerekip gerekmediğini bilmiyorum.

Ayrıca, bazı ondalık basamak sayıları için (örneğin, 21, ancak 20 değil), hesaplamanın, son basamaktaki çözeltinin her iki tarafından salındığını da unutmayın. Böylece, mevcut ve önceki yinelemelerin karşılaştırılmasında A, son basamağı silmek için her iki tarafı da 10 ( ) bölerim.



4

dzaima / APL , 55 bayt

⎕←⊃{⍵,⍨-/P,((P÷⍨×)/¨(2×⍳N)⍴¨⊃⍵)÷!2L×⍳N}⍣{⍵≢∪⍵}P10L*N←⎕

Büyük tamsayı (büyük ondalık yok!) Aritmetiği (burada , a'nın eşdeğeridir ) kullanarak, Taylor serisinin ilk terimini yineleyin (aşırı tahmin, ancak bu iyi), yinelenene kadar. Sonunda hassasiyet kaybı nedeniyle biraz kapalı olabilir, ancak diğer cevaplarda olduğu gibi, bu farklar daha yüksek ile kaybolacaktır .10N N N1NN

TIO'nun dzaima / APL'si olarak TIO bağlantısı biginteger'ları destekleyecek şekilde güncellenmedi.

Örnek G / Ç:

1
9L

10
7390851332L

100
7390851332151606416553120876738734040134117589007574649656806357732846548835475945993761069317665318L

200
73908513321516064165531208767387340401341175890075746496568063577328465488354759459937610693176653184980124664398716302771490369130842031578044057462077868852490389153928943884509523480133563127677224L

3

R (+ Rmpfr), 55 bayt

function(n,b=Rmpfr::mpfr(1,n)){for(i in 1:n)b=cos(b);b}

Dennis şimdi TIO'ya Rmpfr ekledi, bu yüzden bu işe yarayacak; bazı test senaryoları ekledi.

Açıklama:

Ben den yazdım kodu Alır bu meydan değerlendirmek cos nbaşlayan kez 1, ama önce ben değerleri bir nesne oluşturarak olmasını istediğiniz hassasiyet belirtmek bsınıfın mpfrdeğeri ile 1ve hassas n, n>=2biz ilerledikçe daha hassas olsun.

Çevrimiçi deneyin!


3
Tekrar deneyin. :) Gelecekte, TIO'da bir şey eksikse, talk.tryitonline.net'e bir mesaj bırakmaktan çekinmeyin .
Dennis

@Dennis Teşekkürler! Gelecekte bunu aklımda tutacağım!
Giuseppe


3

K: 6 bayt

  _cos/1
0.7390851

f/fsabit bir noktaya ulaşıncaya kadar uygulanır .


bu k hangi versiyonu? _biliyorum çoğu versiyonu zemin. k4 ve OK içinde sizinle 5 bayt alabilirsinizcos/1
scrawl

K3. Built-in orada bir alt çizgi ile başlar.
teğet fırtınası

2
ilginç! vahşi doğada k3 görmedim. Bu forumda kullanılan birkaç sürümden daha fazlası olduğu gibi etiketlemeye değer olabilir :)
scrawl

Dyalog APL çözümü geçersiz kabul edilirse, olduğu gibi, bu aynı zamanda geçersiz kabul edilmelidir tam olarak aynı algoritma.
Jeff Zeitlin



2

Pyth , 57 54 bayt

u_.tG1lX$globals()$"neg"$__import__("decimal").Decimal

Ondalık değerlere ihtiyaç duymamıza gerek kalmazsa bu çok daha kısa olurdu, ama ne olduğu budur.

Yine de bir sayıya ihtiyacımız olduğu için 1: -3 bayt düzenleyin, böylece Xs döndürülen globals()uzunluk kopyasını başlangıç ​​değerimiz olarak kullanabiliriz, sonuna taşıyabiliriz ve a $ve bazı boşlukları kaldırabiliriz.

Çevrimiçi deneyin!


2

APL (Dyalog Unicode) , 9 bayt

2○⍣=1

Çevrimiçi deneyin!

( Not: TIO'nun ek bir özelliği vardır ⎕←; bu TIO için gereklidir. “Bağımsız” APL yorumlayıcısı yukarıda gösterilen ifadeyi kullanır. Belirtilen bayt sayısı, TIO'nun ifadesi için hesapladığı, yukarıdaki ifade için hesapladığı değerdir ⎕←. )

Ayrışma / Açıklama:

2○⍣=1
            Apply repeatedly the function...
2           ...cosine of x (in radians), such that...
    1        ...the initial value of x is 1, and...
   =         ...if cos x is NOT equal to x, then re-evaluate, substituting cos x for x...
             ...until they ARE equal.

Cos x (2 ○ x) işlevi ilk değerlendirildiğinde, x = 1 ile eşit olmazlar. cos 1 0,5403'tür, bu yüzden 1'i 0,5403 ... ile değiştirin ve x = 0,73908 için gerçekleşen (2 ○ x) = x olana kadar işlemi tekrarlayın.

Bunu yaratırken, printingPP ← kullanarak APL'de ayarlanabilen "baskı hassasiyeti" için varsayılan değeri kullandım; Dyalog APL'nin izin verdiği ⎕PP için maksimum değer 34 basamaktır.

Ayrıca, bu uygulama için varsayılan kesinlik 64-bit kayan değerdir; ←FR ← 1287 ayarlanarak 128-bit float kullanılabilir. TIO hesaplaması 64 bit şamandıralarla yapılır.

Bir bilgisayar dilinin gerçek bir uygulaması gerçekten keyfi bir hassasiyet veremez; Ancak teorik APL için kod vermedi Keyfi hassas uygulamak olacaktır tam olarak aynı .


Bu 5 bayt.
Adam

Sohbette belirttiğiniz gibi, bu bir NARS2000 çözümü olmalı, Dyalog'da geçersiz. Daha sonra, bu girişi uygun bir giriş yapmak için, girdiyi ayarlamalı ⎕CT←0ve muhtemelen atamalısınız ⎕FPC.
dzaima

1
Bu, spesifikasyonun gerektirdiği keyfi hassasiyeti desteklemez:Your output should be capable of being arbitrarily precise, floats and doubles are not sufficient for this challenge.
Grimmy

1
@ Adám Bu cevap geçersiz; yukarıdaki Grimmy'nin yorumuna bakın. dzaima'nın çözümü işe yarayacaktı ama ilk değil.
SS Anne

1
@JeffZeitlin Cevabınız hala geçersiz. Rasgele hassasiyetin nasıl imkansız olduğuna dair (açıkça yanlış) bir açıklama eklemek yardımcı olmaz. Karşılaştırma için geçerli bazı cevaplara bakmayı deneyin .
Grimmy

2

JavaScript (Node.js) , 84 bayt

n=>"0."+(F=(J,Z=c=0n)=>J?F(J*-I*I/++c/++c/B/B,Z+J):I-Z>>2n?(I=Z,F(B)):I)(B=I=10n**n)

Çevrimiçi deneyin!

Kabaca n-1basamak hassasiyeti vardır . BigInt kullanılır ve cos(x)Taylor genişlemesi kullanılarak hesaplanır. I-Z>>2nBölüm (4 bayt bir maliyetle ve bazı hassasiyetle) sonsuza döngü önlemek amacıyla kullanılır. Teorik keyfi hassasiyet için uygulanabilir olmasına rağmen, pratik aralık n<63yığın taşmasıdır.

Daha kısa (82 bayt), yığın taşması konusunda endişelenmeyin, ancak çok daha az hassasiyet

n=>"0."+eval("for(I=B=10n**n;n--;I=Z)for(Z=J=B,c=0n;J;)Z+=(J=J*-I*I/++c/++c/B/B)")

Çok daha kısa (80 bayt), yığın taşmasına kadar geniş aralık ( n<172), ancak 82 bayt ile aynı hassasiyet.

n=>"0."+(F=(J,Z=c=0n)=>J?F(J*-I*I/++c/++c/B/B,Z+J):n--?(I=Z,F(B)):I)(B=I=10n**n)

Keyfi hassasiyet ana nokta değilse, 25 bayt:

F=n=>n?Math.cos(F(n-1)):1


1

Perl 5, 41 Bayt

use bignum;sub f{$_[0]?cos(f($_[0]-1)):0}

Keyfi hassasiyet için Bignum gereklidir. 0 N'ye tekrarlayan kosinüs tekrarlayan bir fonksiyon f tanımlar.

TIO bignum gibi görünmüyor, bu yüzden bağlantı yok :(


1

Mathematica 44 Bayt

FindRoot[Cos@x-x,{x,0},WorkingPrecision->#]&

FindRoot varsayılan olarak Newton yöntemini kullanır.


1

Python 2, 86 bayt

import math as m,decimal as d
def f(x,n):return f(d.Decimal(m.cos(x)),n-1)if n else x

Yeni sürümü sağlanan ucu kullanarak.

Python 2, 105 bayt

import math as m,decimal as d
def f(x,n):return d.Decimal(f(x+(m.cos(x)-x)/(m.sin(x)+1),n-1))if n else x

Değeri hesaplamak için Newton yöntemini ve özyinelemeli işlevi kullanır . xbaşlangıç ​​değeridir ve nözyineleme sınırıdır.


Python'un yerleşik şamandıra tipi belirsiz bir hassasiyete sahiptir, bu nedenle işleviniz aslında asimptotik değildir.
Ad Hoc Garf Hunter

Teşekkürler, bilmek güzel. Sanırım artık çok kısa değil tho :)
düzeltildi

Soruda verilen ipucu muhtemelen Newton'un yönteminden daha kısa olacaktır.
Ad Hoc Garf Hunter

Tekrar teşekkürler, sanırım süslü matematikten çok etkilendim.
SydB

İşlevin ngereksinim başına yalnızca 1 bağımsız değişken alması gerekir , bu nedenle varsayılan ayar yapmanız gerekir x=0. Ayrıca math.cossabit hassasiyet olduğundan bu fonksiyon keyfi değildir .
Surculose Balgam

1

Aksiyom, 174 bayt

f(n:PI):Complex Float==(n>10^4=>%i;m:=digits(n+10);e:=10^(-n-7);a:=0;repeat(b:=a+(cos(a)-a)/(sin(a)+1.);if a~=0 and a-b<e then break;a:=b);a:=floor(b*10^n)/10.^n;digits(m);a)

ungolfed ve yorumladı

-- Input: n:PI numero di cifre
-- Output la soluzione x a cos(x)=x con n cifre significative dopo la virgola
-- Usa il metodo di Newton a_0:=a  a_(n+1)=a_n-f(a_n)/f'(a_n)
fo(n:PI):Complex Float==
  n>10^4=>%i
  m:=digits(n+10)
  e:=10^(-n-7)
  a:=0     -- Punto iniziale
  repeat
     b:=a+(cos(a)-a)/(sin(a)+1.)
     if a~=0 and a-b<e then break
     a:=b
  a:=floor(b*10^n)/10.^n
  digits(m)
  a

Sonuçlar:

(3) -> for i in 1..10 repeat output[i,f(i)]
   [1.0,0.7]
   [2.0,0.73]
   [3.0,0.739]
   [4.0,0.739]
   [5.0,0.73908]
   [6.0,0.739085]
   [7.0,0.7390851]
   [8.0,0.73908513]
   [9.0,0.739085133]
   [10.0,0.7390851332]
                                                               Type: Void
           Time: 0.12 (IN) + 0.10 (EV) + 0.12 (OT) + 0.02 (GC) = 0.35 sec
(4) -> f 300
   (4)
  0.7390851332 1516064165 5312087673 8734040134 1175890075 7464965680 635773284
  6 5488354759 4599376106 9317665318 4980124664 3987163027 7149036913 084203157
  8 0440574620 7786885249 0389153928 9438845095 2348013356 3127677223 158095635
  3 7765724512 0437341993 6433512538 4097800343 4064670047 9402143478 080271801
  8 8377113613 8204206631
                                                      Type: Complex Float
                                   Time: 0.03 (IN) + 0.07 (OT) = 0.10 sec

'Tekrarlanan cos (x) yöntemi' den daha hızlı olacağı için Newton yöntemini kullanırdım

 800   92x
1000  153x
2000  379x

burada ilk sütunda rakam sayısı ve ikinci sütunda burada tekrarlanan cos (x) yöntemini kullanmaktan ne kadar hızlı Newton yöntemi daha hızlıdır. Günaydın


0

Stax , 5 bayt

╘ñ[EΩ

Çalıştırın ve hata ayıklayın Açıklama:

1       Push 1 to the stack, this will be our initial variable
 {      Begin block
  |7    Cosine
    }N  Repeat block a number of times specified by the input

2
Bu, spec tarafından gerekli olan keyfi hassasiyeti desteklemez:Your output should be capable of being arbitrarily precise, floats and doubles are not sufficient for this challenge.
Grimmy
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.