dc, 243 score and
243 234 bytes
Try it online!
This uses the list-of-integers I/O, and presumes that the input list is on the stack. I suppose this may be non-competing because of the nature of traversing a stack; output is essentially reversed. But it was too interesting to pass up. The passing characters are:
Before showing a slightly ungolfed version, here are the basic ideas. Some characters were going to be unavoidable: digits,
 for macros,
lsx for loading, saving, and executing,
< for conditional. Starting with
2i puts us in base 10 input, so now we only have to contend with 3 digits. Register and macro names can only be one character long, so if we store the values for all of our included characters in registers, we'll run out of characters to use for registers. An array will solve this and also simplify the lookup, so now we need
;: for arrays as well.
dc allows us to convert a code point to a single character string, and macros are just strings. This means any further single-character operations can be recreated using
a and saved as macros. We do this for
z (count stack depth).
We also do it for So, we build those commands, store
#, the comment character. Executing a macro that's just a comment is akin to a nop, and allows us to avoid spaces.
1s in an array at every code point we allow, and run a macro on the stack that sets a temporary value to
0, checks the stack value against allowed values and sets that earlier value to
1 if so, checks that value and runs a print macro if it's 1, continues until the stack is empty.
2i #binary time
1100100as0 #macro '0' is duplicate
1110000as1 #macro '1' is print
1111010as2 #macro '2' is stack depth
1x #avoid using whitespace to separate entries by executing an empty macro
110000:: #insert 1 into element 48, '0'
1x110001:: #insert 1 into element 49, '1'
1x110010:: #insert 1 into element 50, '2'
1x111010:: #insert 1 into element 58, ':'
1x111011:: #insert 1 into element 59, ';'
1x111100:: #insert 1 into element 60, '<'
1x1011011:: #insert 1 into element 91, '['
1x1011101:: #insert 1 into element 93, ']'
1x1100001:: #insert 1 into element 97, 'a'
1x1101001:: #insert 1 into element 105, 'i'
1x1101100:: #insert 1 into element 108, 'l'
1x1110011:: #insert 1 into element 115, 's'
1x1111000:: #insert 1 into element 120, 'x'
[1si]ss #this macro sets 'i' to '1'
[0si #reset 'i' to 0
;:0<s #load that element of the array, run 's' if >0
li0<1 #load 'i', run '1' (print) if >0
l2x0<a #check stack depth (l2x == z), keep running
]l0xsax #l0xsax is the new dsax
(Golfed off 9 bytes -
100011as] which I was using to make a macro that just contained the comment character
# as a nop (to avoid adding spaces or CRs). Forgot at the time I could just run an empty macro
x which is the same number of bytes as loading/executing the