Code of eugene
<?PHP
// dejumbler.php
// By Eugene Otto May - June 2003 for PHP-Editors.com Contest B3


////////////////////
// Start input stuff

// Read lists.txt into character array
$handle fopen ('./lists.txt''r');
while (!
feof ($handle)) {
     
$file .= fgetc ($handle);
}
fclose ($handle);

// Split character string into array of word list / scrambled sentence Pairs
$Pairs explode ('.'$file);

// Pop off last element of pair list (it's empty)
array_pop ($Pairs);

// Split pair strings into word list and scrambled sentence array
$SizeOfPairs sizeOf ($Pairs);
for (
$i 0$i $SizeOfPairs$i ++) {
     
$Pairs [$i] = split (','trim ($Pairs [$i])); // the trim () is there to cut off the space that's after every '.'
}

// Split word list into array
for ($i 0$i $SizeOfPairs$i ++) {
     
$Pairs [$i][0] = split (' '$Pairs [$i][0]);
}

// End input stuff
//////////////////

// Pairs structure:
// Array Pairs (
//        Array Wordlist (word1, word2, word3, word4, ...),
//        String ScrambledWords
//        ),
//        ...

function BuildMatrix4 ($Words$Letters) {
     global 
$_MaxArray$_NumWords;
     
$SizeOfWords sizeOf ($Words);
     
$MaxString '';

     for (
$i 0$i $SizeOfWords$i ++) {
          
$StrLenWordsI strlen ($Words [$i]);
          
$LetterMask $Letters;

          for (
$j 0$j $StrLenWordsI$j ++) {
               if ((
$LetterMask [$Words [$i]{$j}] == -1) || (($LetterMask [$Words [$i]{$j}] == 0) && ($LetterMask ['*'] == 2))) {
                    break;
               }
               else if (
$LetterMask [$Words [$i]{$j}] == 0) {
                    
$LetterMask [$Words [$i]{$j}] = -1;
                    
$LetterMask ['*'] ++;
               }
               else {
                    
$LetterMask [$Words [$i]{$j}] --;
               }
          }

          if (
$j == $StrLenWordsI) {
               
$StringX $Words [$i] . ' ' BuildMatrix4 (CutElement ($Words$i), $LetterMask);
               if (
strlen (str_replace (' '''$StringX)) > strlen (str_replace (' '''$MaxString))) {
                    
$MaxString $StringX;
               }
          }
     }
     return 
$MaxString;
}


// Removes element of index $Index from array $List
function CutElement (&$List, &$Index) {
     for (
$i 0$i $Index$i ++) {
          
$NewArray [$i] = $List [$i];
     }
     
$SizeOfList sizeOf ($List);
     for (
$i $Index 1$i $SizeOfList$i ++) {
          
$NewArray [$i 1] = $List [$i];
     }
     return 
$NewArray;
}

// Puts letters into associative array
function BuildLetterRow (&$Letters) {
     
$StrLenLetters strlen ($Letters);
     for (
$i 0$i $StrLenLetters$i ++) {
          
$LetterMask [$Letters {$i}] ++;
     }
     return 
$LetterMask;
}

function 
PrintSolution ($MaxString$LetterMask) {
     
$SizeOfMaxString sizeOf ($MaxString);
     for (
$i 0$i $SizeOfMaxString$i ++) {
          
$StrLenMaxString strlen ($MaxString [$i]);
          for (
$j 0$j $StrLenMaxString$j ++) {
               if (
$LetterMask [$MaxString [$i]{$j}] == 0) {
                    echo 
'<FONT color=#FF0000>'$MaxString [$i]{$j}, '</FONT>';
               }
               else {
                    echo 
$MaxString [$i]{$j};
                    
$LetterMask [$MaxString [$i]{$j}] --;
               }
          }
          echo 
' ';
     }
}

// Swaps values of a and b
function Swap (&$a, &$b) {
     
$c $a;
     
$a $b;
     
$b $c;
}

