-PR-
解決済み

半角文字の縦書き表示

  • 困ってます
  • 質問No.5370410
  • 閲覧数118
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 90% (9/10)

perlにて配列の要素を下のように縦書き表示をするのに、
1文字ごと配列に保管して、2次元配列で表示する方法を思いついたのですが、
perlの知識が浅いもので、もっとスマートなスクリプトがありましたらぜひとも教えて下さい?

@aaa = ( "1234", "ABCDE", "XYZ" );

[出力結果]
A
1B
2CX
3DY
4EZ

("A"の左右と、Bの右にはブランクが入っています。)
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル10

ベストアンサー率 37% (69/186)

No.2で書いたコードより実行効率の良さそうな方法を思いつきました。
一旦、文字列をreverseさせてから結合しています。

my @aaa = ( "1234", "ABCDE", "XYZ" );

@aaa = map { str => scalar reverse, len => length }, @aaa;

my ($i, @result) = 0;
while (1) {
my $str = join q{}, map { $i < $_->{len} ? substr($_->{str}, $i, 1) : q{ } } @aaa;
last if $str eq q{ }x@aaa;
push @result, $str;
$i++;
}

print join("\n", reverse @result);
お礼コメント
oyoooo

お礼率 90% (9/10)

回答ありがとうございます。
初めて見る関数もありperlの奥深さを知りました。
じっくりと1行1行調べて理解を深めたいと思います。
投稿日時 - 2009-10-20 01:52:40

その他の回答 (全3件)

  • 回答No.4
レベル10

ベストアンサー率 66% (101/151)

あんまり、かわらんか

my @aaa = ( "1234", "ABCDE", "XYZ" );

my $max = 0;
my @info_table = map {
my $len = length $_;
$max = $len if $max < $len;
{ len => $len, chars => [ split '', $_ ] }
} @aaa;

while ($max) {
for my $info (@info_table) {
my $len = $info->{len};
print $max <= $len ? $info->{chars}->[ $len - $max] : ' ';
}
print "\n";
$max--;
}
お礼コメント
oyoooo

お礼率 90% (9/10)

ありがとうございます。
変数の動きを見ないと理解できないもので、初心者の私にはデバッグしやすいソースと感じました。
とても、勉強になります。
投稿日時 - 2009-10-20 01:58:24


  • 回答No.1
レベル11

ベストアンサー率 56% (111/196)

・ 注目桁番号でループする

・ 文字列から注目桁の 1文字を取り出すのは substr()

・ ループ内で 1行出力

で、配列は使わずに 1重ループで出来ます。


課題の可能性がある質問には、完成コードは書かない事にしています。 悪しからずご了承ください。
お礼コメント
oyoooo

お礼率 90% (9/10)

ヒントありがとうございます。
おかげさまで、イメージがつかめましたので、テストしてみたいと思います。

P.S.
最終行を見てハッとしました。
私は、自己啓発でperlを学んでいる社会人でして。
確かに、宿題の答えを求めて投稿する人もいそうですね。
投稿日時 - 2009-10-16 06:44:54
  • 回答No.2
レベル10

ベストアンサー率 37% (69/186)

コード量を減らすためmapを多用してしまいしたが、素直に書いてみました。
mapの多重ループになっているのを何とかしたいところですが、私には限界です。

use List::Util qw(max);

my @aaa = ( "1234", "ABCDE", "XYZ" );

my $max_len = max map(length, @aaa);
@aaa = map sprintf("%${max_len}s", $_), @aaa;
@aaa = map {
my $i = $_;
join( q{}, map { substr $_, $i, 1 } @aaa );
} 0..$max_len-1;

print join("\n", @aaa);

何かエレガントな方法がありそうな感じですよね。
このQ&Aで解決しましたか?
関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-

特集


開業・独立という夢を持つ人へ向けた情報満載!

ピックアップ

-PR-
ページ先頭へ