deMize,
I know you are intentionally limiting input from 0 .. 99 to avoid ambiguity in the spelling of larger numbers. On the other hand, if you decided on a standard
I should say, that I this is not my puzzle. I merely copy/pasted it from the embedded link. I take no credit for this, despite how fun it is to do.
So far what we came up with is 139 chars: @u=split'','4335043554366887798866555766';$_=<>;chop;print"$_ is ".($_=$_<20?$u[$_]:$u[$_/10+18]+($_%10?$u[$_%10]:0)or"magic").".\n"while$_ depending on the rules of golf '\n' could be substituted for an actual linebreak.