Code of simon
<?php
/*

Code by Simon Robinson (simonr@uk2k.com / http://imafish.com) 
as a solution to the problem given at 
https://www.php-editors.com/contest_b_1.htm.

Instructions: Place this script and a file called deck.txt 
that contains the mixed deck, then navigate to the script 
in a web browser. The output is <solution to problem><no. of moves>

Finished apart from including timeout function to display current 
solution if time > 60 secs (or whatever the timeout is set 
to)... is this possible in php?

I should probably have entered into the beginner contest 
as i am a bit of a newbie, but this looked more fun :p

*/

$filename "deck.txt";
$fp = @fopen($filename"r");
$contents = @fread($fpfilesize($filename));
@
fclose($fp);

function 
sortthem($scftype$file){
    
$scftype strtoupper($scftype);
    for (
$k 0$k strlen($scftype); $k++){
        
$onemove $scftype[$k];
        
$strlen strlen($file);
        if(
$onemove == "C"){ //Cut
            
$file substr($file,($strlen 2),$strlen) . substr($file,0,($strlen 2));
        }elseif(
$onemove == "S"){ //Shuffle
            
$filetemp1 substr($file,0,($strlen 2));
            
$filetemp2 substr($file,($strlen 2),$strlen);
            
$filetemp3 "";
            for (
$g 0$g < (strlen($file) / 2); $g++){
                @
$filetemp3 $filetemp3 $filetemp2[$g] . $filetemp1[$g];
            }
            
$file $filetemp3;
        }elseif(
$onemove == "F"){ //Flip
            
$file strrev($file);
        }
    }
    return 
$file;
}

/*

The problem is modelled as a binary tree with 3 nodes, each having 
3, each having 3 etc etc. This is tackled row by row instead of the usual 
binary tree searching (traversal). Each row has 3^(rownumber) 
number of combinations to search through.

*/

if(isset($contents)){ 
    
$contents ltrim(rtrim($contents)); // Must remove spaces etc to stop errors
    
$trv = array(=> "F"=> "C"=> "S");
    
$tempsolve "";
    
$solution "";
    if(
strlen($contents) < 52){ //substr needs this, doesn't like substr("string",0,-0) for some reason
        
$aim substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",0,-( 26 - (strlen($contents)/2) ));
    }else{
        
$aim "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    }
    
$aim $aim strtolower($aim);
    if(
$contents == $aim){
        echo 
"0";
    }else{
        while(
$tempsolve != $aim){
            foreach(
$trv as $ind => $solution){
                if (
$solution != ""){
                    
$tempsolve sortthem($solution$contents);
                    if (
$tempsolve == $aim){
                        
$solution str_replace("CC","",$solution); //Replace any unnecessary values not already done
                        
$solution str_replace("FF","",$solution);
                        echo 
$solution strlen($solution); //Display answer
                        //break; //Exits this foreach, but still performs the next one, 
                        // so use exit to save time. Re-ordering would lose single-char solutions.
                        
exit;
                    }
                }
            }
            
$max count($trv);
            
$i 0;
            foreach(
$trv as $ind => $solution){
                if(
$i <= $max){
                    
//echo $ind . " " .  $solution . "<br>"; // For testing purposes
                    
                    
$count count($trv);
                    
$str $trv[$i];
                                    
                    if (
$str[strlen($str) - 1] != "F"){ // Detect unnecessary F values
                        
$trv[$count] = $str "F";
                    }else{
                        
$count $count 1;
                    }
                    
                    if (
$str[strlen($str) - 1] != "C"){ // Detect unnecessary C values
                        
$trv[$count 1] = $str "C";
                    }
                    
                    
$trv[$i] = $str "S"//S doesn't cancel itself out unless in large numbers, and number different for length of $contents 
                    
                    
$i++;
                } 
//End of if($i <= $max){
            
//End of foreach($trv as $ind => $solution){
        
//End of while($tempsolve != $aim){
    
//End of if($contents == $aim){
}else{
    echo 
"File not found. Either a) Doesn't exist or b) Wrong directory - must be in the same directory as this file";
}

?>


Back to results


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