Harmonik Sekansın Kısmi Toplamı!


13

Tanım

Matematikte Harmonik Dizi ,

Harmonik Dizi Denklemi

yani n, inci dizisine süresi karşılıklı eşit n .


Giriş

Bu meydan okumada, girdi olarak pozitif bir tamsayı n verildiğinde , Harmonik Sekansın ilk n teriminin Kısmi Toplamını verir .


Giriş

Size pozitif bir tamsayı verilir (diliniz tarafından desteklenen sayılar aralığında). Zorluk yalnızca pozitif tamsayılar gerektirdiğinden, İmzalı ve İmzasız olabilir (size bağlıdır).

Girdiyi, önceden tanımlanmış bir değişkente var olduğunu varsaymak dışında herhangi bir şekilde alabilirsiniz. Dosya, terminal, mod penceresinden ( prompt()JavaScript'te) vb. Okumaya izin verilir. Girdinin işlev bağımsız değişkeni olarak alınmasına da izin verilir.


Çıktı

Programınız , Harmonic Sekansının ilk n terimlerinin toplamını bir kayan nokta (veya çıktı 1 ile eşit olarak bölünebiliyorsa tamsayı) olarak 5 önemli rakamın hassasiyetiyle çıkarır; burada n , girdiyi ifade eder. Aynı şeyi Matematiksel jargonda iletmek için,

Harmonik Dizi İlk n terimin Kısmi Toplamı

burada n girdiyi ifade eder.

Çıktıyı bir değişkene yazmak dışında herhangi bir şekilde çıktı alabilirsiniz. Ekrana, terminale, dosyaya, mod penceresine ( alert()JavaScript'te) vb. Yazma izni verilir. Fonksiyon returndeğeri olarak çıkışa da izin verilir.


Ek Kurallar


Test Durumları

Test Durumları, girdinin 1 dizinli olduğunu varsayar

Input     Output
1         1
2         1.5
3         1.8333
4         2.0833
5         2.2833

Kazanan Ölçüt

Bu , yani bayt içindeki en kısa kod kazanır!


Bize biraz testcas verebilir misiniz?
user41805

2
Hangi hassasiyet gereklidir? Kesin çıktı genellikle sadece bir kesir olarak mümkündür, ancak birçok dilde pay ve payda için ayrı sayılar olması gerekecektir. A) bir şamandıra, b) bir kesir veya tamsayı çifti c) çıkarabilir miyiz?
Level River St

2
@Arjun Harmonik seriler sonsuza kadar büyür, böylece sayı binlerce ve milyonlara ulaştıkça 10 ondalık basamağı karşılamak zorlaşır. Ondalık basamaklardan ziyade önemli rakamlara gidecektim ve bu kadar kesin olmaya gerek görmüyorum. 5 önemli rakam yeterli olmalıdır. böylece 9.9999E10yerine99999999999.9999999999
Seviye Nehri St

5 önemli rakamı aşabilir miyiz?
Outgolfer Erik

Bu arada, harmonik dizinin ilk a_1 = 1 dışında bir tamsayı içermediği biliniyor. n; sonra 2 ^ k a_n paydasını böler.)
Greg Martin

Yanıtlar:



9

Python 3, 27 bayt

h=lambda n:n and 1/n+h(n-1)

0-indeksleme veya 1-indeksleme?
Arjun

2
RuntimeErrorVarsayılan olarak 1000 özyineleme sınırından daha yüksek girdi işlenirken atar .
sagiksp

yapabilirsiniz sys.setrecursionlimit(473755252663)ama yığın sonunda oldukça kolay taşacak
kedi

@Arjun 1 endeksli
shooqie

8

JavaScript, 19 18 bayt

@RickHitchcock sayesinde 1 bayt kaydedildi

f=a=>a&&1/a+f(--a)

Bu 1 endekslidir.

f=a=>a&&1/a+f(--a)

for(i=0;++i<10;)console.log(f(i))


Diğer gönderilerde gördüklerimden, f=2 bayt kaydetmek için cevabınızdan kaldırabilirsiniz .
Rick Hitchcock

1
@RickHitchcock f=İşlev özyinelemeli olduğu için kendini kaldıramıyorum f(--a). Ancak bu özyinelemeli bir çözüm olmasaydı, bunu yapabilirdim
user41805

Ah, mantıklı! İle bir bayt kaydedin f=a=>a&&1/a+f(--a).
Rick Hitchcock

@RickHitchcock Güzel bir tane!
user41805

6

APL (Dyalog) , 5 bayt

+/÷∘⍳

Çevrimiçi deneyin!

⎕PP←{number}Hassasiyeti değiştirmek için başlığa ekleyebilirsiniz {number}.

Bu 1 endekslidir.

açıklama

+/÷∘⍳                     Right argument; n
                         Range; 1 2 ... n
  ÷                       Reciprocal; 1/1 1/2 ... 1/n
+/                        Sum; 1/1 + 1/2 + ... + 1/n

6

Mathematica, 21 20 16 bayt

Bu çözüm 1 endekslidir.

