文字を中央に表示する

30分プログラム、その623。Cの宿題/文字列操作 - C/C++の宿題を片付けます@wiki - アットウィキをやってみた。

一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。
ただし、以下での単語とは空白以外の文字からなる列のこととする。
1,s中の単語は同じ順番で t に現われる
2,t中では単語は一つの空白に区切られる
3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体の中央に位置し、前後は空白である
例えば文字の列
_This___is__a____good___program___
を入力すると
______This_is_a_good_program______
が出力される。ここで、_は空白を表すものとする。

正直、問題文の意味がよく分からないけれど、出力例から想像するに

  • 文字列を入力されたら、それを中央に表示する
  • 単語間のスペースは1個にまとめる
  • 入力文字列の幅と、出力文字列の幅は同じ

ってことだろう、たぶん。

使い方

$ echo ' This   is  a    good   program   ' | sed 's/ /_/g'
_This___is__a____good___program___
$ perl center.pl ' This   is  a    good   program   ' | sed 's/ /_/g'
______This_is_a_good_program______

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# center.pl -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/07/20 21:21:53
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use Data::Dumper;

sub center($$){
    my ($n,$s) = @_;
    my $m = $n - length($s);
    my $left = $m / 2;
    my $right = $m - $left;

    ' ' x $left . $s . ' ' x $right;
}

sub strip($){
    my ($s) = @_;
    $s =~ s/\A +| +\Z//g;
    $s;
}
sub remove_sep($){
    my ($s) = @_;
    join ' ',split / +/,strip $s;
}

foreach my $x (@ARGV) {
    my $n = length $x;
    my $s = remove_sep ' This   is  a    good   program   ';
    print center($n,$s),"\n";
}