79 lines
1.6 KiB
Plaintext
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;
|
|
};
|