140 Modified Fibonacci golden nuggets -- v2.sf 927 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/ruby
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 19 September 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=140
  7. # Runtime: 0.143s
  8. func lucas(n) is cached {
  9. n.is_one ? 1
  10. : (n.is_zero ? 2
  11. : (lucas(n-1) + lucas(n-2)))
  12. }
  13. func fib(n) is cached {
  14. n.is_one ? 1
  15. : (n.is_zero ? 0
  16. : (fib(n-1) + fib(n-2)))
  17. }
  18. func f_even(n) { # 2n
  19. var f1 = fib(n)
  20. var f2 = fib(n+1)
  21. f1 * (3*f1 + f2)
  22. }
  23. func f_odd(n) { # 2n+1
  24. var f1 = fib(n+1)
  25. var l1 = lucas(n)
  26. var f2 = fib(n+2)
  27. var l2 = lucas(n+1)
  28. -((f1+l1) * ((3*(f1+l1))/(f2+l2) + 1)) / (f2 + l2) /
  29. (((f1+l1)**2)/((f2+l2)**2) + ((f1+l1)/(f2+l2)) - 1)
  30. }
  31. var sum = 0
  32. for n in (1..30) {
  33. if (n.is_even) {
  34. sum += f_even(n)
  35. }
  36. else {
  37. sum += f_odd(n)
  38. }
  39. }
  40. say sum