シェルスクリプトマガジン

バーティカルバーの極意(Vol.62掲載)

著者:飯尾 淳

 しばらくデータ分析の話題から遠ざかっているような気がしますが、 ちょっとしたトレーニングをするつもりで前回、前々回と同様にプログラミングの話を続けましょう。今回は、状態遷移図に基づくシステムの動作原理を考えます。最初に簡単なケースを考え、その後で少しブラッシュアップして仕様をアップデートします。
 ところで、状態遷移図は「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()