RosettaCodeData/Task/Self-referential-sequence/Aime/self-referential-sequence.aime

77 lines
1.1 KiB
Plaintext

text
next(text s)
{
integer c, e, l;
index v;
data d;
l = ~s;
while (l) {
v[-s[l -= 1]] += 1;
}
for (c, e in v) {
b_form(d, "%d%c", e, -c);
}
return d;
}
integer
depth(text s, integer i, record r)
{
integer d;
d = 0;
r_j_integer(d, r, s);
if (d <= 0) {
i += 1;
d += d ? i : -i;
r[s] = d;
i = depth(next(s), i, r);
d = r[s];
if (d <= 0) {
r[s] = d = i + 1;
}
}
return d;
}
integer
main(void)
{
integer d, e, i;
record r;
list l;
d = 0;
i = 1000000;
while (i) {
i -= 1;
e = depth(itoa(i), 0, r);
if (e == d) {
lb_p_integer(l, i);
} elif (d < e) {
d = e;
l_clear(l);
lb_p_integer(l, i);
}
}
o_("longest length is ", d, "\n");
while (l_o_integer(i, l, 0)) {
text s;
o_("\n", i, "\n");
e = d - 1;
s = itoa(i);
while (e) {
o_(s = next(s), "\n");
e -= 1;
}
}
return 0;
}