Code of ingo
<?php
/*
* Contest B3 from https://www.php-editors.com/contests.php
* see rules.txt for the rules of the contest
*
* Author:
* Ingo Claro
* miclaro@gmx.de
* http://ingo.netred.cl
*
* "Hard work has future payoff. Laziness pays off now."
*
* Benchmark included from PEAR, just uncomment the proper lines
*/
/*
* file format:
* word1 word2 word3,
* jumbled1 jumbled2 jumbled3
* jumbled4.
* word1 .......
*/
// benchmark
//require 'Benchmark-1.2.1/Timer.php'; //PEAR benchmark
//$timer = new Benchmark_Timer();
//$timer->start();
// sort function
function lensort($a, $b)
{
return strlen($b)-strlen($a);
}
//START
// read input
$fp=fopen("lists.txt","r");
$contents = fread ($fp, filesize ("lists.txt"));
fclose ($fp);
$contents=trim(str_replace("\r\n","",$contents));
$games=explode(".",$contents);
// check if last entry is empty
if($games[sizeof($games)]=="")
array_pop($games);
$globalScore=0;
$abc=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
// solve the games
foreach($games as $game)
{
$numjumbled=array();
list($words,$jumbled)=explode(",",$game);
$words=explode(" ",$words);
usort($words,"lensort");
// get word count for jumbled words
$jumbled=str_replace(" ","",$jumbled);
foreach($abc as $letter)
{
$count=-1;
$pos=-1;
do
{
$pos=strpos($jumbled,$letter,$pos+1);
$count++;
} while($pos!==false);
$globalNumJumbled["$letter"]=$count;
// get word count for each word
foreach($words as $word)
{
$count=-1;
$pos=-1;
do
{
$pos=strpos($word,$letter,$pos+1);
$count++;
} while($pos!==false);
$wordCount["$word"]["$letter"]=$count;
}
}
// try all red letters combinations and keep the highest score.
$solution["score"]=0;
$solution["words"]=array();
$solution["red1"]="";
$solution["red2"]="";
// can't have 2 blanks with same letter
for($i=0;$i<count($abc);$i++)
{
for($j=$i+1;$j<count($abc);$j++)
{
$red1=$abc[$i];
$red2=$abc[$j];
$numJumbled=$globalNumJumbled;
$numJumbled["$red1"]++;
$numJumbled["$red2"]++;
$score=0;
$wordList=array();
foreach($words as $word)
{
$ok=1;
$markR1=0;
$markR2=0;
foreach($abc as $letter)
{
$count=$wordCount["$word"]["$letter"];
if($numJumbled["$letter"]<$count ) // we can't build the word
{
$ok=0;
break;
}
// check red letters
if($markR1==0 && $red1==$letter && $numJumbled["$letter"]==$count)
{
$markR1=1;
$pos1=strpos($word,$letter,0);
}
if($markR2==0 && $red2==$letter && $numJumbled["$letter"]==$count)
{
$markR2=1;
$pos2=strpos($word,$letter,0);
}
} //foreach($abc as $letter)
if($ok==1)
{
$score+=strlen($word);
// take letters out
foreach($abc as $letter)
{
$numJumbled["$letter"]-=$wordCount["$word"]["$letter"];
}
// if i can use the red letters again, uncomment this
/* if($markR1==1 && $wordCount["$word"]["$red1"] >0)
$numJumbled["$red1"]++;
if($markR2==1 && $wordCount["$word"]["$red2"] >0)
$numJumbled["$red2"]++;
*/
// check red letters
if($markR1==1)
$word=substr($word,0,$pos1) . "<font color='ff0000'>$red1</font>" . substr($word,$pos1+1);
if($markR2==1)
$word=substr($word,0,$pos2) . "<font color='ff0000'>$red2</font>" . substr($word,$pos2+1);
$wordList[]=$word;
} //if($ok==1)
}//foreach($words as $word)
if($score>$solution["score"])
{
// this is the new solution
$solution["score"]=$score;
$solution["words"]=$wordList;
$solution["red1"]=$red1;
$solution["red2"]=$red2;
}
// next try
$numJumbled["$red1"]--;
$numJumbled["$red2"]--;
}// foreach($abc as $red2)
}// foreach($abc as $red1)
// print the solution, keep the score
foreach($solution["words"] as $sol)
echo "$sol ";
echo "<br>\n";
$globalScore+=$solution["score"];
} // foreach($games as $game)
// print the score
echo $globalScore;
// benchmark
//$timer->stop();
//$timer->display();
?>
Back to results
|
|