seq() = {res = List([0, 4, 5, 9]); my(i); nxtcan = Map(); for(i = 0, 9, mapput(nxtcan, i, nxtdigs(i)); ); for(i = 1, 9, nxt([i]); ); listsort(res, 1); res } nxt(v) = { my(i, nd); s = Set(v); if(#s != #v, return); if(s[#s] != v[1], return); nd = mapget(nxtcan, v[#v]); if(#setminus(Set(v[1]), mapget(nxtcan, v[#v])) == 0, listput(res, fromdigits(v)) ); for(i = 1, #nd, nxt(concat(v, nd[i])) ) } nxtdigs(n) = setminus(Set(vector(3, i, (3*n+i-1)%10)), Set(n)) /* from comment from Petros Hadjicostas a 0 is followed by 1 or 2 a 1 is followed by 3, 4, or 5; a 2 is followed by 6, 7, or 8; a 3 is followed by 0, 1, or 9; a 4 is followed by 2 or 3; a 5 is followed by 6 or 7; a 6 is followed by 0, 8, or 9; a 7 is followed by 1, 2, or 3; an 8 is followed by 4, 5, or 6; and a 9 is followed by 7 or 8. */