Advertisement
Guest User

Triads

a guest
Apr 7th, 2020
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.05 KB | None | 0 0
  1. <?php
  2.  
  3. $debug = false;
  4.  
  5. $num_of_iterations = 0;
  6.  
  7. DEFINE('RISER','!');
  8.  
  9. $pyramid = array();
  10.  
  11. $markers = array(
  12.     '1','2','3','4','5','6','7','8','9','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',
  13.     '1','2','3','4','5','6','7','8','9','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',
  14.     '1','2','3','4','5','6','7','8','9','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',
  15.     '1','2','3','4','5','6','7','8','9','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',
  16.     '1','2','3','4','5','6','7','8','9','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',
  17.     '1','2','3','4','5','6','7','8','9','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',
  18.     '1','2','3','4','5','6','7','8','9','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',
  19.     '1','2','3','4','5','6','7','8','9','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',
  20.     '1','2','3','4','5','6','7','8','9','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',
  21.     '1','2','3','4','5','6','7','8','9','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',
  22.     '1','2','3','4','5','6','7','8','9','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',
  23.     '1','2','3','4','5','6','7','8','9','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'    
  24. );
  25. $marker_num = 0;
  26.  
  27. $n = 38;
  28.  
  29. function initializePyramid(&$pyramid, $n) {
  30.     for ($y=0; $y<$n; $y++) {
  31.         for ($x=0; $x<=$y; $x++) {
  32.             $pyramid[$y][$x] = RISER;        
  33.         }        
  34.         for ($k=$x; $k<$n; $k++) {
  35.             $pyramid[$y][$k] = 0;
  36.         }
  37.     }
  38. }
  39.  
  40. function printPyramid($pyramid, $n) {
  41.    
  42.     for ($y=0; $y<$n; $y++) {
  43.         for ($k=0; $k<($n-$y); $k++) echo ' ';
  44.         for ($x=0; $x<=$y; $x++) {
  45.             echo $pyramid[$y][$x]. " ";
  46.         }
  47.         echo "\r\n";
  48.     }    
  49. }
  50.  
  51. function pyramidAboveAlreadySunken(&$pyramid, $n, $y, $x) {
  52.  
  53.     for ($i=0; $i<=$y; $i++) {
  54.         if ($i<$y) {
  55.             $k = $i;
  56.         } else {
  57.             $k = $x;
  58.         }
  59.        
  60.         for ($j=0;$j<$k; $j++) {
  61.             if ($pyramid[$i][$j] == RISER) return false;
  62.         }
  63.     }
  64.     return true;
  65. }
  66.  
  67. function isAllTriadsSunk(&$pyramid, $n) {
  68.    
  69.     for ($y=0; $y<$n; $y++) {
  70.         for ($x=0; $x<=$y; $x++) {
  71.             if ($pyramid[$y][$x] == RISER) {
  72.                 return false;
  73.             }
  74.         }
  75.     }
  76.    
  77.     return true;
  78. }
  79.  
  80. function sinkTriads(&$pyramid, $n, $y, $x) {
  81.    
  82.     global $num_of_iterations;
  83.     global $debug;
  84.     global $markers;
  85.     global $marker_num;
  86.    
  87.     if (!pyramidAboveAlreadySunken($pyramid, $n, $y, $x)) {
  88.        return;        
  89.     }
  90.    
  91.     if (!($y+1 < $n && $x+1 < $n && $x <= $y)) {
  92.         return;
  93.     }
  94.        
  95.     if ($debug) echo "----------------------------- y={$y} x={$x} -------------------------\r\n";
  96.    
  97.     $num_of_iterations++;
  98.    
  99.     $downwardTriad = $upwardTriad = false;
  100.    
  101.     // try an "upward triad"
  102.     if ($pyramid[$y][$x] == RISER && $pyramid[$y+1][$x] == RISER && $pyramid[$y+1][$x+1] == RISER) {
  103.        
  104.         $pyramid[$y][$x] = $markers[$marker_num];
  105.         $pyramid[$y+1][$x] = $markers[$marker_num];
  106.         $pyramid[$y+1][$x+1] = $markers[$marker_num];
  107.        
  108.         $marker_num++;
  109.        
  110.         $upwardTriad = true;              
  111.        
  112.         if ($debug) echo "upward triad\r\n";              
  113.  
  114.         if (isAllTriadsSunk($pyramid, $n)) {
  115.             echo "* Horray! Pyramid with N={$n} is complete\r\n";            
  116.             printPyramid($pyramid, $n);
  117.             echo "Number of iterations for N={$n} : {$num_of_iterations}\r\n";
  118.             exit();
  119.         }
  120.        
  121.         if ($debug) printPyramid($pyramid, $n);
  122.        
  123.         // keep going right
  124.         sinkTriads($pyramid, $n, $y, $x+1);
  125.        
  126.         // keep going down
  127.         sinkTriads($pyramid, $n, $y+1, 0);        
  128.  
  129.         $pyramid[$y][$x] = RISER;
  130.         $pyramid[$y+1][$x] = RISER;
  131.         $pyramid[$y+1][$x+1] = RISER;
  132.                
  133.         $marker_num--;        
  134.     }
  135.                    
  136.     // try a "downward triad"
  137.     if ($pyramid[$y][$x] == RISER && $pyramid[$y][$x+1] == RISER && $pyramid[$y+1][$x+1] == RISER) {
  138.        
  139.         $pyramid[$y][$x] = $markers[$marker_num];
  140.         $pyramid[$y][$x+1] =$markers[$marker_num];
  141.         $pyramid[$y+1][$x+1] = $markers[$marker_num];
  142.        
  143.         $marker_num++;
  144.        
  145.         $downwardTriad = true;
  146.        
  147.         if ($debug) echo "downward triad\r\n";
  148.        
  149.         if (isAllTriadsSunk($pyramid, $n)) {
  150.             echo "* Horray! Pyramid with N={$n} is complete\r\n";            
  151.             printPyramid($pyramid, $n);
  152.             echo "Number of iterations for N={$n} : {$num_of_iterations}\r\n";
  153.             exit();
  154.         }
  155.        
  156.         if ($debug) printPyramid($pyramid, $n);
  157.        
  158.         // keep going right
  159.         sinkTriads($pyramid, $n, $y, $x+2);            
  160.        
  161.         // keep going down
  162.         sinkTriads($pyramid, $n, $y+1, 0);        
  163.        
  164.         $pyramid[$y][$x] = RISER;
  165.         $pyramid[$y][$x+1] = RISER;
  166.         $pyramid[$y+1][$x+1] = RISER;
  167.        
  168.         $marker_num--;                
  169.     }
  170.    
  171.     if (!$downwardTriad && !$upwardTriad) {
  172.         sinkTriads($pyramid, $n, $y, $x+1);
  173.        
  174.         sinkTriads($pyramid, $n, $y+1, 0);
  175.     }
  176. }
  177.  
  178. initializePyramid($pyramid, $n);
  179.  
  180. printPyramid($pyramid, $n);
  181.    
  182. sinkTriads($pyramid, $n, 0, 0);
  183.  
  184. echo "Number of iterations for N={$n} : {$num_of_iterations}\r\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement