1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #!/usr/bin/ruby
- # Author: Trizen
- # Date: 23 March 2022
- # https://github.com/trizen
- # Concatenation Coincidence
- # https://projecteuler.net/problem=751
- # Runtime: 0.454s
- func b(n, t) is cached {
- return t if (n == 1)
- floor(b(n-1, t)) * (b(n-1, t) - floor(b(n-1, t)) + 1)
- }
- assert_eq(
- 1..10 -> map {|n| b(n, 2.956938891377988).floor }
- 3..12 -> map { .fib }
- )
- define PREC = 24
- define PREFIX = 2
- func f(t) {
- var terms = []
- 1..PREC -> lazy.while {|k|
- terms << b(k, t).floor
- terms.join.len <= PREC
- }
- var lead = terms.shift
- var dec = Num(terms.join)
- var x = lead+(dec / 10**(dec.ilog10+1))
- say "#{t} <=> #{x}"
- return x
- }
- var theta = bsearch_le(10**PREC, 10**(PREC+1), {|k|
- var t = PREFIX+(k / 10**(k.ilog10+1))
- t <=> f(t)
- })
- say ("Answer: ", Num("#{PREFIX}.#{theta}").round(-PREC))
|