(phixonline)--> with javascript_semantics function to_n(sequence digits, integer remove_digit=0) if remove_digit!=0 then digits = deep_copy(digits) integer d = find(remove_digit,digits) digits[d..d] = {} end if integer res = digits[1] for i=2 to length(digits) do res = res*10+digits[i] end for return res end function function ndigits(integer n) -- generate numbers with unique digits efficiently -- and store them in an array for multiple re-use, -- along with an array of the removed-digit values. sequence res = {}, digits = tagset(n), used = repeat(1,n)&repeat(0,9-n) while true do sequence nine = repeat(0,9) for i=1 to length(used) do if used[i] then nine[i] = to_n(digits,i) end if end for res = append(res,{to_n(digits),nine}) bool found = false for i=n to 1 by -1 do integer d = digits[i] if not used[d] then ?9/0 end if used[d] = 0 for j=d+1 to 9 do if not used[j] then used[j] = 1 digits[i] = j for k=i+1 to n do digits[k] = find(0,used) used[digits[k]] = 1 end for found = true exit end if end for if found then exit end if end for if not found then exit end if end while return res end function atom t0 = time(), t1 = time()+1 --for n=2 to 6 do for n=2 to 4 do sequence d = ndigits(n) integer count = 0 sequence omitted = repeat(0,9) for i=1 to length(d)-1 do {integer xn, sequence rn} = d[i] for j=i+1 to length(d) do {integer xd, sequence rd} = d[j] for k=1 to 9 do integer yn = rn[k], yd = rd[k] if yn!=0 and yd!=0 and xn/xd = yn/yd then count += 1 omitted[k] += 1 if count<=12 then printf(1,"%d/%d => %d/%d (removed %d)\n",{xn,xd,yn,yd,k}) elsif time()>t1 and platform()!=JS then printf(1,"working (%d/%d)...\r",{i,length(d)}) t1 = time()+1 end if end if end for end for end for printf(1,"%d-digit fractions found:%d, omitted %v\n\n",{n,count,omitted}) end for ?elapsed(time()-t0)