Fraction reduction: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: added zkl header)
(→‎{{header|zkl}}: added code)
Line 2,908: Line 2,908:


=={{header|zkl}}==
=={{header|zkl}}==
{{trans|Phix}}
<lang zkl></lang>
<lang zkl></lang>
<lang zkl>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(",")));
}</lang>
{{out}}
{{out}}
<pre>
<pre>
16/64 --> 1/4 (removed 6)
19/95 --> 1/5 (removed 9)
26/65 --> 2/5 (removed 6)
49/98 --> 4/8 (removed 9)
2-digit fractions found: 4, omitted 0,0,0,0,0,2,0,0,2


132/231 --> 12/21 (removed 3)
134/536 --> 14/56 (removed 3)
134/938 --> 14/98 (removed 3)
136/238 --> 16/28 (removed 3)
138/345 --> 18/45 (removed 3)
139/695 --> 13/65 (removed 9)
143/341 --> 13/31 (removed 4)
146/365 --> 14/35 (removed 6)
149/298 --> 14/28 (removed 9)
149/596 --> 14/56 (removed 9)
149/894 --> 14/84 (removed 9)
154/253 --> 14/23 (removed 5)
3-digit fractions found: 122, omitted 0,0,9,1,6,15,16,15,60

1234/4936 --> 124/496 (removed 3)
1239/6195 --> 123/615 (removed 9)
1246/3649 --> 126/369 (removed 4)
1249/2498 --> 124/248 (removed 9)
1259/6295 --> 125/625 (removed 9)
1279/6395 --> 127/635 (removed 9)
1283/5132 --> 128/512 (removed 3)
1297/2594 --> 127/254 (removed 9)
1297/3891 --> 127/381 (removed 9)
1298/2596 --> 128/256 (removed 9)
1298/3894 --> 128/384 (removed 9)
1298/5192 --> 128/512 (removed 9)
4-digit fractions found: 660, omitted 14,25,92,14,29,63,16,17,390

12349/24698 --> 1234/2468 (removed 9)
12356/67958 --> 1236/6798 (removed 5)
12358/14362 --> 1258/1462 (removed 3)
12358/15364 --> 1258/1564 (removed 3)
12358/17368 --> 1258/1768 (removed 3)
12358/19372 --> 1258/1972 (removed 3)
12358/21376 --> 1258/2176 (removed 3)
12358/25384 --> 1258/2584 (removed 3)
12359/61795 --> 1235/6175 (removed 9)
12364/32596 --> 1364/3596 (removed 2)
12379/61895 --> 1237/6185 (removed 9)
12386/32654 --> 1386/3654 (removed 2)
5-digit fractions found: 5087, omitted 75,40,376,78,209,379,591,351,2988
</pre>
</pre>