LoginSignup
13
11

More than 5 years have passed since last update.

pythonでPDCAサイクルを回す

Posted at

皆さんはPDCAを回していますか?僕は回しています。

pdca_slow.mov.gif

ソースコード

https://github.com/zena-dual/pdca-cycle/blob/master/pdca_cycle.py
Pythonの練習で書きました。

環境

Python3で書きました。2.7.10でも動きました。
python3 pdca_cycle.pyで気が済むまでお回しください。

なんとなく解説

pdca_cycle.py
# coding: utf-8

import os
import time

def main():
    """
    PDCAを回す
    """

    # PDCAの辺の長さ(平日は5日なので5固定)
    SIDE_LENGTH = 5
    base = make_pdca_base(SIDE_LENGTH)

    # PDCAを回す時にはバッファを持たせよう
    buf = [' '] * (SIDE_LENGTH-2)
    pdca = ['P'] + buf + ['D'] + buf + ['C'] + buf + ['A'] + buf

    # PDCAを回し続ける
    while True:
        # 前回のPDCAをクリア
        os.system('clear')

        # PDCAを回す
        for i in range(SIDE_LENGTH):
            print(base[i].format(pdca, ' '))

        # 次のPDCAの準備をしつつ休憩を取る
        pdca = pdca[1:] + [pdca[0]]
        time.sleep(0.1)


def make_pdca_base(side_length):
    """
    PDCAを回すための土台作り
    """

    bases = []
    for i in range(side_length):
        if i == 0:
            l = [str(x) for x in range(side_length)]
            base = '{0[' + ']}{0['.join(l) + ']}'
        elif i == side_length - 1:
            l = [str((side_length-1)*3 - x) for x in range(side_length)]
            base = '{0[' + ']}{0['.join(l) + ']}'
        else:
            base = '{0[' + str((side_length-1)*4-i) + ']}' \
                   + '{1}' * (side_length-2) \
                   + '{0[' + str((side_length-1)+i) + ']}'

        bases.append(base)

    return bases


if __name__ == '__main__':
    main()

1. 配列pdcaにPDCAとそれっぽく表示するための空白を入れる。

配列pdcaの中身
['P', ' ', ' ', ' ', 'D', ' ', ' ', ' ', 'C', ' ', ' ', ' ', 'A', ' ', ' ', ' ']

2. 関数make_pdca_baseで、format関数で置換するための文字列を作っておく。

配列baseの中身
['{0[0]}{0[1]}{0[2]}{0[3]}{0[4]}',
 '{0[15]}{1}{1}{1}{0[5]}',
 '{0[14]}{1}{1}{1}{0[6]}',
 '{0[13]}{1}{1}{1}{0[7]}',
 '{0[12]}{0[11]}{0[10]}{0[9]}{0[8]}']

3. format関数で配列base{0[n]}をpdcaの内容に、{1}を空白に置換して出力。
  上記のpdcabaseを用いて置換すると↓になる。

置換後の配列
['P   D',
 '     ',
 '     ',
 '     ',
 'A   C']

4. 配列pdcaの内容を、先頭の要素が末尾にくるようにずらす。

配列pdcaの中身(先頭のPが末尾に移動した)
[' ', ' ', ' ', 'D', ' ', ' ', ' ', 'C', ' ', ' ', ' ', 'A', ' ', ' ', ' ', 'P']

5. 前回の出力をクリア。
6. 3.と同様にformat関数で置換して出力。ずれた分だけPDCAが反時計回りに進む。

置換後の配列
['   D ',
 'P    ',
 '     ',
 '    C',
 ' A   ']

7. 繰り返し。

無限ループになっていますが、CPUもメモリも食わない省エネサイクルになっているはずです。
是非視界の片隅でPDCAしてください。めっちゃターミナル出力することにはお気をつけて。

おまけ

コードゴルフっぽく書いてみた版。意味は特にありません。
本職のコードゴルファーの方々ならもっと短くなるんでしょうか。
https://github.com/zena-dual/pdca-cycle/blob/master/illegible_pdca_cycle.py

illegible_pdca_cycle.py
import os,time;s=5;t=s-1;v=s-2;u=[];b=str;r=range(s);c=' '*v;p=c.join('PDCA')+c;m='{0[';n=']}';o=n+m;q=o.join;[u.append(m+(q(b(x)for x in r) if i==0 else q(b(t*3-x)for x in r) if i==t else b(t*4-i)+n+'{1}'*v+m+b(t+i))+n)for i in r]
while 1:os.system('clear');[print(u[i].format(p,' '))for i in r];p=p[1:]+p[0];time.sleep(.1)
13
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11