53 lines
1.3 KiB
Plaintext
53 lines
1.3 KiB
Plaintext
program fractran;
|
|
p := parse_fractran(
|
|
"17/91 78/85 19/51 23/38 29/33 77/29 95/23 77/19 " +
|
|
"1/17 11/13 13/11 15/14 15/2 55/1"
|
|
);
|
|
|
|
print(frac_run_steps(p, 2, 15));
|
|
print(frac_primes(p, 2, 20));
|
|
|
|
proc frac_primes(p, n, nprimes);
|
|
primes := [];
|
|
loop for i in [1..nprimes] do
|
|
loop until n bit_and (n-1) = 0 do
|
|
n := frac_step(p, n);
|
|
end loop;
|
|
primes with:= log n/log 2;
|
|
end loop;
|
|
return primes;
|
|
end proc;
|
|
|
|
proc frac_run_steps(p, n, steps);
|
|
return [n] + [n := frac_step(p, n) : i in [2..steps]];
|
|
end proc;
|
|
|
|
proc frac_step(p, n);
|
|
if exists [num, denom] in p | n * num mod denom = 0 then
|
|
return n * num div denom;
|
|
end if;
|
|
return om;
|
|
end proc;
|
|
|
|
proc rdws(rw s);
|
|
span(s, " \t\n");
|
|
end proc;
|
|
|
|
proc rdnum(rw s);
|
|
rdws(s);
|
|
return val span(s, "0123456789");
|
|
end proc;
|
|
|
|
proc rdfrac(rw s);
|
|
if (num := rdnum(s)) = om then return om; end if;
|
|
rdws(s);
|
|
if match(s, "/") = "" then return om; end if;
|
|
if (denom := rdnum(s)) = om then return om; end if;
|
|
return [num, denom];
|
|
end proc;
|
|
|
|
proc parse_fractran(s);
|
|
return [f := rdfrac(s) : until f=om];
|
|
end proc;
|
|
end program;
|