Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function print_clay($clay)
- {
- global $ymin, $ymax;
- $water = 0;
- $drain = 0;
- foreach ($clay as $key=>$line)
- {
- printf('%4d : ', $key);
- echo implode('', $line);
- echo PHP_EOL;
- if($key >= $ymin && $key < $ymax) {
- $values = array_count_values($line);
- if (isset($values['~'])) {
- $water += $values['~'];
- }
- if (isset($values['|'])) {
- $drain += $values['|'];
- }
- }
- }
- echo PHP_EOL;
- printf('Part 1: %d', $water + $drain);
- echo PHP_EOL;
- printf('Part 2: %d', $water);
- echo PHP_EOL;
- }
- function fillable($y, $x)
- {
- global $clay, $xmin, $xmax, $ymax;
- if($x<$xmin-1 || $x >$xmax+1 || $y < 0 || $y > $ymax)
- return false;
- return (($c = $clay[$y][$x]) === ' ' || $c === '|' || $c === '+');
- }
- function fill($y, $x) {
- global $clay, $xmin, $xmax;
- if(!fillable($y, $x)) {
- return;
- }
- if(fillable($y+1, $x)) {
- if($clay[$y][$x] === ' ') {
- $clay[$y][$x] = '|';
- fill($y+1, $x);
- if($clay[$y+1][$x] === '~') {
- fill($y, $x);
- }
- }
- } else {
- $lx = $x;
- while(fillable($y, $lx) && !fillable($y+1, $lx)) {
- $clay[$y][$lx] = '|';
- $lx--;
- }
- $rx = $x;
- while(fillable($y, $rx) && !fillable($y+1, $rx)) {
- $clay[$y][$rx] = '|';
- $rx++;
- }
- if(fillable($y+1, $lx) || fillable($y+1, $rx)) {
- fill($y, $lx);
- fill($y, $rx);
- } elseif($lx > $xmin-1 && $lx < $xmax+1 && $clay[$y][$lx] === '#' && $clay[$y][$rx] === '#') {
- for($fx = $lx+1;$fx<$rx;$fx++) {
- $clay[$y][$fx] = '~';
- }
- }
- }
- }
- $input = file('input.txt');
- $clay = array();
- $ymin = $xmin = PHP_INT_MAX;
- $ymax = $xmax = PHP_INT_MIN;
- foreach ($input as $line)
- {
- preg_match_all('/(x|y)=([\d\.]+)/', $line, $match);
- $xv = array();
- $yv = array();
- $m0 = array_map('intval',explode('..',$match[2][0]));
- $m1 = array_map('intval',explode('..',$match[2][1]));
- if($match[1][0] === 'x')
- {
- $xv = $m0;
- $yv = $m1;
- } else {
- $xv = $m1;
- $yv = $m0;
- }
- if(count($xv) === 1)
- {
- $xv[1] = $xv[0];
- }
- if(count($yv) === 1)
- {
- $yv[1] = $yv[0];
- }
- for($y = $yv[0]; $y <= $yv[1] ; $y++)
- {
- $ymin = min($ymin, $y);
- $ymax = max($ymax, $y);
- if(!isset($clay[$y]))
- {
- $clay[$y] = array();
- }
- for($x = $xv[0]; $x <= $xv[1] ; $x++)
- {
- $xmin = min($xmin, $x);
- $xmax = max($xmax, $x);
- $clay[$y][$x] = '#';
- }
- }
- }
- for($y = 0; $y <= $ymax ; $y++)
- {
- $sand = array_fill($xmin-1, $xmax-$xmin+3, ' ');
- if(isset($clay[$y])) {
- $clay[$y] = $clay[$y] + $sand;
- ksort($clay[$y]);
- } else {
- $clay[$y] = $sand;
- }
- }
- $clay[++$ymax] = $sand;
- ksort($clay);
- fill(0, 500);
- unset($clay[$ymax]);
- $clay[0][500] = '+';
- print_clay($clay);
Advertisement
Add Comment
Please, Sign In to add comment