著者:飯尾 淳
しばらくデータ分析の話題から遠ざかっているような気がしますが、 ちょっとしたトレーニングをするつもりで前回、前々回と同様にプログラミングの話を続けましょう。今回は、状態遷移図に基づくシステムの動作原理を考えます。最初に簡単なケースを考え、その後で少しブラッシュアップして仕様をアップデートします。
ところで、状態遷移図は「GraphViz1」というツールで描画します。この連載のテーマである「バーティカルバー」(垂直棒または縦棒)を用いた表現も指定できますが、今回は縦横にこだわらず柔軟に表現してみましょう。
シェルスクリプトマガジン Vol.62は以下のリンク先でご購入できます。
図2 メッセージ出力プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/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() |