皆さんは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)
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.