751 Concatenation Coincidence.sf 859 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 23 March 2022
  4. # https://github.com/trizen
  5. # Concatenation Coincidence
  6. # https://projecteuler.net/problem=751
  7. # Runtime: 0.454s
  8. func b(n, t) is cached {
  9. return t if (n == 1)
  10. floor(b(n-1, t)) * (b(n-1, t) - floor(b(n-1, t)) + 1)
  11. }
  12. assert_eq(
  13. 1..10 -> map {|n| b(n, 2.956938891377988).floor }
  14. 3..12 -> map { .fib }
  15. )
  16. define PREC = 24
  17. define PREFIX = 2
  18. func f(t) {
  19. var terms = []
  20. 1..PREC -> lazy.while {|k|
  21. terms << b(k, t).floor
  22. terms.join.len <= PREC
  23. }
  24. var lead = terms.shift
  25. var dec = Num(terms.join)
  26. var x = lead+(dec / 10**(dec.ilog10+1))
  27. say "#{t} <=> #{x}"
  28. return x
  29. }
  30. var theta = bsearch_le(10**PREC, 10**(PREC+1), {|k|
  31. var t = PREFIX+(k / 10**(k.ilog10+1))
  32. t <=> f(t)
  33. })
  34. say ("Answer: ", Num("#{PREFIX}.#{theta}").round(-PREC))