Code of mr_sketch
<?php
/**********************************************************************
* php-editors.com contest B3 - 20030617
* Author: Jeff Franklin
* Forum name: Mr. Sketch
* E-mail: mr_sketch at xsmail dot com
* Country: USA
**********************************************************************/

// Basic function to tell if a word can be spelt in a given jumble
function get_word($word$jumble$maxBlanks)
{
  
$wordLen strlen($word);
  
$text "";
  
$preJumble $jumble;
  for(
$i 0$i $wordLen$i++)
  {
    
$char $word[$i];

    
$pos strpos($jumble$char);
    if (
$pos === false)
    {
      
$charPos strpos($maxBlanks$char);
      
$blankPos strpos($maxBlanks".");
      if (
$charPos !== false || $blankPos === false)
        return array(
"""""");

      
$maxBlanks[$blankPos] = $char;
      
$text .= strtoupper($char);
    }
    else
    {
      
$text .= $char;
      
$jumble[$pos] = ".";
    }
  }

  return array(
$text$jumble$maxBlanks);
}

// usort function to sort words
function sort_by_length($a$b)
{
  
$lena strlen($a);
  
$lenb strlen($b);
  if (
$lena == $lenb) return 0;
  return (
$lena $lenb) ? -1;
}

// usort function to sort array lengths to trim search
function sort_by_arrlen($a$b)
{
  list(
$txta$j$bla) = $a;
  list(
$txtb$j$blb) = $a;
  
$sa strlen($txta);
  
$sb strlen($txtb);
  if (
$sa $sb) return 1;
  if (
$sa $sb) return -1;
  
$ba substr_count($bla".");
  
$bb substr_count($blb".");
  if (
$ba $bb) return -1;
  if (
$ba $bb) return 1;
  return 
0;
}

// print the text out with formatting
function print_text($t)
{
  
$len 0;
  
$p "";
  
$tmp explode(" "$t);
  
usort($tmp"sort_by_length");
  
$t join(" "$tmp);
  for (
$i 0$i strlen($t); $i++)
  {
    
$l strtolower($t[$i]);
    if (
$t[$i] != $l)
      
$p .= "<font color=\"red\">$l</font>";
    else
      
$p .= $l;
    if (
$l != " ")
      
$len++;
  }
  echo 
$p "\n";
  return 
$len;
}

// This os O(N^(k+1)) where k is passed in but it won't always find
//    the most optimal solution, however, it should run in a few seconds
//  k=2 seems to work well and keeping the top 5 to the next iteration
function suboptimal($arrWords$jumble$numBlanks$k 2$maxkeep 5)
{
  
$ret "";
  
$maxLen strlen(join(""$arrWords));

  
$vals = array(array(""$jumble$numBlanks));
  while (
true)
  {
    
$startsize count($vals);
    for (
$i 0$i $k$i++)
    {
      foreach(
$vals as $val)
      {
        list(
$txt$njum$nbl) = $val;
        foreach(
$arrWords as $word)
        {
          if (
stristr($txt$word) !== false) continue;
          list(
$wtxt$wjum$wb) = get_word($word$njum$nbl);
          if (
$wtxt == "") continue;
          
$vals[] = array(ltrim("$txt $wtxt"), $wjum$wb);
        }
      }
    }

    if (
count($vals) == $startsize) break;

    
usort($vals"sort_by_arrlen");
    
$vals array_slice($vals0$maxkeep);
  }

  list(
$tst) = $vals[0];
  if (
strlen($tst) - substr_count($tst" ") > strlen($ret) - substr_count($ret" "))
    
$ret $tst;
  if (
strlen($ret) - substr_count($ret" ") == $maxLen)
    return 
$ret;

  return 
$ret;
}

// preprocess the sentance and words before handing to suboptimal
function find_all($list$sentance)
{
  
$arrList explode(" "$list);
  
$jumble join(""explode(" "$sentance));
  
usort($arrList"sort_by_length");
  
$numBlanks "..";  // Two blanks

  // Only look at words that can be spelt
  
$canSpell = array();
  foreach(
$arrList as $word)
  {
    list(
$text) = get_word($word$jumble$numBlanks);
    if (
$text != "")
      
$canSpell[] = $word;
  }

  
$bestText suboptimal($canSpell$jumble$numBlanks);
  return 
print_text($bestText);
}

// *********************** main() ************************

$data "";
foreach(
file("lists.txt") as $line)
{
  
$data .= trim($line);
}

$data explode("."$data);
$totalLen 0;
$realData = array();
foreach(
$data as $line)
{
  if (
strlen($line) == 0)
    continue;

  
$realData[] = $line;
}

foreach(
$realData as $line)
{
  list(
$list$sentance) = explode(","$line);
  
$totalLen += find_all($list$sentance);
}
echo 
"$totalLen\n";

?>


Back to results


© Copyright 2003-2023 www.php-editors.com. The ultimate PHP Editor and PHP IDE site.