파이톤이 구현한 자기설명 스크립트 공유 생성 (재미있는 프로그램)

4044 단어
자기 묘사의 문장은 이런 문장을 가리킨다. 그 내용은 그 자체에 대한 묘사이다.(쓸데없는 말......) 예를 들면 다음 문장:
 
  
, , 125 , 33 “ ”,29 “2”,5 “3”,3 “ ”,3 “5”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “1”,2 “ ”,2 “ ”,2 “ ”,2 “9”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”,2 “ ”。

이 말은 내가 파이썬 스크립트로 생성한 것으로 생성 원리는 대체로 다음과 같다.
1. 문장의 각 내용이 자신이 어느 부위에 나타나야 하는지 알 수 있도록 템플릿을 제시한다.2. 현재 정보에 따라 문장을 생성한다.3. 현재 문장을 입력으로 하고 2단계 조작을 다시 수행한다.4. 문장의 각 부분에 대한 정보가 정확할 때까지.
간단하게 말하면 끊임없이 반복해서 수정하는 과정이다.
그 중에서 주의해야 할 것은 매번 교체할 때 가능한 한 한 한 곳만 바꾸어 두 곳의 변화가 서로 영향을 주고 사순환을 초래하지 않도록 해야 한다는 것이다.또 문장 중 여러 곳을 수정해야 할 경우 가능한 한 무작위로 한 곳을 골라 수정하고 일정한 순서대로 수정하지 않는 것도 사순환에 빠질 위험을 줄이기 위한 것이다.
그러나 그렇다고 해서 어떤 경우에도 사순환에 빠질 수 있다. 예를 들어 어느 한 걸음에 다음과 같은 문장을 얻게 된다면 다음과 같다.
 
  
2 3 “2”。

위의 이 말은 분명히 잘못된 것이다. 왜냐하면 그중에 단지 두 개의 '2' 만 있기 때문이다.그럼 우리 그'3'을'2'로 바꾸면 되는 거 아니야?만약 우리가 이렇게 바꾸면 문장은 다음과 같이 변할 것이다.
 
  
2 2 “2”。

이때 문장에는 또 세 개의'2'가 포함되어 있다.이런 문장은 어떻게 고쳐도 사순환에 빠지기 때문에 간단하게 정확한 자기묘사 문장으로 바꿀 수 없을 것 같다.
마지막으로, 내가 맨 위에 있는 자기 묘사 문장을 만드는 데 사용한 파이썬 스크립트는 다음과 같다.

# -*- 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()

좋은 웹페이지 즐겨찾기