自己記述文とは、内容がそれ自体の説明である文を指します。 (ナンセンス...) たとえば、次の文:
3. 現在の文を入力として使用し、ステップ 2 を再度実行します。
4. 文の各部分の情報が正確になるまで。
簡単に言えば、それは絶え間ない反復と修正のプロセスです。
注意する必要があるのは、文中に変更が必要な場所が複数ある場合に、2 つの変更が同時に影響し合って無限ループが発生するのを避けるために、各反復で 1 つの場所のみを変更するようにする必要があるということです。修正する場合は、特定の順序で修正するのではなく、ランダムに 1 か所を選択して修正するようにしてください。これは、無限ループに陥るリスクを軽減することも目的としています。
ただし、たとえそうであっても、場合によっては無限ループに陥る可能性があります。たとえば、特定のステップの結果が次のような文になる場合です。
最後に、トップの自己記述文を生成するために使用した Python スクリプトは次のとおりです:
# -*- coding: utf-8 -*- import random class SelfDesc(object): ignore_chars = u",。“”" def __init__(self, template): self.template = template self.length = 0 self.detail = "" self.content = "" self.chars = "" self.char_count = {} self.makeContent() self.char_count = self.getCharCount() self.getCharCount() self.makeContent() def __str__(self): return self.content def makeContent(self): self.makeDetail() self.content = self.template.replace(u"{length}", u"%d" % self.length) .replace(u"{detail}", self.detail) self.getChars() def getChars(self): chars = self.content for c in self.ignore_chars: chars = chars.replace(c, "") self.chars = chars return chars def getLength(self): self.length = len(self.chars) def getCharCount(self): d = {} for c in self.chars: if c in self.ignore_chars: continue d.setdefault(c, 0) d[c] += 1 return d def makeDetail(self): d = self.char_count items = d.items() items.sort(key=lambda x: -x[1]) s = [] for c, n in items: s.append(u"%d个“%s”" % (n, c)) self.detail = u",".join(s) def correct(self): print "-" * 50 char_count = self.getCharCount() items = char_count.items() random.shuffle(items) for c, n in items: if n <= 1 and c in self.char_count: del self.char_count[c] continue if self.char_count.get(c) == n: continue else: self.char_count[c] = n return True else: len = self.length self.getLength() if len != self.length: return True return False def generate(self): icount = 0 while self.correct(): icount += 1 self.makeContent() print u"#%d %s" % (icount, self) def main(): template = u"这是一段自我描述的语句,除了标点符号外,它共包含{length}个字符,其中{detail}。" sd = SelfDesc(template) sd.generate() print u"%s" % sd if __name__ == "__main__": main()