RosettaCodeData/Task/Fractran/SETL/fractran.setl

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;