皆さんはPDCAを回していますか?僕は回しています。
ソースコード
https://github.com/zena-dual/pdca-cycle/blob/master/pdca_cycle.py
Pythonの練習で書きました。
環境
Python3で書きました。2.7.10でも動きました。
python3 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とそれっぽく表示するための空白を入れる。
['P', ' ', ' ', ' ', 'D', ' ', ' ', ' ', 'C', ' ', ' ', ' ', 'A', ' ', ' ', ' ']
2. 関数make_pdca_base
で、format関数で置換するための文字列を作っておく。
['{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}
を空白に置換して出力。
上記のpdca
とbase
を用いて置換すると↓になる。
['P D',
' ',
' ',
' ',
'A C']
4. 配列pdca
の内容を、先頭の要素が末尾にくるようにずらす。
[' ', ' ', ' ', '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
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)