Tổng một phần của chuỗi hài!


13

Định nghĩa

Trong Toán học, Chuỗi điều hòa đề cập đến một chuỗi trong đó

Phương trình trình tự hài

tức là số hạng thứ n của chuỗi bằng với nghịch đảo của n .


Giới thiệu

Trong thử thách này, với một số nguyên dương n là đầu vào, xuất ra Tổng một phần của n số hạng đầu tiên của Chuỗi hài.


Đầu vào

Bạn sẽ được cấp một số nguyên dương (trong phạm vi số được hỗ trợ bởi ngôn ngữ của bạn). Nó có thể là Đã ký và Chưa ký (tùy thuộc vào bạn), vì thử thách chỉ yêu cầu số nguyên dương.

Bạn có thể lấy đầu vào theo bất kỳ cách nào ngoại trừ giả sử nó có mặt trong một biến được xác định trước. Đọc từ tệp, thiết bị đầu cuối, cửa sổ phương thức ( prompt()bằng JavaScript), vv được cho phép. Lấy đầu vào là đối số chức năng cũng được cho phép.


Đầu ra

Chương trình của bạn sẽ xuất tổng của n số hạng đầu tiên của Chuỗi điều hòa dưới dạng số float (hoặc số nguyên nếu đầu ra chia hết cho 1) với độ chính xác là 5 số liệu có ý nghĩa, trong đó n đề cập đến đầu vào. Để truyền đạt tương tự trong thuật ngữ toán học, bạn cần tính toán

Chuỗi điều hòa Tổng một phần của n điều khoản đầu tiên

Trong đó n đề cập đến đầu vào.

Bạn có thể xuất ra bằng mọi cách ngoại trừ ghi đầu ra vào một biến. Viết cho màn hình, thiết bị đầu cuối, tệp, cửa sổ phương thức ( alert()bằng JavaScript), vv được cho phép. Xuất ra như returngiá trị chức năng cũng được cho phép.


Quy tắc bổ sung


Các trường hợp thử nghiệm

Các trường hợp thử nghiệm giả sử đầu vào là 1 chỉ mục

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

Tiêu chí chiến thắng

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


Bạn có thể cho chúng tôi một số testcase?
Kritixi Lithos

2
Độ chính xác là cần thiết? Đầu ra chính xác thường chỉ có thể là một phân số, nhưng trong nhiều ngôn ngữ sẽ phải là các số riêng biệt cho tử số và mẫu số. Chúng ta có thể xuất a) một số float, b) một cặp phân số hoặc số nguyên c) không?
Cấp sông St

2
@Arjun Chuỗi điều hòa phát triển đến vô cùng, do đó, sẽ khó có thể đáp ứng 10 vị trí thập phân khi con số lên đến hàng ngàn và hàng triệu. Tôi sẽ đi cho các số liệu quan trọng thay vì số thập phân, và tôi thấy không cần phải chính xác như vậy. 5 con số quan trọng là đủ. nên 9.9999E10chứ không phải99999999999.9999999999
Cấp sông St

Chúng ta có thể đi hơn 5 con số quan trọng?
Erik the Outgolfer

Nhân tiện, người ta biết rằng chuỗi sóng hài không chứa bất kỳ số nguyên nào ngoài a_1 = 1. (Ý tưởng chứng minh rằng a_n không phải là số nguyên cho n> 1: hãy để 2 ^ k là công suất lớn nhất của 2 không vượt quá n; sau đó 2 ^ k chia mẫu số của a_n.)
Greg Martin

Câu trả lời:



9

Python 3, 27 byte

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

Lập chỉ mục 0 hay lập chỉ mục 1?
Arjun

2
Ném RuntimeErrorkhi xử lý đầu vào lớn hơn giới hạn đệ quy, 1000 theo mặc định.
sagiksp

bạn có thể làm sys.setrecursionlimit(473755252663)nhưng ngăn xếp cuối cùng sẽ tràn khá dễ dàng
mèo

@Arjun đó là 1 chỉ mục
shooqie

8

JavaScript, 19 18 byte

Lưu 1 byte nhờ @RickHitchcock

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

Đây là 1 chỉ mục.

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

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


Từ những gì tôi đã thấy của các bài đăng khác, bạn có thể xóa f=khỏi câu trả lời của mình để lưu 2 byte.
Rick Hitchcock

1
@RickHitchcock Tôi không thể xóa f=vì hàm này được đệ quy và nó tự tham chiếu f(--a). Nhưng nếu đây không phải là một giải pháp đệ quy, tôi đã có thể làm điều đó
Kritixi Lithos

Ah, có ý nghĩa! Lưu một byte với f=a=>a&&1/a+f(--a).
Rick Hitchcock

@RickHitchcock Đẹp một!
Kritixi Lithos

6

APL (Dyalog) , 5 byte

+/÷∘⍳

Hãy thử trực tuyến!

Bạn có thể thêm ⎕PP←{number}vào tiêu đề để thay đổi độ chính xác {number}.

Đây là 1 chỉ mục.

Giải trình

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

6

Toán học, 21 20 16 byte

Giải pháp này là 1 chỉ mục.

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

Đó là lập chỉ mục 1
J42161217

1
> Bạn không được sử dụng tích hợp để tính tổng một phần của n phần tử đầu tiên. (Vâng, nó dành cho bạn
Mathicala

4
OP có nghĩa là tôi không thể sử dụng HarmonicNumber [#] &
J42161217

4
Và người ta có thể rút ngắn hơn nữa Tr[1./Range@#]&.
Greg Martin

2
@Ian Mathematica có thể hiển thị 5 sig fig, nhưng hàm trả về các số chính xác của máy (52 bit nhị phân hoặc chỉ dưới 16 chữ số thập phân chính xác)
LLlAMnYP




5

Japt -x , 8 6 5 3 byte

õpJ

Với một số lời cảm ơn đến ETHproductions

Dùng thử trực tuyến


Lập chỉ mục 0 hay lập chỉ mục 1?
Arjun

Tôi nghĩ bạn có thể lưu một byte bằngõ x@1/X
ETHproductions

... và một vài byte khác bằng cách sử dụng XpJthay vì 1/X:-)
Sản phẩm ETH

Cảm ơn, @ETHproductions :) Tôi đã xoay chúng ngay khi tôi bước đi.
Xù xì

Trên thực tế tôi không nghĩ rằng bạn thậm chí cần _do các chức năng tự động. Tôi thực sự nên viết mẹo đó: P (Tôi nên có thời gian hôm nay hoặc ngày mai, vì đó là Ngày Tưởng niệm)
ETHproductions

4

CJam , 11 10 byte

Đã xóa 1 byte nhờ Erik outgolfer

ri),{W#+}*

Điều này sử dụng lập chỉ mục dựa trên 1.

Hãy thử trực tuyến!

Giải trình

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

Bạn có thể sử dụng Wthay vì -1.
Erik the Outgolfer

@EriktheOutgolfer đã vượt qua chính mình :-)
Luis Mendo

@LuisMendo Tôi thích tên của tôi, nó chỉ là một cái tên. Và đúng vậy, tôi đã vượt qua chính mình trong quá trình giúp đỡ một người chơi golf đồng nghiệp hơn nữa.
Erik the Outgolfer

@Erik Đó là một trò đùa. Cảm ơn sự giúp đỡ
Luis Mendo

3

Haskell, 20 byte

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

Giải pháp gốc, 22 byte

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

Những solutios giả định đầu vào 1 chỉ mục.



3

38 byte

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

Đó là một bản hack rất bẩn và các cuộc gọi đệ quy vượt qua các chuỗi ký tự như "5-1-1-1 ..." cho đến khi nó ước tính thành 0.


Cảm ơn @Christopher cho định dạng. Cùng với đó, việc sao chép dấu gạch chéo ngược không còn cần thiết nữa.
avl42

Không vấn đề gì! Có vẻ tốt hơn
Christopher


2

MATL, 5 byte

:l_^s

Giải pháp này sử dụng lập chỉ mục dựa trên 1.

Dùng thử tại MATL Online

Giải trình

    % 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

Tiên đề, 45 34 byte

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

1-Lập chỉ mục; Nó có đối số một số nguyên dương (PI) và trả về "Bất kỳ" mà các sys chuyển đổi (hoặc không chuyển đổi) thành loại hữu ích cho hàm tiếp theo arg (cuối cùng có vẻ như nhìn thấy các ví dụ dưới đây)

(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 byte

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

Sử dụng các số 1 chỉ mục.



1

QBIC , 13 byte

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

Giải trình

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



0

Braingolf, 20 byte [không cạnh tranh]

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

Điều này sẽ không thực sự hoạt động do không có khả năng làm việc với phao, tuy nhiên logic là chính xác.

Giải trình:

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

Đây là một trình thông dịch sửa đổi hỗ trợ float. Đối số đầu tiên là đầu vào.



0

Gol> <> , 8 byte

F1LP,+|B

Hãy thử trực tuyến!

Ví dụ chương trình đầy đủ & Cách thức hoạt động

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.