// Sort list of strings in descending order
function MySort (&$List) {
     
$SizeOfList sizeOf ($List);
     for (
$i 0$i $SizeOfList$i ++) {
          
$StrLenI strlen ($List [$i]);
          for (
$j 0$j $SizeOfList$j ++) {
               if (
$StrLenI  strlen ($List [$j])) {
                    
Swap ($List [$i], $List [$j]);
               }
          }
     }
}

//////////////////
// METHOD 2 STUFF
function InitWords (&$Words) {
     global 
$_NumWords;
     for (
$i 0$i $_NumWords$i ++) {
          
$Temp [$i] = Array (     "Word" => $Words [$i],
                                   
"WordMask" => $Words [$i],
                                   
"FinalWord" => $Words [$i],
                                   
"Size" => strlen ($Words [$i]),
                                   
"Open" => strlen ($Words [$i]),
                                   
"Weight" => @((100 $_NumWords) / strlen ($Words [$i]))
                              );
     }
     
$Words $Temp;
     unset (
$Temp);
}



function 
FillWords (&$Words, &$Letters, &$SortNum) {
     global 
$_NumWords;
     
$StrLenLetters strlen ($Letters);
     for (
$i 0$i $StrLenLetters$i ++) {
          for (
$j 0$j $_NumWords$j ++) {
               
$Pos strpos ($Words [$j]["WordMask"], $Letters {$i});
               if (
$Pos !== False) {
                    
$Words [$j]["Open"] --;
                    
$Words [$j]["WordMask"]{$Pos} = '*';
                    switch (
$SortNum) {
                         case 
0:
                                   break;
                         case 
1:   MySort1 ($Words);
                                   break;
                         case 
2:   MySort2 ($Words);
                                   break;
                         case 
3:   MySort3 ($Words);
                                   break;
                         case 
4:   MySort4 ($Words);
                                   break;
                         case 
5:   MySort5 ($Words);
                                   break;
                         case 
6:   MySort6 ($Words);
                                   break;
                         default:
                                   break;
                    }
                    break;
               }
          }
     }
}

function 
PlugWilds (&$Words) {
     global 
$_NumWords;
     
$UsedWildCards = Array ();
     for (
$i 0$i $_NumWords$i ++) {
          if (
$Words [$i]["Open"] && ($Words [$i]["Open"] <= (sizeOf ($UsedWildCards)))) {
               for (
$j 0$j strlen ($Words [$i]["WordMask"]); $j ++) {
                    if ((
$Words [$i]["WordMask"]{$j} != '*') && ($Words [$i]["WordMask"]{$j} != '<') && ($Words [$i]["WordMask"]{$j} != '>') && ($UsedWildCards [$Words [$i]["WordMask"]{$j}] != 1)) {
                         
$Pos strpos ($Words [$i]["WordMask"], $Words [$i]["WordMask"]{$j});
                         
$UsedWildCards [$Words [$i]["WordMask"]{$j}] = 1;
                         
$Words [$i]["FinalWord"] = substr_replace ($Words [$i]["FinalWord"], "<FONT color=#FF0000>" $Words [$i]["WordMask"]{$j} . "</FONT>"$Pos1);
                         
$Words [$i]["WordMask"] = substr_replace ($Words [$i]["WordMask"], "<******************>*<*****>"$Pos1);
                         
$Words [$i]["Open"] --;
                    }
               }
          }
     }
}

function 
MySort1 (&$Words) {
     global 
$_NumLetters$_NumWords;
     for (
$i 0$i $_NumWords$i ++) {
          for (
$j 0$j $_NumWords$j ++) {
               if (@(
$Words [$i]["Open"] / $Words [$i]["Size"]) < @($Words [$j]["Open"] / $Words [$j]["Size"])) {
                    
Swap ($Words [$i], $Words [$j]);
               }
          }
     }
}

function 
MySort2 (&$Words) {
     global 
$_NumLetters$_NumWords;
     for (
$i 0$i $_NumWords$i ++) {
          for (
$j 0$j $_NumWords$j ++) {
               if (
$Words [$i]["Open"] < $Words [$j]["Open"]) {
                    
Swap ($Words [$i], $Words [$j]);
               }
          }
     }
}

