結城浩の『Perlクイズ』

[PQ][Perl Quiz 1999-12-22 No.0039]


カテゴリー: 1999年12月22日
===========================================================
結城浩の『Perlクイズ』1999-12-22 No.0039
http://www.hyuki.com/pq/
===========================================================
■今日の一言
-----------------------------------------------------------
こんにちは、結城浩です。
このたび、hyuki.com ドメインを取得しました。
このメールマガジン『Perlクイズ』のホームページも、
http://www.hyuki.com/pq/
へ移動しました。
どうぞよろしくお願いいたします。
===========================================================
■今回のクイズ
-----------------------------------------------------------
●クイズ
-----------------------------------------------------------
ディレクトリ名を与えると、
それ以下のディレクトリとファイルの一覧を出すサブルーチン
&traverseを作ってください。表示形式自由。
細かな仕様は適当に考えてください。
もし何らかの制限事項があれば、それも明記のこと。
===========================================================
■前回の解答
-----------------------------------------------------------
●クイズ
-----------------------------------------------------------
もうすぐクリスマスですね。
今回の『Perlクイズ』ではクリスマスツリーを作ってみましょう。
次の表示を行うプログラムを書いてください。
ともかく以下の表示ができれば正解としますが、
プログラムの内容はみなさんがそれぞれ工夫をこらしてみてください。
(1)と(2)が別のプログラムでも構いませんし、
一つのプログラムで両方を書いても構いません。

(1) 小さなツリー

      *
     *!*
    *!*!*
   *!*%*!*
  *!*%/%*!*
 *!*%/*/%*!*

(2) 大きなツリー

               *
              *!*
             *!*!*
            *!*%*!*
           *!*%/%*!*
          *!*%/*/%*!*
         *!*%/*+*/%*!*
        *!*%/*+-+*/%*!*
       *!*%/*+-!-+*/%*!*
      *!*%/*+-!.!-+*/%*!*
     *!*%/*+-!.*.!-+*/%*!*
    *!*%/*+-!.***.!-+*/%*!*
   *!*%/*+-!.**%**.!-+*/%*!*
  *!*%/*+-!.**%/%**.!-+*/%*!*
 *!*%/*+-!.**%/*/%**.!-+*/%*!*
*!*%/*+-!.**%/*+*/%**.!-+*/%*!*
-----------------------------------------------------------
●解答
-----------------------------------------------------------
ごめんなさい。
「小さなツリー」の方が右に一つずれるという出題のバグがありました。
以下の解答では、左端にぴったりくっつく出力になります。

◆解答1
@twig1 = ( '*', '!', '*', '%', '/', '*', );
@twig2 = ( '*', '!', '*', '%', '/', '*', '+', '-', '!', '.', '*', '*', '%', '/', '*', '+', );
&print_tree1(@twig1);
&print_tree1(@twig2);
exit;

sub print_tree1 {
    local(@leaf) = @_;
    for ($i = 0; $i < @leaf; $i++) {
        print ' ' x (@leaf - $i - 1), @leaf[0..$i], reverse(@leaf[0..$i-1]), "\n";
    }
}

◆解答2
@twig1 = ( '*', '!', '*', '%', '/', '*', );
@twig2 = ( '*', '!', '*', '%', '/', '*', '+', '-', '!', '.', '*', '*', '%', '/', '*', '+', );
&print_tree2(@twig1);
&print_tree2(@twig2);
exit;

sub print_tree2 {
    local(@twig) = @_;
    local(@branch);
    while (@twig) {
        $leaf = shift @twig;
        print ' ' x @twig, @branch, $leaf, reverse(@branch), "\n";
        push(@branch, $leaf);
    }
}
-----------------------------------------------------------
●読者からの解答
-----------------------------------------------------------
@leaves = qw(* ! * % / * + - ! . * * % / * + * / % * * . ! - + * / % * ! *);

### 小さなツリー作成
&make_tree(6);

### 大きなツリー作成
&make_tree(16);

### ツリー作成部本体
sub make_tree {
    my($depth,$ct) = $_[0];
    for($ct = 0; $ct < $depth; $ct++) {
        printf "%s%s\n",
            (' ' x ($depth - $ct - int($depth / 10))),
            join('',(@leaves[0 .. $ct], reverse(@leaves[0 .. ($ct - 1)])));
    }
}

printf 中の int($depth / 10) の部分は本来 1 でよいと思うのですが、
一応結城さんの問題では小さなツリーの方だけ半角1文字分右に寄せられて
いましたのであわせておきました。
-----------------------------------------------------------
●結城からのコメント
-----------------------------------------------------------
半角のずれも正しく解答していただき、恐縮です(^_^;
なるほど、int($depth / 10)のようにしてしまえば、
if ($depth >= 10) {
    ...
} else {
    ...
}
のようなif文はいらないわけですねえ。
-----------------------------------------------------------
●読者からの解答
-----------------------------------------------------------
sub tree {
    @symbol = qw (* ! * % / * + - ! . * * % / * +);
    for ($i = 0; $i < $_[0]; $i++) {
         print " " x ($_[0] - 1 - $i);
         for ($j = 0; $j < $i; $j++) {
             print $symbol[$j];
         }
         for ($k = $i ; $k >= 0; $k--) {
             print $symbol[$k];
         }
         print "\n";
    }
}

tree (6);
tree (16);
-----------------------------------------------------------
●結城からのコメント
-----------------------------------------------------------
ふむふむ。qw( ... ) なら一個一個の文字をクオートする必要がないですね。
それから $_[0] は引数で渡された数値、と。了解。
全体としては二重のforループですね。
-----------------------------------------------------------
●読者からの解答
-----------------------------------------------------------
#        0123456789012345
$tane = '*!*%/*+-!.**%/*+';

tree(6);   #小さいツリー
tree(16);  #大きいツリー

sub tree {
  my($okisa) = @_;     #ツリーの大きさ
  my $i, $moji;

  for ($i = 0; $i < $okisa; $i++) {
    $moji = substr($tane, 0, $i + 1);
    print ' ' x ($okisa - $i - 1);
    print $moji;
    print substr(reverse($moji), 1);
    print ' ' x ($okisa - $i - 1);
    print "\n";
  }
}
-----------------------------------------------------------
●結城からのコメント
-----------------------------------------------------------
substrで部分文字列の処理を行っています。
ツリーの右側のスペースはなくてもよいでしょう。
(もちろんあってもいいですが)
-----------------------------------------------------------
●読者からの解答
-----------------------------------------------------------
$str='*!*%/*+-!.**%/*+';
print " " x (length($str)-$_)
. substr($str,0,$_) . reverse(substr($str,0,$_-1))
. "\n" for (1..length($str));
-----------------------------------------------------------
●結城からのコメント
-----------------------------------------------------------
この方は今回の最多パターンを投稿してくださいました。
(なんと6パターン!)
上記は一番短いもので、たったの2文です。
===========================================================
■読者からのお便り
-----------------------------------------------------------
●読者から
-----------------------------------------------------------
こういう問題はいいですね。Perlでは、どのように
組むのだろう。皆様の解答が楽しみです。
-----------------------------------------------------------
●読者から
-----------------------------------------------------------
いろいろとあそばせてもらいました。面白かったです。
また面白いクイズを期待してます。
-----------------------------------------------------------
●読者から
-----------------------------------------------------------
「C MAGAZINE」で連載されている「C&Perlで学ぶCGIレッスン」が
来月号で最終回ですが,書籍化の予定はあるのでしょうか?
書籍化したら,是非とも購入したいと思っております.
-----------------------------------------------------------
●結城から
-----------------------------------------------------------
ご愛読感謝します。そうですね、2000年の1月号で最終回となりました。
書籍化の予定は(とりあえずは)ないですが、
ぜひやってみたいですね。
こういう本が読みたい!というご要望は、
雑誌のはがきなどで編集部にフィードバックしていただけると、
私の仕事も増えてうれしいですので、どうぞよろしくお願いいたします。
# そうだ[PE]も書かねば…(^_^;

2000年の2月号からはC MAGAZINEでPerlの新連載をやります。
第一回目はこのメールマガジン『Perlクイズ』もちらっと話題に出ます。
どうぞお読みくださいね。
===========================================================
■結城浩の書籍紹介(ソフトバンクパブリッシング)
-----------------------------------------------------------
◆『Java言語プログラミングレッスン』(上下2巻)
    http://www.st.rim.or.jp/~hyuki/jb/
◆『C言語プログラミングレッスン』(入門編・文法編)
    http://www.st.rim.or.jp/~hyuki/lc/
◆『Perlで作るCGI入門』(基礎編・応用編)
    http://www.st.rim.or.jp/~hyuki/cgibook/
    http://www.st.rim.or.jp/~hyuki/cgibook2/
===========================================================
結城浩の『Perlクイズ』
Copyright (C) 1999 by Hiroshi Yuki. <hyuki@hyuki.com>
http://www.hyuki.com/pq/
お送りくださる文章やプログラムは、
書籍や連載などで無断で利用させていただく場合があります。
===========================================================

このメルマガは現在休刊中です

結城浩の『Perlクイズ』

RSSを登録する
発行周期 不定期
最新号 2007/08/25
部数 0部

このメルマガは
現在休刊中です

ついでに読みたい

結城浩の『Perlクイズ』

RSSを登録する
発行周期 不定期
最新号 2007/08/25
部数 0部

このメルマガは
現在休刊中です

今週のおすすめ!メルマガ3選

生きる意味は仏教に学びなさい
仏教メルマガ読者数日本一。今この瞬間に幸せを感じ、後悔のない人生にする方法とは?なぜどんなにお金があっても幸せになれないのか。むなしい人生になってしまう原因とは?あなたの人生を背後で支配する運命の法則と99%の人が自覚なく不幸を引き寄せている6つの行いとは…?仏教史上初のウェブ通信講座を開設、仏教の歴史を変え続ける中村僚が、葬式法事仏教となった現代日本の仏教界では失われた本当の仏教の秘密を公開。発行者サイトでも隠された仏教の秘密を無料プレゼント中。
  • メールアドレスを入力

  • 規約に同意して

川島和正の日刊インターネットビジネスニュース
■読者数32万部超、日本一の個人メルマガ(まぐまぐ総合ランキング調べ) ■9年連続で年収1億円以上になり、70か国以上を旅行して、 190平方メートルの豪邸に住んで、スーパーカーに乗れるようになり、 さらに、著書は、日本を代表する超有名人2人に帯を書いてもらい、 累計50万部のベストセラーとなった、現在香港在住の川島和正が、 最新のビジネスノウハウ、自己啓発ノウハウ、健康ノウハウ、恋愛ノウハウ さらに「今チェックしておくべき情報リスト」などを配信中!
  • メールアドレスを入力

  • 規約に同意して

幸せを引き寄せるメール
毎朝7時に配信します。ゴールデンセレブヒーリング創始者本藤弘美があなたの人生をより豊かに幸せにするハッピーナビゲーション情報をお届けします。夢を叶えたい人、幸せになりたい人、心身共に健康になりたい人、人間関係を良くしたい人、豊かになりたい人に。読んでいると波動が上がります。GoldenCelebとは黄金の祝福。あなたの成功を祝福します。あなたにすべての安らぎと愛と豊かさと幸せがやってきます。♥
  • メールアドレスを入力

  • 規約に同意して

今週のおすすめ!メルマガ3選

ハロー株式
読者2万人超。「週刊ダイヤモンド」・「日経ネットトレーディング」・「初歩のパソコン」にも紹介され、3年連続「まぐまぐ大賞マネー部門第1位!」、メルマでは9年連続で最高栄誉の「総合大賞」を受賞中。「まぐまぐ殿堂入り」の無料投資情報誌です。役立つ情報満載で必見。株式相場見通し・投資ノウハウ、有望銘柄情報を10年以上に渡って配信しています。是非ともご活用下さい!
  • メールアドレスを入力

  • 規約に同意して

オンラインカジノ情報ドットコム
カジノって楽しいですよね。ラスベガス、マカオ、韓国などのカジノへ行く前や行った後も日本でカジノを楽しみたいと思いませんか?実はそのカジノが日本でもオンラインカジノを通じて遊べるんです!そんなオンラインカジノの魅力をたくさんご紹介しちゃいますね。今話題の海外FXについても詳しく解説します。
  • メールアドレスを入力

  • 規約に同意して

幸せを引き寄せるメール
毎朝7時に配信します。ゴールデンセレブヒーリング創始者本藤弘美があなたの人生をより豊かに幸せにするハッピーナビゲーション情報をお届けします。夢を叶えたい人、幸せになりたい人、心身共に健康になりたい人、人間関係を良くしたい人、豊かになりたい人に。読んでいると波動が上がります。GoldenCelebとは黄金の祝福。あなたの成功を祝福します。あなたにすべての安らぎと愛と豊かさと幸せがやってきます。♥
  • メールアドレスを入力

  • 規約に同意して

他のメルマガを読む

ウィークリーランキング