63 lines
1.5 KiB
Text
63 lines
1.5 KiB
Text
include "cowgol.coh";
|
|
|
|
# Generate the hailstone sequence for the given N and return the length.
|
|
# If a non-NULL pointer to a buffer is given, then store the sequence there.
|
|
sub hailstone(n: uint32, buf: [uint32]): (len: uint32) is
|
|
len := 0;
|
|
loop
|
|
if buf != 0 as [uint32] then
|
|
[buf] := n;
|
|
buf := @next buf;
|
|
end if;
|
|
len := len + 1;
|
|
if n == 1 then
|
|
break;
|
|
elseif n & 1 == 0 then
|
|
n := n / 2;
|
|
else
|
|
n := 3*n + 1;
|
|
end if;
|
|
end loop;
|
|
end sub;
|
|
|
|
# Generate hailstone sequence for 27
|
|
var h27: uint32[113];
|
|
var h27len := hailstone(27, &h27[0]);
|
|
|
|
# Print information about it
|
|
print("The hailstone sequence for 27 has ");
|
|
print_i32(h27len);
|
|
print(" elements.\nThe first 4 elements are:");
|
|
var n: @indexof h27 := 0;
|
|
while n < 4 loop
|
|
print_char(' ');
|
|
print_i32(h27[n]);
|
|
n := n + 1;
|
|
end loop;
|
|
print(", and the last 4 elements are:");
|
|
n := h27len as @indexof h27 - 4;
|
|
while n as uint32 < h27len loop
|
|
print_char(' ');
|
|
print_i32(h27[n]);
|
|
n := n + 1;
|
|
end loop
|
|
print(".\n");
|
|
|
|
# Find longest hailstone sequence < 100,000
|
|
var i: uint32 := 1;
|
|
var max_i := i;
|
|
var len: uint32 := 0;
|
|
var max_len := len;
|
|
while i < 100000 loop
|
|
len := hailstone(i, 0 as [uint32]);
|
|
if len > max_len then
|
|
max_i := i;
|
|
max_len := len;
|
|
end if;
|
|
i := i + 1;
|
|
end loop;
|
|
|
|
print_i32(max_i);
|
|
print(" has the longest hailstone sequence < 100000: ");
|
|
print_i32(max_len);
|
|
print_nl();
|