function 
MySort3 (&$Words) {
     global 
$_NumLetters$_NumWords;
     for (
$i 0$i $_NumWords$i ++) {
          for (
$j 0$j $_NumWords$j ++) {
               if ((
$Words [$i]["Open"] / $_NumLetters) < ($Words [$j]["Open"] / $_NumLetters)) {
                    
Swap ($Words [$i], $Words [$j]);
               }
          }
     }
}

function 
MySort4 (&$Words) {
     global 
$_NumLetters$_NumWords;
     for (
$i 0$i $_NumWords$i ++) {
          for (
$j 0$j $_NumWords$j ++) {
               if ((
$Words [$i]["Open"] / $_NumLetters) > ($Words [$j]["Open"] / $_NumLetters)) {
                    
Swap ($Words [$i], $Words [$j]);
               }
          }
     }
}

function 
MySort5 (&$Words) {
     global 
$_NumLetters$_NumWords;
     for (
$i 0$i $_NumWords$i ++) {
          for (
$j 0$j $_NumWords$j ++) {
               if (
$Words [$i]["Size"] > $Words [$j]["Size"]) {
                    
Swap ($Words [$i], $Words [$j]);
               }
          }
     }
}

function 
MySort6 (&$Words) {
     global 
$_NumLetters$_NumWords;
     for (
$i 0$i $_NumWords$i ++) {
          for (
$j 0$j $_NumWords$j ++) {
               if (
$Words [$i]["Size"] < $Words [$j]["Size"]) {
                    
Swap ($Words [$i], $Words [$j]);
               }
          }
     }
}

function 
CountUsed (&$Words) {
     global 
$_NumWords;
     
$Total 0;
     for (
$i 0$i $_NumWords$i ++) {
          if (
$Words [$i]["Open"] == 0) {
               
$Total += $Words [$i]["Size"];
          }
     }
     return 
$Total;
}


function 
StrongButSlow (&$Words, &$Letters) {
     
$LetterMask BuildLetterRow ($Letters);

     
$MaxString BuildMatrix4 ($Words$LetterMask);
     
$NumLetters += strlen (trim (str_replace (' '''$MaxString)));
     
$MaxString explode (' 'trim ($MaxString));
     
MySort ($MaxString);
     
PrintSolution ($MaxString$LetterMask);
     echo 
'<BR>';
     return 
$NumLetters;
}

function 
FastButWeak (&$WordsX, &$Letters) {
     global 
$_NumWords;
     
$MaxLetters 0;
     
$MaxWordArray = Array ();
     for (
$j 0$j 7$j ++) {
          
$Words $WordsX;
          
InitWords ($Words);
          
FillWords ($Words$Letters$j);
          
PlugWilds ($Words);
          
$Total CountUsed ($Words);
          if (
$Total $MaxLetters) {
               
$MaxLetters $Total;
               
$MaxWordArray $Words;
          }
     }

     
MySort5 ($MaxWordArray);
     for (
$k 0$k $_NumWords$k ++) {
          if (
$MaxWordArray [$k]["Open"] == 0)
               print 
$MaxWordArray [$k]["FinalWord"] . " ";
     }
     print 
"<BR>";
     return 
$MaxLetters;
}

$TotalLettersUsed 0;
$SizeOfPairs sizeOf ($Pairs);
$NumLetters 0;
for (
$i 0$i $SizeOfPairs$i ++) {
     
$Words $Pairs [$i][0];
     
$_NumWords sizeOf ($Words);
     
$_NumLetters 0;
     for (
$j 0$j sizeOf ($Words); $j ++) {
          
$_NumLetters += strlen ($Words [$j]);
     }
     
$Letters str_replace (' '''trim ($Pairs [$i][1]));
     if (
$_NumWords <= 9) {
          
$TotalLettersUsed += StrongButSlow ($Words$Letters);
     }
     else {
          
$TotalLettersUsed += FastButWeak ($Words$Letters);
     }
}

echo 
$TotalLettersUsed;
?>


Back to results


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