Guest User

Untitled

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