After sleeping on it, I'm down to 19 chars, no cheating:
def symbolify(i)
"?*-?*"+"-?)--?*"*i
end
1000.times do |i|
s = symbolify(i)
raise "Not a string!" unless s.is_a? String
raise "Invalid chars!" unless s.delete("?*()-").empty?
x = eval(s)
raise "Decode failed!" unless i == x
end
puts "Passed!"