[Question]
  [
In the [Anno video game series](https://en.wikipedia.org/wiki/Anno_(series)) there are 6 games with a 7th one announced for early 2019. Their titles always feature a year in a specific pattern:
`Anno 1602, Anno 1503, Anno 1701, Anno 1404, Anno 2070, Anno 2205, Anno 1800`
* The digital sum is always 9.
* The years are four digits long.
* They contain at least one zero.
Within these constrains there exist 109 possible titles:
```
[1008,1017,1026,1035,1044,1053,1062,1071,1080,1107,1170,1206,1260,1305,1350,1404,1440,1503,1530,1602,1620,1701,1710,1800,2007,2016,2025,2034,2043,2052,2061,2070,2106,2160,2205,2250,2304,2340,2403,2430,2502,2520,2601,2610,2700,3006,3015,3024,3033,3042,3051,3060,3105,3150,3204,3240,3303,3330,3402,3420,3501,3510,3600,4005,4014,4023,4032,4041,4050,4104,4140,4203,4230,4302,4320,4401,4410,4500,5004,5013,5022,5031,5040,5103,5130,5202,5220,5301,5310,5400,6003,6012,6021,6030,6102,6120,6201,6210,6300,7002,7011,7020,7101,7110,7200,8001,8010,8100,9000]
```
Your objective is to list them all in any reasonable form in the fewest number of bytes.
  
[Answer]
# [R](https://www.r-project.org/), ~~59~~ 51 bytes
Outputs the valid numbers as the *names* of a list of 201's. Why 201? Because ASCII 0 is 48, and 4\*48+9 is... yeah. Saved 6 bytes by aliasing `^` to `Map` and another 2 by using `1:9e3` as range.
```
"^"=Map;x=sum^utf8ToInt^grep(0,1:9e3,,,T);x[x==201]
```
[Try it online!](https://tio.run/##K/r/XylOydY3scC6wra4NDeutCTNIiTfM68kLr0otUDDQMfQyjLVWEdHJ0TTuiK6wtbWyMAw9v9/AA "R – Try It Online")
# Explanation
```
# Create list of sums of ASCII char values of numbers,
# with the original numbers as the names of the list
x <- Map(sum,
  # Create a list from the strings where each element is the string split 
  # into ASCII char values
  Map(utf8ToInt,
      # Find all numbers between 1 and 9e3 that contain a zero
      # Return the matched values as a vector of strings (6th T arg)
      grep(pattern=0,x=1:9000,value=TRUE)
  )
)
# Pick out elements with value 201 (i.e. 4-digits that sum to 9)
# This implicitly only picks out elements with 4 digits, since 3-digit 
# sums to 9 won't have this ASCII sum, letting us use the 1:9e3 range
x[x==201] 
```
[Answer]
# [Perl 6](https://github.com/nxadm/rakudo-pkg), ~~35~~ 33 bytes
*-2 bytes thanks to Jo King*
```
{grep {.ords.sum==201&&/0/},^1e4}
```
[Try it online!](https://tio.run/##K0gtyjH7n1upoJamYPu/Or0otUChWi@/KKVYr7g019bWyMBQTU3fQL9WJ84w1aT2f0FpiUKahuZ/AA "Perl 6 – Try It Online")
[Answer]
# [Python 2](https://docs.python.org/2/), ~~67~~ ~~66~~ 64 bytes
```
print[y for y in range(9001)if('0'in`y`)*sum(map(ord,`y`))==201]
```
[Try it online!](https://tio.run/##K6gsycjPM/r/v6AoM68kulIhLb9IoVIhM0@hKDEvPVXD0sDAUDMzTUPdQD0zL6EyQVOruDRXIzexQCO/KEUHJKBpa2tkYBj7/z8A "Python 2 – Try It Online")
---
Saved:
* -1 byte, thanks to Luis felipe De jesus Munoz
* -2 bytes, thanks to Kevin Cruijssen
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), 11 bytes
```
9ȷṢ€æ.ẹ9ṫ19
```
[Try it online!](https://tio.run/##AR4A4f9qZWxsef//Oci34bmi4oKsw6Yu4bq5OeG5qzE5//8 "Jelly – Try It Online")
### How it works
```
9ȷṢ€æ.ẹ9ṫ19  Main link. No arguments.
9ȷ           Set the left argument and the return value to 9000.
  Ṣ€         Sort the digits of each integer in [1, ..., 9000].
    æ.       Perform the dot product of each digit list and the left argument,
             which gets promoted from 9000 to [9000].
             Overflowing digits get summed without multiplying, so we essentially
             map the digit list [a, b, c, d] to (9000a + b + c + d).
      ẹ9     Find all 1-based indices of 9.
             Note that 9000a + b + c + d == 9 iff a == 0 and b + c + d == 9.
        ṫ19  Tail 19; discard the first 18 indices.
```
[Answer]
# [PowerShell](https://github.com/TryItOnline/TioSetup/wiki/Powershell), ~~50~~ 49 bytes
```
999..1e4-match0|?{([char[]]"$_"-join'+'|iex)-eq9}
```
[Try it online!](https://tio.run/##K8gvTy0qzkjNyfn/39LSUk/PMNVENzexJDnDoMa@WiM6OSOxKDo2VkklXkk3Kz8zT11bvSYztUJTN7XQsvb/fwA "PowerShell – Try It Online")
Constructs a range from `999` to `10000`, then uses inline `-match` as a filter to pull out those entries that regex match against `0`. This leaves us with `1000, 1001, 1002, etc.` We then pipe that into a `Where-Object` clause where we take the current number as a string `"$_"`, cast it as a `char`-array, `-join` those characters together with `+` and `I`nvoke-`Ex`pression (similar to eval) to come up with their digit sum. We check whether that is `-eq`ual to `9`, and if so it's passed on the pipeline. At program completion, those numbers are picked up from the pipeline and implicitly output.
[Answer]
# JavaScript (ES6), ~~78~~ 73 bytes
*Saved 2 bytes thanks to @KevinCruijssen*
Returns a space-separated string.
```
f=(n=9e3)=>n>999?f(n-9)+(eval([...n+''].join`+`)&/0/.test(n)?n+' ':''):''
```
[Try it online!](https://tio.run/##DcnBCsIwDADQX/FkEsoywVOEbh8iwspMZaMkYst@v@7wTm9PR6rrb/u2wfytveeIFkXvFCebRGTOaINQQD1SwSczWwB48e6bLWGh63gbuWltaDSfdYEHAJ366la9KBf/YEai/gc "JavaScript (Node.js) – Try It Online")
### How?
We iterate over the range \$[1008..9000]\$ with an increment of \$9\$, ignoring numbers that don't have a \$0\$.
All these numbers are multiples of \$9\$, so the sum of their digits is guaranteed to be a multiple of \$9\$ as well.
Because valid numbers have at least one \$0\$, they have no more than two \$9\$'s, which means that the sum of the remaining digits is at most \$18\$. Therefore, it's enough to test if the sum of the digits is odd.
Hence the test:
```
(eval([...n + ''].join`+`) & /0/.test(n)
```
[Answer]
# [JavaScript (Node.js)](https://nodejs.org), 89 bytes
```
[...Array(9e3)].map(_=>i++,i=1e3).filter(a=>(s=[...a+""]).sort()[0]<1&eval(s.join`+`)==9)
```
[Try it online!](https://tio.run/##FcpRCsIwDADQu@xDEqrB4dfADDzHKC7MKh21GWkZePqqv4@3yi5lsbjVU9ZHaIvmoilQ0he0iYhuZvKBIVzQ01s2uPMYnTtG7n9Ez5hqMBAeofC/i@s6j1TUKuB09tf@EHZJUGjVmGc3I/OADdsX "JavaScript (Node.js) – Try It Online")
* -4 bytes thanks to @ETHproductions
# JavaScript (Node.js), ~~129~~ ~~127~~ ~~126~~ ~~124~~ ~~115~~ ~~114~~ ~~111~~ ~~110~~ ~~105~~ ~~97~~ ~~93~~ ~~92~~ 90 bytes
```
[...Array(9e3)].map(f=(_,i)=>eval(s=[...(i+=1e3)+""].sort().join`+`)-9|s[0]?0:i).filter(f)
```
[Try it online!](https://tio.run/##FcpRCsIwDADQu@wroS5M/JpQxXOM4sJsJaM2oy0DwbtXfd9v5Z3LkmWrfdKHb4umotFT1Ce0iYhuOfMbRn9CRy/eIFi4HwTtxe8codj/ATH2@Bum6xwVzRWQVpU0mxn78VOmwV2HsyAFidVnCNiwfQE "JavaScript (Node.js) – Try It Online")
### Explanation
```
[...Array(9e3)].map(f=(_,i)=>eval(s=[...(i+=1e3)+""].sort().join`+`)-9|s[0]?0:i).filter(f)
[...Array(9e3)].map(f=(_,i)=>                                                  )           // Create a 9000-length array and loop over it; store the loop body
                                    [...(i+=1e3)+""]                                       // Add 1000 to the index and split it into an array of characters (17 -> ["1", "0", "1", "7"])
                                                    .sort()                                // Sort the array of characters in ascending order by their code points ("0" will always be first) (["1", "0", "1", "7"] -> ["0", "1", "1", "7"])
                                  s=                       .join`+`                        // Join them together with "+" as the separator (["0", "1", "1", "7"] -> "0+0+2+9"); store the result
                             eval(                                 )-9                     // Evaluate and test if it's different than 9
                                                                       s[0]                // Take the first character of the string and implicitly test if it's different than "0"
                                                                      |    ?0              // If either of those tests succeeded, then the number doesn't meet challenge criteria - return a falsey value
                                                                             :i            // Otherwise, return the index
                                                                                .filter(f) // Filter out falsey values by reusing the loop body
```
First time doing code golf in JavaScript. I don't think I need to say it, but if I'm doing something wrong, please notify me in the comments below.
* -3 bytes thanks to @Luis felipe De jesus Munoz
* -6 bytes thanks to @Kevin Cruijssen
[Answer]
# [Python 2](https://docs.python.org/2/), 57 bytes
```
n=999
exec"n+=9\nif'0'in`n`>int(`n`,11)%10>8:print n\n"*n
```
[Try it online!](https://tio.run/##K6gsycjPM/r/P8/W0tKSK7UiNVkpT9vWMiYvM03dQD0zLyEvwS4zr0QDSOsYGmqqGhrYWVgVFAGFFPJi8pS08v7/BwA "Python 2 – Try It Online")
*2 bytes thanks to Dennis*
Uses an `exec` loop to counts up `n` in steps of 9 as 1008, 1017, ..., 9981, 9990, printing those that meet the condition. 
Only multiples of 9 can have digit sum 9, but multiples of 9 in this range can also have digits sum of 18 and 27. We rule these out with the condition `int(`n`,11)%10>8`. Interpreting `n` in base 11, its digit sum is equal to the number modulo 10, just like in base 10 a number equals its digit sum modulo 9. The digits sum of (9, 18, 27) correspond to (9, 8, 7) modulo 10, so taking those`>8` works to filter out nines.
The number containing a zero is check with string membership. `'0'in`n``. This condition is joined with the other one with a chained inequality, using that Python 2 treats strings as greater than numbers.
[Answer]
# sed and grep (and seq), ~~72~~ ~~64~~ 63 bytes
```
seq 9e3|sed s/\\B/+/g|bc|grep -wn 9|sed s/:9//|grep 0|grep ....
```
[Answer]
# [Haskell](https://tio.run/##y0gszk7Nyfn/PzcxM8@2oCgzr0QhOrMm00a3OCO/3EbFLtpQT880zixWx8jA0Na2uDRXI60oP9c1rzQXKJmpqZOak5qroG6gnhn7/z8A), 55 bytes
```
[i|i<-show<$>[1..5^6],201==sum(fromEnum<$>i),elem '0'i]
```
Thanks to @Laikoni, see the comments.
Readable:
```
import Data.Char (digitToInt)
[i | i <- show <$> [1000..9999]
   , sum (digitToInt <$> i) == 9
   , '0' `elem` i
   ]
```
[Answer]
# [R](https://www.r-project.org/), 82 bytes
```
write((x=t(expand.grid(1:9,0:9,0:9,0:9)))[,colSums(x)==9&!apply(x,2,all)],1,4,,"")
```
[Try it online!](https://tio.run/##K/r/v7wosyRVQ6PCtkQjtaIgMS9FL70oM0XD0MpSxwCBNTU1o3WS83OCS3OLNSo0bW0t1RQTCwpyKjUqdIx0EnNyNGN1DHVMdHSUlDT//wcA "R – Try It Online")
Generates a matrix `x` of all possible 4-digit numbers, excluding leading zeros, going down columns. Then filters for column (digital) sums of 9 and containing zero, i.e., not `all` are nonzero. `write` prints down the columns, so we `write` to `stdout` with a width of `4` and a separator of `""`.
[Outgolfed by J.Doe](https://codegolf.stackexchange.com/a/174054/67312)
[Answer]
# [Japt](https://github.com/ETHproductions/japt), ~~20~~ 18 bytes.
*-2 bytes thanks to @Shaggy and @ETHproductions*
```
A³òL² f_=ì)x ¥9«Z×
```
---
```
A³òL² f_=ì)x ¥9«Z×  Full program
A³òL²               Range [1000, 10000]
      f_            Filter by : 
        =ì)         Convert to array 
           x ¥9     Sum equal to 9?
               «    And 
                Z×  Product not 0
```
[Try it online!](https://tio.run/##ASMA3P9qYXB0//9BwrPDskzCsiBtcyBmX8KseCDCpTnCqVrDuDD//w "Japt – Try It Online")
[Answer]
# Java 8, ~~128~~ ~~117~~ 115 bytes
```
v->{int i=109,r[]=new int[i],n=i;for(;i>0;n++)if((n+"").chars().sum()==201&(n+"").contains("0"))r[--i]=n;return r;}
```
-11 bytes thanks to *@nwellnhof*.
[Try it online.](https://tio.run/##NZDPasMwDMbvfQqTw5BJY9LdhnFhD7BeCruEHDw3WZU5cvGfjFLy7JnTdheB9OkTv0@DnnQ1nH4WY3UI7EMj3TaMIcXO99p07LC290HTMgOfDk9s4jIP500uIeqIhh0YMbVM1f6WFxmqXf229U2rqPu9W7HdkkLZOw8S97WksuTYA1BZFFyYs/YBuAhpBK7Ua717@VccxYwUoKgLzn1TVZiPSt/F5Il5OS8rySV92QzxZJlWxDG74Bg90nfm1vyR4ngNsRuFS1FcshQtwZAfIFJEK96919cgonvYgIQBStZy/ow7L38)
**Explanation:**
```
v->{                              // Method with empty unused parameter & int-array return
  int i=109,                      //  Index-integer, starting at 109
      r[]=new int[i],             //  Result-array of size 109
      n=i;                        //  Number integer, starting at 109
   for(;i>0;                      //  Loop as long as `i` is not 0 yet:
       n++)                       //    After every iteration, increase `n` by 1
     if((n+"").chars().sum()==201 //   If the sum of the unicode values of `n` is 201,
                                  //   this means there are four digits, with digit-sum = 9
        &(n+"").contains("0"))    //   and `n` contains a 0:
       r[--i                      //    Decrease `i` by 1 first
            ]=n;                  //    And put `n` in the array at index `i`
  return r;}                      //  Return the array as result
```
[Answer]
# [R](https://www.r-project.org/), 85 bytes
(just competing for the best abuse of R square brackets ... :P )
```
`[`=`for`;i[a<-0:9,j[a,k[a,w[a,if(sum(s<-c(i,j,k,w))==9&any(!s)&i)write(s,1,s='')]]]]
```
[Try it online!](https://tio.run/##DcNRCoAgDADQs/RTG0yoT0tPIoESBSsqcIV0@uWDl1VjiD5ud44Th@RMP1raQ6KjLjVvIO8J4swCTDsdVBC9t226PmgEW8aS@VlBaCDxXYdzpfoD "R – Try It Online")
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E/wiki/Commands), ~~15~~ ~~13~~ ~~12~~ 10 [bytes](https://github.com/Adriandmen/05AB1E/wiki/Codepage)
```
₄4°ŸεW°ö9Q
```
-2 bytes thanks to *@Emigna*  
-3 bytes thanks to *@Grimy*
[Try it online.](https://tio.run/##ARsA5P9vc2FiaWX//@KChDTCsMW4ypJXwrDDtjlR//8)
**Explanation:**
```
₄4°Ÿ        # Create a list in the range [1000,10000]
    ʒ       # Filter this list by:
     W      #  Get the smallest digit in the number (without popping the number itself)
      °     #  Take 10 to the power this digit
       ö    #  Convert the number from this base to an integer (in base-10)
        9Q  #  Check if it's equal to 9
```
* If the smallest digit is \$d=0\$ it will become \$1\$ with the \$10^d\$ (`°`). And the number in base-1 converted to an integer in base-10 (`ö`) would act like a sum of digits.
* If the smallest digit is \$d=1\$ it will become \$10\$ with the \$10^d\$ (`°`). And the number in base-10 converted to an integer in base-10 (`ö`) will of course remain the same.
* If the smallest digit is \$d=2\$ it will become \$100\$ with the \$10^d\$ (`°`). And the number in base-100 convert to an integer in base-10 (`ö`) would act like a join with `0` in this case (i.e. `2345` becomes `2030405`).
* If the smallest digit is \$d=3\$ it will become \$1000\$ with the \$10^d\$ (`°`). And the number in base-100 convert to an integer in base-10 (`ö`) would act like a join with `00` in this case (i.e. `3456` becomes `3004005006`).
* ... etc. Smallest digits \$d=[4,9]\$ would act the same as \$d=2\$ and \$d=3\$ above, with \$d-1\$ amount of `0`s in the 'join'.
If the smallest digit is \$>0\$ with the given range \$[1000,10000]\$, the resulting number after `°ö` would then be within the range \$[1111,9000000009000000009000000009]\$, so can never be equal to \$9\$. If the result is equal to \$9\$ (`9Q`) it would mean the smallest digit is \$d=0\$, resulting in a base-1 with `°ö`; and the sum of the digits was \$9\$.
[Answer]
# [Pip](https://github.com/dloscutoff/pip), 18 bytes
```
{0Na&$+a=9}FIm,t*m
```
Use an ouput-format flag such as `-p` to get readable output. [Try it online!](https://tio.run/##K8gs@P@/2sAvUU1FO9HWstbNM1enRCv3////ugUA "Pip – Try It Online")
```
{0Na&$+a=9}FIm,t*m
             m,t*m  Range from 1000 to 10*1000
{         }FI       Filter on this function:
 0Na                 There is at least one 0 in the argument
    &                and
     $+a             The sum of the argument
        =9           equals 9
```
[Answer]
# [Wolfram Language (Mathematica)](https://www.wolfram.com/wolframscript/), ~~56~~ 55 bytes
```
Select[9!!~Range~9999,Tr@#==Times@@#+9&@*IntegerDigits]
```
[Try it online!](https://tio.run/##y00syUjNTSzJTE78/z84NSc1uSTaUlGxLigxLz21zhIIdEKKHJRtbUMyc1OLHRyUtS3VHLQ880pS01OLXDLTM0uKY////69bUJSZVwIA "Wolfram Language (Mathematica) – Try It Online")
We test the range from 9!! = 945 to 9999, since there are no results between 945 and 999. Maybe there's a shorter way to write a number between 9000 and 10007, as well.
`Tr@#==Times@@#+9&` applied to `{a,b,c,d}` tests if `a+b+c+d == a*b*c*d+9`, which ends up being equivalent to The Anno Condition. 
[Answer]
# [Ruby](https://www.ruby-lang.org/), ~~46 42~~ 41 bytes
```
?9.upto(?9*4){|x|x.sum==201&&x[?0]&&p(x)}
```
[Try it online!](https://tio.run/##KypNqvz/395Sr7SgJF/D3lLLRLO6pqKmQq@4NNfW1sjAUE2tItreIFZNrUCjQrP2/38A "Ruby – Try It Online")
### How it works:
* Iterate on strings ranging from '9' to '9999'
* Check that sum of ASCII values is 201
* Check if string contains a zero (without regex, a regex would be 1 byte longer)
(Thanks Laikoni for -2 bytes)
[Answer]
# [Octave](https://www.gnu.org/software/octave/), 49 bytes
*6 bytes saved using a more convenient output format as suggested by [J.Doe](https://codegolf.stackexchange.com/users/81549/j-doe).*
*Thanks to [@Laikoni](https://codegolf.stackexchange.com/users/56433/laikoni) for a correction*.
```
y=dec2base(x=1e3:9999,10)'-48;x(sum(y)==9>all(y))
```
[Try it online!](https://tio.run/##y08uSSxL/f@/0jYlNdkoKbE4VaPC1jDV2MoSCHQMDTTVdU0srCs0iktzNSo1bW0t7RJzcoAszf//AQ "Octave – Try It Online")
[Answer]
# [Dart](https://www.dartlang.org/), ~~103 100~~ 96 bytes
```
f()=>List.generate(9001,(i)=>'$i').where((i)=>i.contains('0')&&i.runes.fold(0,(p,e)=>p+e)==201);
```
- -3 bytes by setting the value in the array to string, making the conversion once and not twice
- -4 bytes by using runes instead of codeUnits
Pretty self-explanatory. generates a list of 9001 (0-9000) cells with the cell's index as value, filters the ones containing a 0 then the one having an ASCII sum of 201 (The result if all the ASCII characters sum to 9). These conditions implictly include that the year is 4 digits long because using 2 ASCII numbers (and the 0), you cannot reach 201.
[Try it on Dartpad!](https://dartpad.dartlang.org/76525a5c2f46e9a22683ff7b4532f897)
[Answer]
# [Bash](https://www.gnu.org/software/bash/) (with `seq`, `grep`), 39 bytes
```
seq 0 9 1e4|egrep '([0-4].*){3}'|grep 0
```
[Try it online!](https://tio.run/##S0oszvj/vzi1UMFAwVLBMNWkJjW9KLVAQV0j2kDXJFZPS7PauFa9Bixm8P8/AA "Bash – Try It Online")
[Answer]
# [K (ngn/k)](https://gitlab.com/n9n/k), 22 bytes
```
55_&(|/~a)&9=+/a:!4#10
```
[Try it online!](https://tio.run/##y9bNS8/7/9/UNF5No0a/LlFTzdJWWz/RStFE2dDg/38A "K (ngn/k) – Try It Online")
[Answer]
# [APL (Dyalog Unicode)](https://www.dyalog.com/), 23 bytes
```
55↓⍸(×⌿<9=+⌿)10⊥⍣¯1⍳9e3
```
[Try it online!](https://tio.run/##SyzI0U2pTMzJT///39T0UdvkR707NA5Pf9Sz38bSVhtIaRoaPOpa@qh38aH1ho96N1umGhOtEAA "APL (Dyalog Unicode) – Try It Online")
[Answer]
## PHP, ~~69, 87 bytes~~ 74 bytes
~~`for($i=999;$i<9001;$i++){echo((array_sum(str_split($i))==9&strpos($i,"0")!=0)?$i:" ");}`~~
`for($i=999;$i++<1e4;)echo!strpos($i,48)|array_sum(str_split($i))-9?" ":$i;`
Note this puts a space for every "failed" number, leading to some kind of funky spacing. This can be changed to comma separation, but will add another 4 characters: `?$i.",":""`
Got bigger because I wasn't checking for 0. Derp. Shortened by 13 by Titus!
[Answer]
# APL(Dyalog), ~~33~~ 29 bytes
```
1e3+⍸(0∘∊∧9=+/)¨⍎¨∘⍕¨1e3+⍳9e3
```
*-4 bytes thanks to @Adam*
[Try it online!](https://tio.run/##SyzI0U2pTMzJT///qKO94L9hqrH2o94dGgaPOmY86uh61LHc0lZbX/PQike9fUACKNg79dAKiKrNlqnGIF3/FcCgAAA)
[Answer]
# [Scala](https://www.scala-lang.org/) (76 63 61 56 bytes)
```
for(n<-0 to 9000;t=n+""if t.sum==201&t.min<49)println(t)
```
[Try it online](https://tio.run/##BcFRCkBAEADQq0w@RKIhP2I/HMAhFqtWu7ObHaXk7OO9tGmnJayn2RgWbQnMw4b2BHOMrxzhKmiqETjAgIgjK6qyzB7ATbq9Uh22OTfe0tQPZbwssaOCS/lEfg)
* Thanks to Laikoni for the suggestions
* Two more bytes shed after applying Jo King's comment
[Answer]
# [Vyxal](https://github.com/Vyxal/Vyxal), 13 bytes
```
k1k2r'∑9=n0c∧
```
[Try it Online!](https://vyxal.pythonanywhere.com/#WyJUIiwiIiwiazFrMnIn4oiROT1uMGPiiKciLCIiLCIiXQ==)
Extremely slow.
[Answer]
# [Tcl](http://tcl.tk/), 77 bytes
```
time {if [incr i]>1e3&[regexp 0 $i]&9==[join [split $i ""] +] {puts $i}} 9999
```
[Try it online!](https://tio.run/##K0nO@f@/JDM3VaE6M00hOjMvuUghM9bOMNVYLbooNT21okDBQEElM1bN0tY2Ois/M08hurggJ7MEKKagpBSroB2rUF1QWlIM5NfWKlgCwf//AA "Tcl – Try It Online")
[Answer]
# Japt, 16 bytes
Returns an array of digit arrays.
```
L²õì l4 k_×ª9aZx
```
[Test it](https://ethproductions.github.io/japt/?v=1.4.6&code=TLL17CBsNCBrX9eqOWFaeA==&input=LVE=)
---
## Explanation
```
L                    :100
 ²                   :Squared
  õ                  :Range [1,L²]
   ì                 :Convert each to a digit array
     l4              :Filter elements of length 4
        k_           :Remove each Z that returns truthy (not 0)
          ×          :  When reduced by multiplication
           ª         :  OR
              Zx     :  When reduced by addition
            9a       :   And subtracted from 9
```
[Answer]
# APL(NARS), 45 chars, 90 bytes
```
f←{⍵×⍳(0∊x)∧9=+/x←⍎¨⍕⍵}⋄f¨1e3..5e3⋄f¨5e3..9e3
```
test afther some formatting:
```
1008  1017  1026  1035  1044  1053  1062  1071  1080  1107  1170  1206  1260  
  1305  1350  1404  1440  1503  1530  1602  1620  1701  1710  1800  2007  2016  
  2025  2034  2043  2052  2061  2070  2106  2160  2205  2250  2304  2340  
  2403  2430  2502  2520  2601  2610  2700  3006  3015  3024  3033  3042  3051  
  3060  3105  3150  3204  3240  3303  3330  3402  3420  3501  3510  3600  
  4005  4014  4023  4032  4041  4050  4104  4140  4203  4230  4302  4320  4401  
  4410  4500 
5004  5013  5022  5031  5040  5103  5130  5202  5220  5301  5310  5400  6003  
  6012  6021  6030  6102  6120  6201  6210  6300  7002  7011  7020  7101  7110  
  7200  8001  8010  8100  9000 
  
```
possible alternative
```
r←f;i;x
   r←⍬⋄i←1e3⋄→B
A: r←r,i
B: i+←1⋄→A×⍳(0∊x)∧9=+/x←⍎¨⍕i⋄→B×⍳i≤9e3
```
]