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.