Guest User

Untitled

a guest
Dec 17th, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.13 KB | None | 0 0
  1. <?php
  2.  
  3. function print_clay($clay)
  4. {
  5.     $count = 0;
  6.     foreach ($clay as $key=>$line)
  7.     {
  8.  
  9.         printf('%4d : ', $key);
  10.         echo implode('', $line);
  11.         echo PHP_EOL;
  12.  
  13.         $values = array_count_values($line);
  14.         if(isset($values['~']))
  15.         {
  16.             $count += $values['~'];
  17.         }
  18.         if(isset($values['|']))
  19.         {
  20.             $count += $values['|'];
  21.         }
  22.     }
  23.  
  24.     printf('Part 1: %d', $count);
  25.     echo PHP_EOL;
  26. }
  27.  
  28. function fillable($y, $x)
  29. {
  30.     global $clay, $xmin, $xmax, $ymax;
  31.  
  32.     if($x<$xmin || $x > $xmax || $y < 0 || $y > $ymax)
  33.         return false;
  34.  
  35.     return (($c = $clay[$y][$x]) === '.' || $c === '|' || $c === '+');
  36.  
  37. }
  38.  
  39. function fill($y, $x) {
  40.     global $clay;
  41.  
  42.     if(!fillable($y, $x)) {
  43.         return;
  44.     }
  45.  
  46.     if(fillable($y+1, $x)) {
  47.         if($clay[$y][$x] === '.') {
  48.             $clay[$y][$x] = '|';
  49.             fill($y+1, $x);
  50.  
  51.             if($clay[$y+1][$x] === '~') {
  52.                 fill($y, $x);
  53.             }
  54.         }
  55.     } else {
  56.         $lx = $x;
  57.         while(fillable($y, $lx) && !fillable($y+1, $lx)) {
  58.             $clay[$y][$lx] = '|';
  59.             $lx--;
  60.         }
  61.  
  62.         $rx = $x+1;
  63.         while(fillable($y, $rx) && !fillable($y+1, $rx)) {
  64.             $clay[$y][$rx] = '|';
  65.             $rx++;
  66.         }
  67.  
  68.         if(fillable($y+1, $lx) || fillable($y+1, $rx)) {
  69.             fill($y, $lx);
  70.             fill($y, $rx);
  71.         } elseif($clay[$y][$lx] === '#' && $clay[$y][$rx] === '#') {
  72.             for($fx = $lx+1;$fx<$rx;$fx++) {
  73.                 $clay[$y][$fx] = '~';
  74.             }
  75.         }
  76.     }
  77.  
  78. }
  79.  
  80. $input = file('input.txt');
  81.  
  82. $clay = array();
  83.  
  84. $ymin = $xmin = PHP_INT_MAX;
  85. $ymax = $xmax = PHP_INT_MIN;
  86.  
  87. foreach ($input as $line)
  88. {
  89.     preg_match_all('/(x|y)=([\d\.]+)/', $line, $match);
  90.  
  91.     $xv = array();
  92.     $yv = array();
  93.  
  94.     $m0 = array_map('intval',explode('..',$match[2][0]));
  95.     $m1 = array_map('intval',explode('..',$match[2][1]));
  96.  
  97.     if($match[1][0] === 'x')
  98.     {
  99.         $xv = $m0;
  100.         $yv = $m1;
  101.     } else {
  102.         $xv = $m1;
  103.         $yv = $m0;
  104.     }
  105.  
  106.     if(count($xv) === 1)
  107.     {
  108.         $xv[1] = $xv[0];
  109.     }
  110.     if(count($yv) === 1)
  111.     {
  112.         $yv[1] = $yv[0];
  113.     }
  114.  
  115.     for($y = $yv[0]; $y <= $yv[1] ; $y++)
  116.     {
  117.         $ymin = min($ymin, $y);
  118.         $ymax = max($ymax, $y);
  119.  
  120.         if(!isset($clay[$y]))
  121.         {
  122.             $clay[$y] = array();
  123.         }
  124.         for($x = $xv[0]; $x <= $xv[1] ; $x++)
  125.         {
  126.             $xmin = min($xmin, $x);
  127.             $xmax = max($xmax, $x);
  128.  
  129.             $clay[$y][$x] = '#';
  130.         }
  131.     }
  132. }
  133.  
  134.  
  135. for($y = 0; $y <= $ymax ; $y++)
  136. {
  137.  
  138.     $sand = array_fill($xmin-1, $xmax-$xmin+3, '.');
  139.     if(isset($clay[$y])) {
  140.         $clay[$y] = $clay[$y] + $sand;
  141.         ksort($clay[$y]);
  142.     } else {
  143.         $clay[$y] = $sand;
  144.     }
  145.  
  146. }
  147. $clay[++$ymax] = $sand;
  148. ksort($clay);
  149.  
  150.  
  151. fill(0, 500);
  152. unset($clay[$ymax]);
  153. $clay[0][500] = '+';
  154.  
  155. print_clay($clay);
  156.  
  157.  
  158. printf('Bounds x: %d : %d', $xmin, $xmax);
  159. echo PHP_EOL;
  160. printf('Bounds y: %d : %d', $ymin, $ymax);
  161. echo PHP_EOL;
Advertisement
Add Comment
Please, Sign In to add comment