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

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

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

スポンサーリンク

と、前振りはここまで。
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 に巻き戻し。

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

スポンサーリンク
 
スポンサーリンク