B-Teck!

お仕事からゲームまで幅広く

【PHP】paizaラーニングで「長テーブルのうなぎ屋」を解いてみたよ

↓わかりづらいけど問題へのリンク

最近paizaに登録してみたので、まずは腕試しのできるラーニングから。

スカウト問題と違って、こっちは問題文も公開されてるし公式で答えも公開してるから、公開してもだいじょうぶだよね…?
エッ、今さら!?練習問題と具体的コード例によるTDD超入門。 - paiza開発日誌


汚いコードながらとりあえずは動作OKになりましたとさ。

公式の答えと同じようにリングバッファで書いてたはずだったのに、いつの間にか長さの余りを使ってゴリ押しで解くみたいになってた。
深く考えないことにした。

ちょいちょいブログにソースあげるようになって、管理もめんどくなってきたのでやはりGithubとGist導入必須案件なのでは。
やる気になったらソース書いてある箇所全部やろう。

<?php
//テーブルオブジェクト初期化
$objTables = null;

//標準入力取得
do{
    $s = trim(fgets(STDIN));
    if($s !== ""){
        $s = str_replace(array("\r\n","\r","\n"), '', $s);
        $s = explode(" ", $s);
        
        //初回のみテーブルサイズ・GROUP数設定
        if($objTables === null){
            $objTables = new unagiTable($s);
        }else{
            //二回目以降は来店
            $objTables->enterCustomer($s);
        }
    }
}while($s !== "");

//結果出力
echo $objTables->getResult();



class unagiTable{
    private $p_tableLen = 0;        //テーブルの長さ
    private $p_groupCnt = 0;        //グループ数
    private $p_tableStat = array(); //座席の状態
    
    //初期化
    function __construct($i_input){
        $this->p_tableLen = (int)$i_input[0];
        $this->p_groupCnt = (int)$i_input[1];
    }

    //来店
    function enterCustomer($i_input){
        $customerCnt = (int)$i_input[0];
        $tableNum = (int)$i_input[1];
        $seatNum = $this->getSeatNum($customerCnt,$tableNum);
        $this->sitSeatCustomer($seatNum);
    }    
    
    //対象の座席番号を配列で取得
    function getSeatNum($i_customerCnt,$i_tableNum){
        //必要なテーブルの終端を取得
        $tablesEnd = $i_customerCnt + $i_tableNum;
        
        //終端までループして必要な座席番号を取得
        for($i = $i_tableNum;$i !== $tablesEnd;$i++){
            $ret[] = $i % $this->p_tableLen;
        }
        
        return $ret;
    }
    
    //着席
    function sitSeatCustomer($i_seatNum){
        //対象の座席に人がいるかを確認
        foreach($i_seatNum As $value){
            if(array_key_exists($value,$this->p_tableStat) > 0 
                && $this->p_tableStat[$value] === true){
                return 0;
            }
        }
        
        //いなければ着席フラグを立てる
        foreach($i_seatNum As $value){
            $this->p_tableStat[$value] = true;
        }
        
        return 0;
    }
    
    //結果を取得
    function getResult(){
        $ret = 0;
        //着席フラグをカウント
        foreach($this->p_tableStat as $value){
            if($value === true){
                $ret++;
            }
        }
        return $ret;
    }
}
?>