Challenges

Partial Sums of Harmonic Series

+12
−0

Given an positive integer $n$, return the least positive integer $k$ such that the $k$th partial sum of the harmonic series is greater than or equal to $n$. For example, if $n = 2$, then $k = 4$, because $1 + \frac{1}{2} + \frac{1}{3} + \frac{1}{4} = \frac{25}{12} > 2$.

More Input/Output Examples

Input -> Output
1 -> 1
3 -> 11
4 -> 31


This is code-golf, so shortest code wins.

Why does this post require moderator attention?
Why should this post be closed?

+6
−0

Japt, 11 10 bytes

>0©ÒßUÉ/°T


Try it

>0©ÒßUÉ/°T     :Implicit input of integer U
>0             :Greater than 0?
Ò           :Negate the bitwise NOT of (i.e., increment)
ß          :Recursive call with argument
UÉ/       :  U minus 1 divided by ...
°T     :  T (initially 0) prefix incremented
Why does this post require moderator attention?

+5
−0

Raku, 27 bytes

{+([\+](1 X/1..*)...*>=$_)}  Try it online! { } # Anonymous code block [\+]( ) # Get the partial sum of 1 X/ # 1 over each of 1..* # All positive integers ...*>=$_    # Take from the list until it is bigger than the input
+(                      )   # And return the length of the list


This will start to suffer precision issues, but you can add .FatRat to work correctly (but much slower)

Why does this post require moderator attention?

+5
−0

AppleScript, 178 bytes

set n to text returned of (display dialog "" default answer "") as number
set k to 0
set h to 0
repeat
set k to k + 1
set h to h + (1 / k)
if h >= n then exit repeat
end repeat
k


It's really a shame that AppleScript doesn't support explicit stdin.

Why does this post require moderator attention?

+5
−0

Python 3, 35 bytes

f=lambda x,i=1:x>0and-~f(x-1/i,i+1)


Try it online!

Subtracts each 1/i in turn from the initial value until the result is no longer positive.

Why does this post require moderator attention?

+4
−0

Scala, 55 bytes

(Stream from 1 map 1.0./scanLeft.0)(_+_)indexWhere _.<=


Try it online!

Written in a more sane manner:

n => Stream.from(1).map(1.0/_).scanLeft(0.0)(_+_).indexWhere(_ >= n)


Explanation:

(
Stream from 1       //Make an infinite list of integers, starting at 1
map 1.0./         //Find the reciprocal of each (divide 1.0)
scanLeft .0)(_+_) //Sum each partial sequence
indexWhere            //Find the index where
_.<=                  //n (underscore) is less than or equal to a partial sum

Why does this post require moderator attention?

+4
−0

Stax, 9 bytes

Ç≈f♠É↔X+ö


Run and debug it

Explanation(Unpacked):

wii{um|+;<
w          iterate until a falsy result is reached:
ii        push iteration number i twice
{um     map range [1..i] to their reciprocals
|+   sum that list
;< compare to the input(gets popped)
implicit output of top of stack
Why does this post require moderator attention?

+3
−0

JavaScript (Node.js), 47 bytes

f=(a,b=0,c=a=>a&&1/a+c(a-1))=>c(b)<a?f(a,b+1):b


Try it online!

For large numbers, a rounding error will occur and yield incorrect result. The solution below works for any integer (no rounding errors):

93 bytes

f=(a,i=0n,p=a=>g(a)/c(a),g=(a,b=a)=>a&&c(b)/a+g(~-a,b),c=a=>a?a*c(~-a):1n)=>p(i)<a?f(a,-~i):i


Try it online!

Why does this post require moderator attention?

+2
−0

Jelly, 8 bytes

İ€S<¬ʋ1#


Try it online!

How it works

İ€S<¬ʋ1# - Main link. Takes n on the left
ʋ   - Group the previous 4 links into a dyad f(k, n):
€       -   Over each integer 1 to k:
İ        -     Get its reciprocal
S      -   Sum
<     -   Less than n?
¬    -   Logical not
1# - Find the first integer k ≥ n such that f(k, n) is true
Why does this post require moderator attention?

+1
−0

JavaScript, 29 bytes

f=(n,x=0)=>n>0?f(n-1/++x,x):x


Try it online!

Why does this post require moderator attention?

Featured
Hot Posts
Challenges — 1, 2, Fizz, 4, Buzz!

This community is part of the Codidact network. We have other communities too — take a look!

Want to advertise this community? Use our templates!

Like what we're doing? Support us!