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

101 lines
1.6 KiB
Plaintext

text
next(text s, integer show)
{
integer l;
record v;
data d;
text u;
l = length(s);
while (l) {
integer e;
l -= 1;
e = 0;
u = insert("", 0, character(s, l));
r_g_integer(e, v, u);
r_f_integer(v, u, e + 1);
}
if (r_last(v, u)) {
do {
b_paste(d, -1, itoa(r_q_integer(v, u)));
b_paste(d, -1, u);
} while (r_less(v, u, u));
}
if (show) {
o_text(b_string(d));
o_newline();
}
return b_string(d);
}
integer
depth(text s, integer i, record r)
{
integer d;
d = 0;
r_g_integer(d, r, s);
if (d <= 0) {
i += 1;
if (d) {
d += i;
} else {
d = -i;
}
r_f_integer(r, s, d);
i = depth(next(s, 0), i, r);
d = r_q_integer(r, s);
if (d <= 0) {
d = i + 1;
r_r_integer(r, s, d);
}
}
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_text(cat3("longest length is ", itoa(d), "\n"));
while (l_length(l)) {
text s;
o_newline();
r_clear(r);
lf_e_integer(i, l);
o_integer(i);
o_newline();
e = d - 1;
s = itoa(i);
while (e) {
s = next(s, 1);
e -= 1;
}
}
return 0;
}