The proof of the set of characters is that there is a translator which takes any ascii python program as input and produces a limited character set version of the program. The limited character set program can be slower than the original program. It simply has to be possible to produce the same output as the valid python program.
For example, here is a translator that takes any ascii python program as input and writes out a version that doesn't use the character x:
import random
import string
with open('in.py') as infile:
with open('out.py', 'w') as outfile:
lines = infile.readlines()
outfile.write("data = '")
random_string = ''.join(random.choice(string.digits) for x in range(20))
for line in lines:
outfile.write(line.encode('string-escape').replace('x', random_string))
outfile.write("'\n")
outfile.write("exec data.replace('%s', chr(%s))" % (random_string, ord('x')))
note that this will fail if the program happens to have the random string in it already, but for the purposes of this question lets accept that 'any' can be slightly limited. We don't have to consider extremely low probabilities of failure due to random chance or a malicious input program.
sorted(set('import for while = in : if def [] return class () break .'))
On the other hand, you can write en.wikipedia.org/wiki/Whitespace_(programming_language) programs with only three characters. \$\endgroup\$ – msw Aug 11 '12 at 12:04"()+,.1[]cehijnorx
. My solution is here. \$\endgroup\$ – David Robinson Aug 11 '12 at 13:18"()+,.1[]cehijnorx
). \$\endgroup\$ – David Robinson Aug 11 '12 at 13:20()+1cehrx
. \$\endgroup\$ – David Robinson Aug 11 '12 at 19:29