Sum[1./i,{i,#}]&

1 endeksleme
J42161217

1
> İlk n öğenin kısmi toplamını hesaplamak için yerleşik bir öğeyi kullanmamalısınız. (Evet, bu senin için Mathematica!)
MCCCS

4
OP, HarmonicNumber'ı kullanamayacağım anlamına geliyor [#] &
J42161217

4
Ve kişi daha da kısaltabilir Tr[1./Range@#]&.
Greg Martin

2
@Ian Mathematica olabilir görüntülemek 5 sig şek, ancak işlevi döner makine hassas sayılar (52, ikili bitler ya da hassas hemen altında 16 ondalık hane)
LLlAMnYP




5

Japt -x , 8 6 5 3 bayt

õpJ

ETHproductions sayesinde biraz

Çevrimiçi deneyin


0-indeksleme veya 1-indeksleme?
Arjun

Bence bir bayt kaydedebilirsinizõ x@1/X
ETHproductions

... ve :-) XpJyerine kullanarak başka bir çift bayt1/X
ETHproductions 2827 '

Teşekkürler, @ETHproductions :) Yürüdüğümde onları dalladım.
Shaggy

Aslında _otomatik işlevler nedeniyle bile ihtiyacınız olduğunu düşünmüyorum . Bu ipucunu gerçekten yazmalıyım: P (Anma Günü olduğu için bugün ya da yarın zamanım olmalı)
ETHproductions 28:17

4

CJam , 11 10 bayt

Outgolfer Erik sayesinde 1 bayt kaldırıldı

ri),{W#+}*

Bu, 1 tabanlı indeksleme kullanır.

Çevrimiçi deneyin!

açıklama

ri            e# Read integer, n
  )           e# Increment by 1: gives n+1
   ,          e# Range: gives [0 1 2 ... n]
    {   }*    e# Fold this block over the array
     W#       e# Inverse of a number
       +      e# Add two numbers

Bunun Wyerine kullanabilirsiniz -1.
Outgolfer Erik

@EriktheOutgolfer kendini geride bıraktı :-)
Luis Mendo

@LuisMendo İsmimi beğendim, sadece bir isim. Ve evet, bir golfçü golfüne daha da yardım etme sürecinde kendimi geride bıraktım.
Outgolfer Erik

@Erik Şaka demekti. Yardımınız için teşekkürler
Luis Mendo

3

Haskell, 20 bayt

f 0=0
f n=1/n+f(n-1)

Orijinal çözüm, 22 bayt

f n=sum[1/k|k<-[1..n]]

Bu çözümler 1 dizinli girdi varsayar.



3

Tcl 38 bayt

proc h x {expr $x?1./($x)+\[h $x-1]:0}

Bu çok kirli bir saldırı ve yinelemeli çağrılar 0 olarak değerlendirilene kadar "5-1-1-1 ..." gibi değişmez dizeleri geçirir.


Biçimlendirme için @Christopher'a teşekkürler. Bununla, ters eğik çizginin kopyalanması artık gerekli değildi.
avl42

Sorun değil! Daha iyi görünüyor
Christopher


2

MATL, 5 bayt

:l_^s

Bu çözüm 1 tabanlı indeksleme kullanır.

MATL Online'da deneyin

açıklama

    % Implicitly grab input (N)
:   % Create an array from [1...N]
l_^ % Raise all elements to the -1 power (take the inverse of each)
s   % Sum all values in the array and implicitly display the result

2

Aksiyom, 45 34 bayt

f(x:PI):Any==sum(1./n,n=1..x)::Any

1-Endeksli; Bir pozitif tamsayı (PI) bağımsız değişkenine sahiptir ve sys'in sonraki işlev arg için yararlı olan türe dönüştürdüğü (veya dönüştürmediği) "nihayet" i döndürür (en sonunda aşağıdaki örneklere bakın)

(25) -> [[i,f(i)] for i in 1..9]
   (25)
   [[1,1.0], [2,1.5], [3,1.8333333333 333333333], [4,2.0833333333 333333333],
    [5,2.2833333333 333333333], [6,2.45], [7,2.5928571428 571428572],
    [8,2.7178571428 571428572], [9,2.8289682539 682539683]]
                                                      Type: List List Any
(26) -> f(3000)
   (26)  8.5837498899 591871142
                                        Type: Union(Expression Float,...)
(27) -> f(300000)
   (27)  13.1887550852 056117
                                        Type: Union(Expression Float,...)
(29) -> f(45)^2
   (29)  19.3155689383 88117644
                                                   Type: Expression Float


1

C, 54 bayt

i;float f(n){float s;for(i=n+1;--i;s+=1./i);return s;}

1 dizinli sayı kullanır.



1

QBIC , 13 bayt

[:|c=c+1/a]?c

açıklama

[ |        FOR a = 1 to
 :            the input n
   c=c+    Add to c (starts off as 0)
   1/a     the reciprocal of the loop iterator
]          NEXT
?c         PRINT c

1

Gol> <> , 8 bayt

F1LP,+|B

Çevrimiçi deneyin!

Örnek tam program & Nasıl çalışır

1AGIE;GN
F1LP,+|B

1AGIE;GN
1AG       Register row 1 as function G
   IE;    Take input as int, halt if EOF
      GN  Call G and print the result as number
          Repeat indefinitely

F1LP,+|B
F     |   Repeat n times...
 1LP,       Compute 1 / (loop counter + 1)
     +      Add
       B  Return



0

Braingolf, 20 bayt [rakip olmayan]

VR1-1[1,!/M,$_1+]v&+

Braingolf'un şamandıralarla çalışamaması nedeniyle bu işe yaramayacaktır, ancak mantık doğrudur.

Açıklama:

VR1-1[1,!/M,$_1+]v&+   Implicit input
VR                     Create new stack and return to main stack
  1-                   Decrement input
    1                  Push 1
     [..........]      Loop, always runs once, then decrements first item on stack at ]
                       Breaks out of loop if first item on stack reaches 0
      1,!/             Push 1, swap last 2 values, and divide without popping
                       Original values are kept on stack, and result of division is pushed
          M,$_         Move result of division to next stack, then swap last 2 items and
                       Silently pop last item (1)
              1+       Increment last item on stack
                 v&+   Move to next stack, sum entire stack 
                       Implicit output of last item on current stack

İşte şamandıraları destekleyen değiştirilmiş bir tercüman . İlk argüman girdi.


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.