fcn toInt(digits,remove_digit=0){ if(remove_digit!=0) digits=digits.copy().del(digits.index(remove_digit)); digits.reduce(fcn(s,d){ s*10 + d }); } fcn nDigits(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. res,digits := List(), n.pump(List(),'+(1)); // 1,2,3,4..n used := List.createLong(n,1).extend(List.createLong(9-n,0)); while(True){ nine:=List.createLong(9,0); foreach i in (used.len()){ if(used[i]) nine[i]=toInt(digits,i+1) } res.append(T(toInt(digits),nine)); found:=False; foreach i in ([n-1..0, -1]){ d:=digits[i]; if(not used[d-1]) println("ack!"); used[d-1]=0; foreach j in ([d..8]){ if(not used[j]){ used[j]=1; digits[i]=j+1; foreach k in ([i+1..n-1]){ digits[k] = used.find(0) + 1; used[digits[k] - 1]=1; } found=True; break; } } if(found) break; }//foreach i if(not found) break; }//while res } foreach n in ([2..5]){ rs,rsz,count,omitted := nDigits(n),rs.len()-1, 0, List.createLong(9,0); foreach i in (rsz){ xn,rn := rs[i]; foreach j in ([i+1..rsz]){ xd,rd := rs[j]; foreach k in ([0..8]){ yn,yd := rn[k],rd[k]; if(yn!=0 and yd!=0 and xn.toFloat()/xd.toFloat() == yn.toFloat()/yd.toFloat()){ count+=1; omitted[k]+=1; if(count<=12) println("%d/%d --> %d/%d (removed %d)".fmt(xn,xd,yn,yd,k+1)); } } } } println("%d-digit fractions found: %d, omitted %s\n" .fmt(n,count,omitted.concat(","))); }