func is_self_number(n) { if (n < 30) { return (((n < 10) && (n.is_odd)) || (n == 20)) } var qd = (1 + n.ilog10) var r = (1 + (n-1)%9) var h = (r + 9*(r%2))/2 var ld = 10 while (h + 9*qd >= n%ld) { ld *= 10 } var vs = idiv(n, ld).sumdigits n %= ld 0..qd -> none { |i| vs + sumdigits(n - h - 9*i) == (h + 9*i) } } say is_self_number.first(50).join(' ')