# Meta-Signature in python. # Ricardo Bittencourt 2008 header = "O Ricardo afirma que sabe onde esta o Bin Laden, nesta sentenca com" import random import string class pangram: def __init__(self, x): self.name0 = ["nenhuma","uma","duas","tres","quatro","cinco", "seis","sete","oito","nove"] self.name1 = ["dez","onze","doze","treze","quatorze","quinze", "dezesseis","dezessete","dezoito","dezenove"] self.name2 = ["dez","vinte","trinta","quarenta","cinquenta", "sessenta","setenta","oitenta","noventa"] self.group = x def natural_write(self, n): if n < 10: return self.name0[n] elif n < 20: return self.name1[n - 10] elif n < 100: if n % 10: return "%s e %s" % (self.name2[n / 10 - 1] , self.name0[n % 10]) else: return self.name2[n / 10 - 1] else: return "muitas" def single_letter(self, n, c): return "%s letra%s %s" % (self.natural_write(n), "s" if n > 1 else "", c) def build(self, v): letters = [self.single_letter(v[n], c) for n, c in enumerate(self.group)] n = len(self.group) - 1 return "%s %s e %s." % (header, ", ".join(letters[:n]), letters[n]) def count(self, s): s_lower = s.lower() return [s_lower.count(i) for i in self.group] def search(self): current = [0]*len(self.group) visited = set() for outer in xrange(10000): while True: s = self.build(current) if s in visited: break v = self.count(s) if current == v: return s visited.add(s) current = v current = [random.randrange(100) for _ in xrange(len(self.group))] return "nope" s = pangram("aeioux") print s.search()