I recently posted one of my favourite interview whiteboard coding questions in "What's your more controversial programming opinion", which is to write a function that computes Pi using the Leibniz formula.
It can be approached in a number of different ways, and the exit condition takes a bit of thought, so I thought it might make an interesting code golf question. Shortest code wins!
Given that Pi can be estimated using the function 4 * (1 - 1/3 + 1/5 - 1/7 + ...) with more terms giving greater accuracy, write a function that calculates Pi to within 0.00001.
Edit: 3 Jan 2008
As suggested in the comments I changed the exit condition to be within 0.00001 as that's what I really meant (an accuracy 5 decimal places is much harder due to rounding and so I wouldn't want to ask that in an interview, whereas within 0.00001 is an easier to understand and implement exit condition).
Also, to answer the comments, I guess my intention was that the solution should compute the number of iterations, or check when it had done enough, but there's nothing to prevent you from pre-computing the number of iterations and using that number. I really asked the question out of interest to see what people would come up with.
J, 14 chars
Explanation
1e6
is number 1 followed by 6 zeroes (1000000).i.y
generates the firsty
non negative numbers.+:
is a function that doubles each element in the list argument.>:
is a function that increments by one each element in the list argument.So, the expression
>:+:i.1e6
generates the first one million odd numbers:%
is the reciprocal operator (numerator "1" can be omitted).-/
does an alternate sum of each element in the list argument.So, the expression
-/%>:+:i.1e6
generates the alternate sum of the reciprocals of the first one million odd numbers:4*
is multiplication by four. If you multiply by four the previous sum, you have π.That's it! J is a powerful language for mathematics.
Edit: since generating 9! (362880) terms for the alternate sum is sufficient to have 5 decimal digit accuracy, and since the Leibniz formula can be written also this way:
...you can write a shorter, 12 chars version of the program:
Haskell
I got it down to 34 characters:
This expression yields 3.141596416935556 when evaluated.
Edit: here's a somewhat shorter version (at 33 characters) that uses foldl1 instead of foldl:
Edit 2: 9^6 instead of 10^6. One has to be economical ;)
Edit 3: Replaced with foldl' and foldl1' with foldl and foldl1 respectively—as a result of Edit 2, it no longer overflows. Thanks to ShreevatsaR for noticing this.
F# (Interactive Mode) (59 Chars)
(Yields a warning but omits the casts)
52 chars in Python:
(51 dropping the 'x' from xrange.)
36 chars in Octave (or Matlab):
(execute "format long;" to show all the significant digits.) Omitting 'disp' we reach 30 chars:
common lisp, 55 chars.
Ruby, 41 chars (using irb):
Or this slightly longer, non-irb version:
This is a modified Leibniz: