与えられた文字列を、#で囲むプログラム
30分プログラム、その666。与えられた文字列を、#で囲むプログラムを書いてみた。
以下のような動作をするプログラムを書いてみた。
$ python border.py 1st "HELO WORLD" ############## # # # HELO WORLD # # # ##############
特に目的は考えてないんですけど、、ファイル先頭にいれるコメントとかに使えば便利なんじゃいですかね?
で、使い道はさておき、プログラムの構造なんですけど、decoratorパターンを意識して作ってみました。
# 枠で囲むだけ print show(border('#',msg)) # 周囲に1個スペースを入れて、枠で囲む print show(border('#',margin(1,msg))) # 周囲に1個スペースを入れて、真ん中に表示して、枠で囲む print show(border('#',margin(1,centerAlign(msg))))
本当はクラスにしないとdecoratorパターンにならないんですけど、かたいこと言わないください。メソッドが1つしかないクラスを作るぐらいなら、関数でやるほうがクールでしょう。
使い方
$ python border.py 1st "HELO WORLD" ############## # # # 1st # # HELO WORLD # # # ##############
ソースコード
#! /usr/bin/python # -*- mode:python; coding:utf-8 -*- import sys def side(c, lines): w = max(map(len,lines)) def f(line): pad = ' ' * (w - len(line)) return c + line + pad + c return map(f,lines) def leftAlign(lines): w = max(map(len,lines)) def f(line): pad = ' ' * (w - len(line)) return line + pad return map(f,lines) def centerAlign(lines): w = max(map(len,lines)) def f(line): lpad = (w - len(line)) / 2 rpad = w - lpad - len(line) return ' ' * lpad + line + ' ' * rpad return map(f,lines) def border(c,lines): w = max(map(len,lines)) return ([c * (w + 2 * len(c))] + side(c,lines) + [c * (w + 2 * len(c))]) def margin(c,msg): return border(' '*c, msg) def show(msg): return "\n".join(msg) msg = sys.argv[1:] #print show(border('#',msg)) #print show(border('#',margin(1,msg))) print show(border('#',margin(1,centerAlign(msg))))