(phixonline)-->
with javascript_semantics
atom t0 = time()
function bump(sequence half) -- (exactly the same as above)
-- add a digit to valid halves
-- eg {0} --> {1..9} (no zeroes)
-- --> {11..99} ("")
-- --> {111..999}, etc
sequence res = {}
for i=1 to length(half) do
integer hi = half[i]*10
for digit=1 to 9 do
res &= hi+digit
end for
end for
return res
end function
sequence half = {0} -- valid digits, see bump()
integer hlen = 1,
cpow = 10 -- cyclops power (of 10)
integer n = 1_000_000_000
atom hlen2 = 1
while n>hlen2 do
n -= hlen2
half = bump(half)
hlen = length(half)
hlen2 = power(hlen,2)
cpow *= 10
end while
integer left = floor(n/hlen)+1, -- half[] before the 0
right = remainder(n,hlen)+1 -- half[] after the 0
string fmt = "The 1,000,000,000th cyclops number is %d (%s)\n",
e = elapsed(time()-t0)
printf(1,fmt,{half[left]*cpow+half[right],e})