Ters tanjantların toplamının tanjantını bulun


16

Arka fon

Herhangi tamsayı için gösterilebilir k >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))rasyonel sayıdır.

Hedef

Verildiğinde, tek bir azaltılmış kesir (pay ve payda eş zamanlı) k >= 0çıktı veren tam bir program veya işlev yazın f(k).

Test senaryoları

İlk birkaç değer

f(0) = (0,1)
f(1) = (1,1)
f(2) = (-3,1)
f(3) = (0,1)
f(4) = (4,1)
f(5) = (-9,19)
f(6) = (105,73)

kurallar

  • Standart boşluklar yasaktır.
  • Giriş ve çıkış herhangi bir uygun biçimde olabilir. Şunları çıktı f(k)bir dize olarak numerator/denominatoriki tamsayılar bir demet, bir fraksiyonu veya rasyonel bir nesne, vb çıkış dize, sadece iki tamsayı verirsen gibi, çıkış 3/2yerine 1 1/2.
  • Bu kod golf, en kısa cevap (bayt cinsinden) kazanır.

1
Test durumlarınızda giriş / çıkış değerlerinin ne olduğunu belirtebilir misiniz?
Ian H.

1
Tamsayılar derece veya radyan cinsinden mi?
Outgolfer Erik


4
atan(0)Terimi gereksizdir.
Adám

3
@ pizzapants184 f (0) = tan∑∅ = tan 0 = 0
Adám

Yanıtlar:



11

Mathematica, 28 bayt

Fold[+##/(1-##)&,0,Range@#]&

Çevrimiçi deneyin!

Daha uzun ama daha ilginç bir yaklaşım (32 bayt):

Im@#/Re@#&@Product[1+n I,{n,#}]&

Çevrimiçi deneyin!


+1 o'_'oMathematica ve yerleşiklerio'_'o
Bay Xcoder

3
@ Mr.Xcoder Gerçekten bu durumda değil. OP seri toplamını akıllıca kullanıyor (eğer kodu doğru okursam).
Adám

11

Python 2 ,76 72 bayt

from fractions import*
f=lambda k:Fraction(k and(k+f(k-1))/(1-k*f(k-1)))

Kimliğini kullanın:

tan(A + B) = (tan(A) + tan(B)) / (1 - tan(A) * tan(B))

Sahibiz:

f(k) = 0                                    if k = 0
     = (k + f(k - 1)) / (1 - k * f(k - 1))  if k > 0

Çevrimiçi deneyin!

Luis Mendo sayesinde 4 bayt tasarruf edin.


1
Umursamıyorsun: Bir TiO bağlantısı ekledim.
Bay Xcoder

@LuisMendo LGTM, Düzenlendi.
tsh

3

APL (Dyalog) , 14 bayt

Gerektirir ⎕FR←1287( 128 bit F loating noktalı R , küçük giriş için ePresentation). Alır ksağ argüman olarak.

1(∧÷,)3○¯3+.○⍳

Çevrimiçi deneyin!

 bir ile tamsayılar k(0 = arctan 0 olarak sıfır gerekli değildir)

¯3+.○ arcus tanjantlarının toplamı

3○ teğet

1() Aşağıdaki tacit işlevini 1 sol argüman ve yukarıdakileri sağ argüman olarak uygulayın:

 en küçük ortak kat (1 ve doğru argüman); pay verir

÷ bölü

, birleştirme (1 ve doğru argüman); pay ve payda verir



2

JavaScript (ES6), 80 bayt

f=n=>n?([a,b]=f(n-1),g=(a,b)=>a?g(b%a,a):b,c=g(d=b*n+a,e=b-n*a),[d/c,e/c]):[0,1]

Bir [pay, payda] çifti döndürür. Açıklama: Bırak f(n-1) = a/bo zaman f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a). Daha sonra, kesiri en düşük terimlerine indirgemek için kalır.

Çevrimiçi ES6 Ortamı



1

05AB1E , 33 26 bayt

0X)Iƒ©`N*+®`sN*-‚D¿D_i\¤}/

Çevrimiçi deneyin!

açıklama

0X)                          # initialize stack with [0,1]
   Iƒ                        # for N in range [0 ... input] do:
     ©                       # store a copy of the current pair in the register
      `                      # push the pair separately to the stack
       N*                    # multiply the denominator with N
         +                   # add the numerator
          ®`s                # push the denominator then the numerator to the stack
             N*              # multiply the numerator by N
               -             # subtract it from the denominator
                D¿D          # get 2 copies of the greatest common divisor
                   0Qi  }    # if the gcd equals 0
                      \¤     # replace it with the denominator
                         /   # divide the pair with this number


1

Casio-Basic, 35 bayt

tExpand(tan(sum(seq(tan⁻¹(n),n,0,k

tan -1 , Trig klavyesinde bulunan olarak girilmelidir; veya -1 , abc> Math klavyesinden ayrı olarak girilebilir. Fx-CP400'ün el kitabına göre, iki baytlık tek bir karakterdir (764).

İşlev, kod için 34 bayt, kargüman olarak +1 bayt eklemek .

açıklama

seq(tan-1(n),n,0,k)tan-1(n)0 ile k arasındaki tüm değerleri oluşturur .

sumhepsini bir araya toplar, daha sonra tanüzerlerindeki tanjant işlevini yapar.

tExpand daha sonra bunları tek bir kesite dönüştürür.


@ Adám Bu Casio, TI değil, bu yüzden aynı şekilde yapılmıyor.
numbermaniac

Göre Wikipedia , ve ¹iki bayt her biri; E5CCve E5C1.
Adám

@ Eee oh güzel, bu makalenin var olduğunu fark etmedim! Ancak, bu 9860G değil, bir fx-CP400'dür; Sadece kılavuzu kontrol ettim ve üst simge -1 aslında tek bir karakter, kod 764; yani iki baytlık tek bir karakter.
numbermaniac

0

Julia 0.6.0 40 bayt

k->rationalize(tan(sum(x->atan(x),1:k)))

Bu sorunun basit bir uygulamasıdır. Rasyonelleştirmenin hassasiyeti bazen garip olabilir, ancak zamanın% 99'unda iyi çalışır.

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.