43 lines
1.2 KiB
Plaintext
43 lines
1.2 KiB
Plaintext
$ENTRY Go {
|
|
= <ShowHailstone 27>
|
|
<ShowLongest 100000>;
|
|
}
|
|
|
|
Hailstone {
|
|
1 = 1;
|
|
s.N, <Mod s.N 2>: {
|
|
0 = s.N <Hailstone <Div s.N 2>>;
|
|
1 = s.N <Hailstone <+ 1 <* 3 s.N>>>;
|
|
};
|
|
};
|
|
|
|
ShowHailstone {
|
|
s.N, <Hailstone s.N>: e.Seq,
|
|
<Lenw e.Seq>: s.Len s.1 s.2 s.3 s.4 e.X s.D4 s.D3 s.D2 s.D1
|
|
= <Prout 'The hailstone sequence for the number '
|
|
<Symb s.N> ' has ' <Symb s.Len> ' elements,\n'
|
|
'starting with ' s.1 s.2 s.3 s.4
|
|
'and ending with ' s.D4 s.D3 s.D2 <Symb s.D1>'.'>;
|
|
}
|
|
|
|
FindLongest {
|
|
s.Max = <FindLongest s.Max 1 1 1>;
|
|
s.Max s.Max s.Long s.Len = s.Long s.Len;
|
|
s.Max s.Cur s.Long s.Len,
|
|
<Hailstone s.Cur>: e.CurSeq,
|
|
<Lenw e.CurSeq>: s.CurLen e.X,
|
|
<+ s.Cur 1>: s.Next,
|
|
<Compare s.CurLen s.Len>: {
|
|
'+' = <FindLongest s.Max s.Next s.Cur s.CurLen>;
|
|
s.X = <FindLongest s.Max s.Next s.Long s.Len>;
|
|
};
|
|
};
|
|
|
|
ShowLongest {
|
|
s.Max, <FindLongest s.Max>: s.Long s.Len
|
|
= <Prout 'The number < ' <Symb s.Max> ' which has the longest'
|
|
' hailstone sequence is ' <Symb s.Long> '.\n'
|
|
'The length of its Hailstone sequence is '
|
|
<Symb s.Len> '.'>;
|
|
};
|