RosettaCodeData/Task/Fractran/Refal/fractran.refal

79 lines
1.6 KiB
Plaintext

$ENTRY Go {
, <Prog <PrimeProgram>>: e.Prog
= <Prout <FracRun 15 (2) e.Prog>>
<Prout <FracPrimes 20 (2) e.Prog>>;
};
PrimeProgram {
= '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';
};
FracPrimes {
0 e.X = ;
s.I (e.N) e.P,
<FracStep (e.N) e.P>: Next e.N2,
<FracPrime e.N>: {
T s.N = s.N <FracPrimes <- s.I 1> (e.N2) e.P>;
F = <FracPrimes s.I (e.N2) e.P>;
};
};
FracPrime {
(1) 1 = F;
(s.N) 1 = T s.N;
(s.N) e.X, <Divmod (e.X) 2>: {
(e.X2) 0 = <FracPrime (<+ 1 s.N>) e.X2>;
e.Z = F;
};
e.X = <FracPrime (0) e.X>;
};
FracRun {
0 e.X = ;
s.I (e.N) e.P, <FracStep (e.N) e.P>: {
Halt = e.N;
Next e.N2 = e.N <FracRun <- s.I 1> (e.N2) e.P>;
};
};
FracStep {
(e.N) = Halt;
(e.N) ((e.Num) e.Denom) e.P,
<Divmod (<Mul (e.N) e.Num>) e.Denom>: {
(e.N2) 0 = Next e.N2;
e.X = <FracStep (e.N) e.P>;
};
};
Prog {
e.X, <Frac e.X>: T (e.F) e.R = (e.F) <Prog e.R>;
e.X = ;
};
Frac {
e.X, <Num e.X>: T (e.N) e.X2,
<SkipWs e.X2>: '/' e.X3,
<Num e.X3>: T (e.D) e.X4 =
T ((e.N) e.D) e.X4;
e.X = F e.X;
};
Num {
e.X, <Span ('0123456789') <SkipWs e.X>>: {
() e.R = F e.R;
(e.N) e.R = T (<Numb e.N>) e.R;
};
};
Span {
(e.M) (e.S) s.C e.X, e.S: e.1 s.C e.2 = <Span (e.M s.C) (e.S) e.X>;
(e.M) (e.S) e.X = (e.M) e.X;
(e.S) e.X = <Span () (e.S) e.X>;
};
SkipWs {
s.C e.X, ' \n\t': e.1 s.C e.2 = <SkipWs e.X>;
e.X = e.X;
};