Hatena::Groupperl

perl初心者

 | 

2008-12-13

クリスマスツリーを書く

| 16:41

時期的にも合うのでこのクイズを解いてみました。

このようなクリスマスツリーを書くプログラムを作るという課題です。

     *
    *!*
   *!*!*
  *!*%*!*
 *!*%/%*!*
*!*%/*/%*!*
              *
             *!*
            *!*!*
           *!*%*!*
          *!*%/%*!*
         *!*%/+/%*!*
        *!*%/+-+/%*!*
       *!*%/+-!-+/%*!*
      *!*%/+-!.!-+/%*!*
     *!*%/+-!.*.!-+/%*!*
    *!*%/+-!.***.!-+/%*!*
   *!*%/+-!.**%**.!-+/%*!*
  *!*%/+-!.**%/%**.!-+/%*!*
 *!*%/+-!.**%/*/%**.!-+/%*!*
*!*%/+-!.**%/*+*/%**.!-+/%*!*

 

最初に考えたのは

#! /bin/perl -w
use strict;

my @takasa = ('6', '16',);
my @parts = qw(* ! * % / * + - ! . * * % / * +);

foreach my $h(@takasa){
	for (my $i = 1; $i <= $h; $i++){
		print ' ' x ($h - $i);
		for (my $m = 0; $m < $i; $m++){
			print $parts[$m];
		}
		for (my $n = ($i - 2); $n >= 0; $n--){
			print $parts[$n];
		}
		print "\n";
	}
	print "\n";
}

forループで右側+中央と左側をprintするのを高さ分だけ繰りかえす2重ループ

 

次にヒントありでできたのが

#! /bin/perl -w
use strict;

my @tree = ('*!*%/*', '*!*%/+-!.**%/*+'); #葉
foreach (@tree) {
	my @leaf = split(//, $_);
	my @branch = ();
	while (@leaf) {
		my $center = shift(@leaf);
		print " " x @leaf, @branch, $center, reverse(@branch), "\n";
		push (@branch, $center);
	}
}

すっきりできました。

解答は結城浩の『Perlクイズ』 [まぐまぐ!]にありますが、2文で出来るとはびっくりです。まだ、学んでいない関数を使ってるとはいえ驚きました。

ゲスト



トラックバック - http://perl.g.hatena.ne.jp/ukme/20081213
 |