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

77 lines
1.1 KiB
Text
Raw Permalink Normal View History

2013-06-05 21:47:54 +00:00
text
2018-06-22 20:57:24 +00:00
next(text s)
2013-06-05 21:47:54 +00:00
{
2018-06-22 20:57:24 +00:00
integer c, e, l;
index v;
2013-06-05 21:47:54 +00:00
data d;
2018-06-22 20:57:24 +00:00
l = ~s;
2013-06-05 21:47:54 +00:00
while (l) {
2018-06-22 20:57:24 +00:00
v[-s[l -= 1]] += 1;
2013-06-05 21:47:54 +00:00
}
2018-06-22 20:57:24 +00:00
for (c, e in v) {
b_form(d, "%d%c", e, -c);
2013-06-05 21:47:54 +00:00
}
2018-06-22 20:57:24 +00:00
return d;
2013-06-05 21:47:54 +00:00
}
integer
depth(text s, integer i, record r)
{
integer d;
d = 0;
2017-09-23 10:01:46 +02:00
r_j_integer(d, r, s);
2013-06-05 21:47:54 +00:00
if (d <= 0) {
i += 1;
2018-06-22 20:57:24 +00:00
d += d ? i : -i;
r[s] = d;
i = depth(next(s), i, r);
2017-09-23 10:01:46 +02:00
d = r[s];
2013-06-05 21:47:54 +00:00
if (d <= 0) {
2018-06-22 20:57:24 +00:00
r[s] = d = i + 1;
2013-06-05 21:47:54 +00:00
}
}
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);
}
}
2018-06-22 20:57:24 +00:00
o_("longest length is ", d, "\n");
while (l_o_integer(i, l, 0)) {
2013-06-05 21:47:54 +00:00
text s;
2018-06-22 20:57:24 +00:00
o_("\n", i, "\n");
2013-06-05 21:47:54 +00:00
e = d - 1;
s = itoa(i);
while (e) {
2018-06-22 20:57:24 +00:00
o_(s = next(s), "\n");
2013-06-05 21:47:54 +00:00
e -= 1;
}
}
return 0;
}