ホームページ  >  記事  >  バックエンド開発  >  Python で実装された自己記述スクリプトの生成の共有 (非常に興味深いプログラム)

Python で実装された自己記述スクリプトの生成の共有 (非常に興味深いプログラム)

WBOY
WBOYオリジナル
2016-06-16 08:43:061118ブラウズ

自己記述文とは、内容がそれ自体の説明である文を指します。 (ナンセンス...) たとえば、次の文:

コードをコピー コードは次のとおりです:

これは自己記述文であり、句読点に加えて、「個」33個、「2」29個、「3」5個、「文字」3個、「5」3個の合計125個の文字が含まれています。 s、2「一」、2「それ」、2「包」、2「的」、2「ビアオ」、2「了」、2「私」、2「外」、21「含む」、2 "中"、2 "YES"、2 "1"、2 "Duan"、2 "point"、2 "draw"、2 "9"、2 ""zi"、2 "this"、2 "sentences"、 2「部門」、2「自」、2「ゆ」、2「共に」、2「シュ」、2「ハオ」、2「その」。

この文は私が Python スクリプトを使用して生成しました。生成原理はおおよそ次のとおりです。 1. 文の各コンテンツがどこに表示されるべきかを理解できるようにテンプレートを指定します。 2. 現在の情報に基づいて文章を生成します。

3. 現在の文を入力として使用し、ステップ 2 を再度実行します。
4. 文の各部分の情報が正確になるまで。

簡単に言えば、それは絶え間ない反復と修正のプロセスです。

注意する必要があるのは、文中に変更が必要な場所が複数ある場合に、2 つの変更が同時に影響し合って無限ループが発生するのを避けるために、各反復で 1 つの場所のみを変更するようにする必要があるということです。修正する場合は、特定の順序で修正するのではなく、ランダムに 1 か所を選択して修正するようにしてください。これは、無限ループに陥るリスクを軽減することも目的としています。

ただし、たとえそうであっても、場合によっては無限ループに陥る可能性があります。たとえば、特定のステップの結果が次のような文になる場合です。


コードをコピー コードは次のとおりです: この 2 文には 3 つの「2」が含まれています。


上の文には「2」が 2 つしかないので、明らかに間違っています。では、その「3」を「2」に変えると、そうなるでしょうか?このような変更を加えると、文が次のようになることは簡単にわかります:


コードをコピー コードは次のとおりです: この 2 文には 2 つの「2」が含まれています。


この時点でも文中に「2」が3つ含まれています。このような文章は、どう変えても無限ループに陥ってしまうため、単純に正しい自己記述文に変えることはできないようです。

最後に、トップの自己記述文を生成するために使用した 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()
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。