Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function get_new_state($grid, $y, $x)
- {
- $xmin = max(0, $x - 1);
- $xmax = min(count($grid[$y]) - 1, $x + 1);
- $ymin = max(0, $y - 1);
- $ymax = min(count($grid) - 1, $y + 1);
- $found = array('.'=>0, '|'=>0, '#'=>0);
- for ($yy = $ymin; $yy <= $ymax; $yy++) {
- for ($xx = $xmin; $xx <= $xmax; $xx++) {
- if($x !== $xx || $y !== $yy)
- {
- $found[$grid[$yy][$xx]]++;
- }
- }
- }
- $current_state = $grid[$y][$x];
- switch ($current_state)
- {
- case '.':
- if($found['|']>2)
- {
- return '|';
- }
- break;
- case '|':
- if($found['#']>2)
- {
- return '#';
- }
- break;
- case '#':
- if($found['#']<1 || $found['|']<1)
- {
- return '.';
- }
- }
- return $current_state;
- }
- function get_value($grid)
- {
- $lumber = 0;
- $trees = 0;
- foreach ($grid as $key=>$line)
- {
- $values = array_count_values($line);
- if (isset($values['#'])) {
- $lumber += $values['#'];
- }
- if (isset($values['|'])) {
- $trees += $values['|'];
- }
- }
- return $lumber * $trees;
- }
- function print_grid($grid)
- {
- foreach ($grid as $key=>$line)
- {
- printf('%4d : ', $key);
- echo implode('', $line);
- echo PHP_EOL;
- }
- }
- $input = file('input.txt');
- $original_grid = array();
- foreach ($input as $line) {
- $original_grid[] = str_split(trim($line));
- }
- $iterations = 10;
- $grid = $original_grid;
- for($i = 0 ; $i < $iterations ; $i++) {
- $new_grid = array();
- for ($y = 0; $y < count($grid); $y++)
- {
- $new_grid[$y] = array();
- for ($x = 0; $x < count($grid[$y]); $x++)
- {
- $new_grid[$y][$x] = get_new_state($grid, $y,$x);
- }
- }
- $grid = $new_grid;
- }
- printf('Part 1: %d', get_value($grid));
- echo PHP_EOL;
- $grid = $original_grid;
- $iterations = 1000;
- $last_diff = 0;
- $values = array();
- $found_index = 0;
- $found_diff = 0;
- for($i = 0 ; $i < $iterations ; $i++) {
- $new_grid = array();
- for ($y = 0; $y < count($grid); $y++)
- {
- $new_grid[$y] = array();
- for ($x = 0; $x < count($grid[$y]); $x++)
- {
- $new_grid[$y][$x] = get_new_state($grid, $y,$x);
- }
- }
- $grid = $new_grid;
- $val = get_value($grid);
- $index = array_search($val, $values);
- if($index) {
- $diff = count($values) - $index;
- if ($diff === $last_diff && $found_index === 0) {
- $found_index = $index;
- $found_diff = $diff;
- }
- $last_diff = $diff;
- }
- $values[$i] = $val;
- }
- $start = 1000000000;
- $start -= $found_index;
- $start %= $found_diff;
- $start += $found_index-1;
- printf('Part 2: %d', $values[$start]);
- echo PHP_EOL;
Advertisement
Add Comment
Please, Sign In to add comment