プログラミング練習問題をPHPで解いてみた

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

プログラミングのアルゴリズムを考えるのは、けっこう楽しいものですが、数学的な論理が必要となると、割と簡単なものでも、それをプログラミング言語で表現するのは難しい。
紙面では簡単に解ける二次方程式でも、それをプログラミング言語上で関数やメソッドで表すには、それなりの訓練が必要です。

と、前振りはここまで。
10分でコーディング|プログラミングに自信があるやつこい!!と題した問題があったので、解いてみました。

・・・10分じゃできませんでした。
細かいとこまで入れると、30分くらいかかった。
PHPで解いたのですけど、私が書いたコードは以下。
0 divide(ゼロ除算)へのエラー対応も念のため。

<?php
function card_deal($player_nums, $cards) {
    if ($player_nums == 0) {
        exit("プレイヤーが0人です");
    }
    $cards_ary = str_split($cards);
    $length = count($cards_ary);
 
    $cards = array();   // return値
    if ($player_nums > $length) {
        for ($j = 0; $j < $player_nums; $j++) {
            $cards[$j] = "";
        }
    } else {
        $length = $length - ($length % $player_nums);
        // n人目のカードを求める
        for ($n = 0; $n < $player_nums; $n++) {
            for ($i = 0; $i < $length; $i++) {
                if (($i % $player_nums) == $n) {
                    $cards[$n] .= $cards_ary[$i];
                }
            }
        }
    }
    return $cards;
}
 
var_dump(card_deal(3, "123123123"));
var_dump(card_deal(4, "123123123"));
var_dump(card_deal(6, "01234"));
var_dump(card_deal(0, "123456789"));
?>

実行結果。→http://codepad.org/iFbZAOhl

array(3) {
  [0]=>
  string(3) "111"
  [1]=>
  string(3) "222"
  [2]=>
  string(3) "333"
}
array(4) {
  [0]=>
  string(2) "12"
  [1]=>
  string(2) "23"
  [2]=>
  string(2) "31"
  [3]=>
  string(2) "12"
}
array(6) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
  [4]=>
  string(0) ""
  [5]=>
  string(0) ""
}
プレイヤーが0人です

どっかおかしかったらご指摘ください。
引用元の解答はJavaですが、あー、なるほどなぁ。
私の書いたのより、はるかにスマートだ。

1.最初にプレイヤーの数の分、カードの配列を、空の文字列で初期化。
2.カードの並びをforで回しながら、処理する。
3.forの中で、cards[index++]で、プレイヤーにカード割り当て。
4.index がプレイヤー数と同じの場合・・・残りの枚数がプレイヤー数より少なくなったら、break。
5.じゃなかったら、index を 0 に巻き戻し。

というアルゴリズムで解いてありました。


日時: 2009年06月13日 18:38
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/483

この記事にトラックバックされる方は、参照先が分かるようにするために、「プログラミング練習問題をPHPで解いてみた」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - ウェブライフハック