PHP
どう書く

第18回 オフラインリアルタイムどう書くをPHPで書いてみた

More than 3 years have passed since last update.

問題はこちら

うーん、イマイチな出来映え。
とりあえず通ったっぽいですw

<?php

/** 現在一番短い列を求める */
function getShortest($cachier){

    return min(array_keys($cachier, min($cachier)));
}

/** Bef/Aftをマージする  */
function summary($cachierBef, $cachierAft){

    $summary = array();

    for($i = 0, $len = count($cachierBef); $i < $len; $i++){

        $summary[$i] = $cachierBef[$i] + $cachierAft[$i];
    }

    return $summary;
}

/** 結果を出力する */
function output($cachier){

    return implode(',', $cachier);
}

/** 実処理 */
function execute($in){

    $capacity   = array(2,7,3,5,2); // 各レジがさばけるキャパ
    $cachierBef = array(0,0,0,0,0); // xが並ぶ前の列
    $cachierAft = array(0,0,0,0,0); // xが並んだ後の列

    for($i = 0, $cnt = mb_strlen($in); $i < $cnt; $i++){

        $val = mb_substr($in, $i, 1);

        if(is_numeric($val)){

            $current = getShortest(summary($cachierBef, $cachierAft));
            // Aftに並んでいない(=xがまだきていない)場合、Befに並べる
            if($cachierAft[$current] === 0){
                $cachierBef[$current] += $val;
            }else{
                $cachierAft[$current] += $val;
            }

        // xがきた時点でAftのほうに並べる
        }else if($val === 'x'){

            $current = getShortest(summary($cachierBef, $cachierAft));
            $cachierAft[$current] += 1;

        // 会計処理
        }else if($val === '.'){

            // 1列ずつ順繰りに
            for($j = 0, $len = count($cachierBef); $j < $len; $j++){

                // レジでさばける人数が勝っていれば0にする(全員さばいた)
                $cachierBef[$j] = ($cachierBef[$j] > $capacity[$j]) ? $cachierBef[$j] - $capacity[$j] : 0;
            }
        }
    }

    return summary($cachierBef, $cachierAft);
}

/** テストを実行し、結果を返す */
function test($in, $result){

    $exe = execute($in);
    if(output($exe) === $result){

        echo "OK\n";
        return;
    }

    echo "NG!!!!!!!!!!!!!!!!\n";
}

/** テストを実行する */
function doTest(){
/*0*/ test( "42873x.3.", "0,4,2,0,0" );    
/*1*/ test( "1", "1,0,0,0,0" );    
/*2*/ test( ".", "0,0,0,0,0" );    
/*3*/ test( "x", "1,0,0,0,0" );    
/*4*/ test( "31.", "1,0,0,0,0" );    
/*5*/ test( "3x.", "1,1,0,0,0" );    
/*6*/ test( "99569x", "9,9,6,6,9" );    
/*7*/ test( "99569x33", "9,9,9,9,9" );    
/*8*/ test( "99569x33.", "7,2,6,4,7" );    
/*9*/ test( "99569x33..", "5,0,4,0,5" );    
/*10*/ test( "12345x3333.", "4,0,3,2,3" );    
/*11*/ test( "54321x3333.", "3,0,3,0,4" );    
/*12*/ test( "51423x3333.", "3,4,4,0,4" );    
/*13*/ test( "12x34x.", "1,0,1,0,2" );    
/*14*/ test( "987x654x.32", "7,6,4,10,5" );    
/*15*/ test( "99999999999x99999999.......9.", "20,10,12,5,20" );    
/*16*/ test( "997", "9,9,7,0,0" );    
/*17*/ test( ".3.9", "1,9,0,0,0" );    
/*18*/ test( "832.6", "6,6,0,0,0" );    
/*19*/ test( ".5.568", "3,5,6,8,0" );    
/*20*/ test( "475..48", "4,8,0,0,0" );    
/*21*/ test( "7.2..469", "1,4,6,9,0" );    
/*22*/ test( "574x315.3", "3,3,1,7,1" );    
/*23*/ test( "5.2893.x98", "10,9,5,4,1" );    
/*24*/ test( "279.6xxx..4", "2,1,4,1,1" );    
/*25*/ test( "1.1.39..93.x", "7,1,0,0,0" );    
/*26*/ test( "7677749325927", "16,12,17,18,12" );    
/*27*/ test( "x6235.87.56.9.", "7,2,0,0,0" );    
/*28*/ test( "4.1168.6.197.6.", "0,0,3,0,0" );    
/*29*/ test( "2.8.547.25..19.6", "6,2,0,0,0" );    
/*30*/ test( ".5.3x82x32.1829..", "5,0,5,0,7" );    
/*31*/ test( "x.1816..36.24.429.", "1,0,0,0,7" );    
/*32*/ test( "79.2.6.81x..26x31.1", "1,0,2,1,1" );    
/*33*/ test( "574296x6538984..5974", "14,13,10,15,14" );    
/*34*/ test( "99.6244.4376636..72.6", "5,6,0,0,3" );    
/*35*/ test( "1659.486x5637168278123", "17,16,16,18,17" );    
/*36*/ test( ".5.17797.x626x5x9457.3.", "14,0,3,5,8" );    
/*37*/ test( "..58624.85623..4.7..23.x", "1,1,0,0,0" );    
/*38*/ test( "716.463.9.x.8..4.15.738x4", "7,3,5,8,1" );    
/*39*/ test( "22xx.191.96469472.7232377.", "10,11,18,12,9" );    
/*40*/ test( "24..4...343......4.41.6...2", "2,0,0,0,0" );    
/*41*/ test( "32732.474x153.866..4x29.2573", "7,5,7,8,5" );    
/*42*/ test( "786.1267x9937.17.15448.1x33.4", "4,4,8,4,10" );    
/*43*/ test( "671714849.149.686852.178.895x3", "13,16,13,10,12" );    
/*44*/ test( "86x.47.517..29621.61x937..xx935", "7,11,8,8,10" );    
/*45*/ test( ".2233.78x.94.x59511.5.86x3.x714.", "4,6,10,8,8" );    
/*46*/ test( ".793...218.687x415x13.1...x58576x", "8,11,8,6,9" );    
/*47*/ test( "6.6x37.3x51x932.72x4x33.9363.x7761", "15,13,15,12,15" );    
/*48*/ test( "6..4.x187..681.2x.2.713276.669x.252", "6,7,8,6,5" );    
/*49*/ test( ".6.xx64..5146x897231.x.21265392x9775", "19,17,19,20,17" );    
/*50*/ test( "334.85413.263314.x.6293921x3.6357647x", "14,14,12,16,10" );    
/*51*/ test( "4.1..9..513.266..5999769852.2.38x79.x7", "12,10,13,6,10" );
}

//$in = fgets(STDIN);
//$result = execute($in);
//echo output($result);

// GO!
$testCase = 0;
doTest();

また挑戦させてください。