Inverse Colombian Function
Haskell, 104 64 63 bytes

(-26 thanks to H.PWiz, additional -14 thanks to Sriotchilism O'Zaic, additional -1 thanks to cole)

This is a function.



f x=[y|y&lt;-[1..],x==until(&gt;=x)(foldr((+).read.pure)&lt;*&gt;show)y]!!0


Try it online!



Explanation:

(foldr((+).read.pure)&lt;*&gt;show)


Sequence of composited functions that returns y+digital sum of y. Converts to string first, then does some monad gymnastics to get the sum of the characters and the original number (thanks to Cole).

The &lt;*&gt; operator in this context has type and definition

(&lt;*&gt;) :: (a -&gt; b -&gt; c) -&gt; (a -&gt; b) -&gt; c
f &lt;*&gt; g = \x -&gt; f x (g x)


so we can write the above as

\x -&gt; foldr ((+) . read . pure) x (show x)


This read . pure converts a Char into a number, so (+) . read . pure :: Char -&gt; Int -&gt; Int adds a digit to an accumulated value. This value is initialized to the given number in the fold.

until (&gt;=x) {- digital sum function -} y


until repeatedly applies a function to its result (in this case, the y+digital sum y) until it meets a requirement specified by a function in the first argument. This gives the smallest y-DSS element that's greater or equal to x.

[y | y&lt;-[1..]; x == {- smallest y-DSS element &gt;= x -} ]


Infinite lazy list of y's such that the smallest y-DSS element >= x is actually x. Uses Haskell's list comprehension notation (which I'd also totally forgotten about, thank y'all).

f x = {- aforementioned list -} !! 0


First element of that list, which is the smallest y that satisfies the requirement of the challenge.