著者:飯尾 淳
しばらくデータ分析の話題から遠ざかっているような気がしますが、 ちょっとしたトレーニングをするつもりで前回、前々回と同様にプログラミングの話を続けましょう。今回は、状態遷移図に基づくシステムの動作原理を考えます。最初に簡単なケースを考え、その後で少しブラッシュアップして仕様をアップデートします。
ところで、状態遷移図は「GraphViz1」というツールで描画します。この連載のテーマである「バーティカルバー」(垂直棒または縦棒)を用いた表現も指定できますが、今回は縦横にこだわらず柔軟に表現してみましょう。
シェルスクリプトマガジン Vol.62は以下のリンク先でご購入できます。![]()
![]()
図2 メッセージ出力プログラム
#!/usr/bin/env python
import random
class Node:
def __init__(self, label):
self.label = label
self.nodes = []
def addNode(self, node):
self.nodes.append(node)
def nextNode(self):
return random.choice(self.nodes)
def putLabel(self):
print(self.label, end="")
return self
def main():
cur = n1 = Node(" ガ")
n2 = Node(" ン")
n3 = Node(" ズ")
n4 = Node(" ダ")
e = Node("")
n1.addNode(n2); n1.addNode(n2)
n2.addNode(n1); n2.addNode(n3)
n2.addNode(n4); n2.addNode(e)
n3.addNode(n4)
n4.addNode(n2); n4.addNode(n2)
while(cur != e):
cur = cur.putLabel().nextNode()
print()
if __name__ == "__main__":
main()
図4 メッセージ出力プログラムの改良版(gangan2.py)
#!/usr/bin/env python
import random
class Node:
def __init__(self, label):
self.label = label
self.nodes = []
def addNode(self, node):
self.nodes.append(node)
def nextNode(self):
n = random.choice(self.nodes)
self.nodes.remove(n)
return n
def putLabel(self):
print(self.label, end="")
return len(self.nodes)
def main():
cur = n1 = Node("ガ")
n2 = Node("ン")
n3 = Node("ズ")
n4 = Node("ダ")
n1.addNode(n2); n1.addNode(n2)
n2.addNode(n1); n2.addNode(n3)
n2.addNode(n4)
n3.addNode(n4)
n4.addNode(n2); n4.addNode(n2)
while (cur.putLabel() > 0):
cur = cur.nextNode()
print()
if __name__ == "__main__":
main()