Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function getOpcode($value)
- {
- [$mode3, $mode2, $mode1, $op1, $op2] = str_split(
- str_pad($value, 5, '0', STR_PAD_LEFT)
- );
- return [$op1 . $op2, $mode1, $mode2, $mode3];
- }
- function getValue($mem, $src, $mode, $base)
- {
- if ($mode === '1') {
- return $src;
- }
- if ($mode === '2') {
- return $mem[$base + $src] ?? '0';
- }
- return $mem[$src] ?? '0';
- }
- function getLocation($src, $mode, $base)
- {
- if ($mode === '2') {
- return $base + $src;
- }
- return $src;
- }
- function work(&$mem, &$i, &$base, $input)
- {
- while ($i < count($mem)) {
- [$opcode, $mode1, $mode2, $mode3] = getOpcode($mem[$i]);
- if ($opcode === '01') {
- [$src1, $src2, $dest] = array_slice($mem, $i + 1, 3);
- $mem[getLocation($dest, $mode3, $base)] =
- getValue($mem, $src1, $mode1, $base) +
- getValue($mem, $src2, $mode2, $base);
- $i += 4;
- } elseif ($opcode === '02') {
- [$src1, $src2, $dest] = array_slice($mem, $i + 1, 3);
- $mem[getLocation($dest, $mode3, $base)] =
- getValue($mem, $src1, $mode1, $base) *
- getValue($mem, $src2, $mode2, $base);
- $i += 4;
- } elseif ($opcode === '03') {
- $dest = $mem[$i + 1];
- $mem[getLocation($dest, $mode1, $base)] = $input;
- $i += 2;
- } elseif ($opcode === '04') {
- $src1 = $mem[$i + 1];
- $i += 2;
- return getValue($mem, $src1, $mode1, $base);
- } elseif ($opcode === '05') {
- [$src1, $src2] = array_slice($mem, $i + 1, 2);
- $val1 = getValue($mem, $src1, $mode1, $base);
- if ($val1 != '0') {
- $i = getValue($mem, $src2, $mode2, $base);
- } else {
- $i += 3;
- }
- } elseif ($opcode === '06') {
- [$src1, $src2] = array_slice($mem, $i + 1, 2);
- $val1 = getValue($mem, $src1, $mode1, $base);
- if ($val1 == '0') {
- $i = getValue($mem, $src2, $mode2, $base);
- } else {
- $i += 3;
- }
- } elseif ($opcode === '07') {
- [$src1, $src2, $dest] = array_slice($mem, $i + 1, 3);
- $dest = getLocation($dest, $mode3, $base);
- if (
- getValue($mem, $src1, $mode1, $base) <
- getValue($mem, $src2, $mode2, $base)
- ) {
- $mem[$dest] = '1';
- } else {
- $mem[$dest] = '0';
- }
- $i += 4;
- } elseif ($opcode === '08') {
- [$src1, $src2, $dest] = array_slice($mem, $i + 1, 3);
- $dest = getLocation($dest, $mode3, $base);
- if (
- getValue($mem, $src1, $mode1, $base) ==
- getValue($mem, $src2, $mode2, $base)
- ) {
- $mem[$dest] = '1';
- } else {
- $mem[$dest] = '0';
- }
- $i += 4;
- } elseif ($opcode === '09') {
- $src1 = $mem[$i + 1];
- $val = getValue($mem, $src1, $mode1, $base);
- $base += $val;
- $i += 2;
- } elseif ($opcode === '99') {
- return -1;
- } else {
- echo "UNKNOWN OPCODE" . PHP_EOL;
- break;
- }
- }
- }
- $input = trim(file_get_contents('input'));
- $mem = explode(',', $input);
- $i = 0;
- $base = 0;
- $x = 0;
- $result = 0;
- $direction = 'up';
- $color = 0;
- $position = [0, 0];
- $panels = [];
- $panels[0][0] = 1;
- $count = 0;
- while (1) {
- $result = work($mem, $i, $base, getColor($panels, $position));
- if ($result === -1) {
- break;
- }
- if (!$x) {
- $color = $result;
- } else {
- $direction = switchDirection($direction, $result);
- }
- $x += 1;
- if ($x === 2) {
- $x = 0;
- $count += paint($panels, $position, $color);
- $position = move($position, $direction);
- }
- }
- printMap($panels);
- function getColor($panels, $position)
- {
- [$x, $y] = $position;
- return $panels[$y][$x] ?? 0;
- }
- function paint(&$panels, $position, $color)
- {
- [$x, $y] = $position;
- $result = isset($panels[$y][$x]) ? 0 : 1;
- $panels[$y][$x] = $color;
- return $result;
- }
- function move($position, $direction)
- {
- [$x, $y] = $position;
- switch ($direction) {
- case 'up':
- return [$x, $y - 1];
- case 'right':
- return [$x + 1, $y];
- case 'down':
- return [$x, $y + 1];
- case 'left':
- return [$x - 1, $y];
- }
- }
- function switchDirection($direction, $result)
- {
- switch ($direction) {
- case 'up':
- return !$result ? 'left' : 'right';
- case 'right':
- return !$result ? 'up' : 'down';
- case 'down':
- return !$result ? 'right' : 'left';
- case 'left':
- return !$result ? 'down' : 'up';
- }
- }
- function printMap($map)
- {
- $minY = min(array_keys($map));
- $maxY = max(array_keys($map));
- $minX = PHP_INT_MAX;
- $maxX = PHP_INT_MIN;
- foreach ($map as $y => $xValues) {
- $myMin = min(array_keys($xValues));
- $myMax = max(array_keys($xValues));
- if ($myMin < $minX) {
- $minX = $myMin;
- }
- if ($myMax > $maxX) {
- $maxX = $myMax;
- }
- }
- for ($y = $minY; $y <= $maxY; $y += 1) {
- for ($x = $minX; $x <= $maxX; $x += 1) {
- $color = $map[$y][$x] ?? 0;
- if (!$color) {
- echo ' ';
- } else {
- echo '#';
- }
- }
- echo "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement