Guest User

Untitled

a guest
Dec 18th, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.97 KB | None | 0 0
  1. <?php
  2.  
  3.  
  4. function get_new_state($grid, $y, $x)
  5. {
  6.  
  7.  
  8.     $xmin = max(0, $x - 1);
  9.     $xmax = min(count($grid[$y]) - 1, $x + 1);
  10.     $ymin = max(0, $y - 1);
  11.     $ymax = min(count($grid) - 1, $y + 1);
  12.  
  13.     $found = array('.'=>0, '|'=>0, '#'=>0);
  14.  
  15.     for ($yy = $ymin; $yy <= $ymax; $yy++) {
  16.         for ($xx = $xmin; $xx <= $xmax; $xx++) {
  17.             if($x !== $xx || $y !== $yy)
  18.             {
  19.                 $found[$grid[$yy][$xx]]++;
  20.             }
  21.         }
  22.     }
  23.  
  24.     $current_state = $grid[$y][$x];
  25.  
  26.     switch ($current_state)
  27.     {
  28.         case '.':
  29.             if($found['|']>2)
  30.             {
  31.                 return '|';
  32.             }
  33.             break;
  34.         case '|':
  35.             if($found['#']>2)
  36.             {
  37.                 return '#';
  38.             }
  39.             break;
  40.         case '#':
  41.             if($found['#']<1 || $found['|']<1)
  42.             {
  43.                 return '.';
  44.             }
  45.     }
  46.  
  47.     return $current_state;
  48. }
  49.  
  50. function get_value($grid)
  51. {
  52.     $lumber = 0;
  53.     $trees = 0;
  54.  
  55.     foreach ($grid as $key=>$line)
  56.     {
  57.         $values = array_count_values($line);
  58.         if (isset($values['#'])) {
  59.             $lumber += $values['#'];
  60.         }
  61.         if (isset($values['|'])) {
  62.             $trees += $values['|'];
  63.         }
  64.     }
  65.  
  66.     return $lumber * $trees;
  67. }
  68.  
  69. function print_grid($grid)
  70. {
  71.  
  72.     foreach ($grid as $key=>$line)
  73.     {
  74.         printf('%4d : ', $key);
  75.         echo implode('', $line);
  76.         echo PHP_EOL;
  77.     }
  78. }
  79.  
  80. $input = file('input.txt');
  81.  
  82. $original_grid = array();
  83.  
  84. foreach ($input as $line) {
  85.     $original_grid[] = str_split(trim($line));
  86. }
  87.  
  88.  
  89. $iterations = 10;
  90.  
  91. $grid = $original_grid;
  92.  
  93.  
  94. for($i = 0 ; $i < $iterations ; $i++) {
  95.     $new_grid = array();
  96.     for ($y = 0; $y < count($grid); $y++)
  97.     {
  98.         $new_grid[$y] = array();
  99.         for ($x = 0; $x < count($grid[$y]); $x++)
  100.         {
  101.             $new_grid[$y][$x] = get_new_state($grid, $y,$x);
  102.         }
  103.     }
  104.     $grid = $new_grid;
  105. }
  106.  
  107. printf('Part 1: %d', get_value($grid));
  108. echo PHP_EOL;
  109.  
  110. $grid = $original_grid;
  111.  
  112. $iterations = 1000;
  113. $last_diff = 0;
  114. $values = array();
  115. $found_index = 0;
  116. $found_diff = 0;
  117. for($i = 0 ; $i < $iterations ; $i++) {
  118.     $new_grid = array();
  119.     for ($y = 0; $y < count($grid); $y++)
  120.     {
  121.         $new_grid[$y] = array();
  122.         for ($x = 0; $x < count($grid[$y]); $x++)
  123.         {
  124.             $new_grid[$y][$x] = get_new_state($grid, $y,$x);
  125.         }
  126.     }
  127.     $grid = $new_grid;
  128.     $val = get_value($grid);
  129.  
  130.     $index = array_search($val, $values);
  131.     if($index) {
  132.         $diff = count($values) - $index;
  133.         if ($diff === $last_diff && $found_index === 0) {
  134.             $found_index = $index;
  135.             $found_diff = $diff;
  136.         }
  137.         $last_diff = $diff;
  138.     }
  139.     $values[$i] = $val;
  140. }
  141.  
  142. $start = 1000000000;
  143. $start -= $found_index;
  144. $start %= $found_diff;
  145. $start += $found_index-1;
  146.  
  147. printf('Part 2: %d', $values[$start]);
  148. echo PHP_EOL;
Advertisement
Add Comment
Please, Sign In to add comment