Google Code Jam: o kousek...

in

Tak jsem se přihlásil do GCJ, a pak s překvapením zjistil že mám posledních 35 minut do deadlinu :). Takže jsem se vrhnul k Eclipsu a začal kódit úlohu A - universe. No, hotovo bylo 4 minuty před deadlinem, ale oiga - výstup neakceptován...

Oprava bugu spočívala v umazání jednoho sčítance, ale bohužel, nezadařilo se do termínu :). Tak aspoň dirty kód pro potěchu:

function rln() {
        static $fpointer = 0;
        global $file_in;
        $line = $file_in[$fpointer++];
        return ereg_replace("\r\n","",$line);   
}

function arr_write(array $arr) {
        $out = "";
        foreach ($arr as $a) {
                $out .= $a . "\r\n";
        }
        echo $out;
        return $out;
}

function max_first_occurence(array $needles, array $haystack, $start = 0) {
        $max = count($haystack)+1;
        $haystack = array_slice($haystack, $start, count($haystack) - $start, true );
        $pos = array()
        foreach($needles as $index=>$needle) {
                $pos[$index] = array_search($needle, $haystack);
                if ($pos[$index]===FALSE) {
                        $pos[$index]=$max;
                }
        }
        asort($pos);
        $keys = array_keys($pos);
        return array( "index" => end($keys), "pos"=> $pos[end($keys)] );
}

$argc = $_SERVER['argc'];
$argv = $_SERVER['argv'];

if ($argc<1) {
        echo 'zadej soubor';
        exit(1);
}

$filename_in = $argv[1];
$file_in = file($filename_in);

$cases = rln();
 
for ($case = 0; $case<$cases; $case++) {
        $engines = rln();
        $engine = array();
        for ($i=0; $i<$engines; $i++) {
                $engine[] = rln();
        }
        $queries = rln();
        $query = array();
        for ($i=0; $i<$queries; $i++) {
                $query[] = rln();
        }
       
        //algorithm
        //echo "----------".($case+1)."----------\n";
       
        $changes = -1;
        $done = false;
        $pos = 0;
        while (!$done) {
                $res = max_first_occurence($engine, $query, $pos);
               
                $ppos = $pos;
                $se = $res["index"];
                $pos = $res["pos"];
                //echo(" ".($ppos+1)." - $pos : {$engine[$se]} \n");
               
                if ($pos>count($query)) {$done = true;}
               
                $changes++;
        }
        //echo "-------\n";
        echo "Case #". ($case+1) .": ".$changes."\n";
       
       
}

Komentáře/Comments

Poslat nový komentář

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.