与えられた文字列を、#で囲むプログラム

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))))