[php] AOC day 11

Viewer

copydownloadembedprintName: AOC day 11
  1. #!/usr/local/bin/php
  2. <?php
  3.  
  4. class RainRisk {
  5.     private $nav;
  6.  
  7.     public function __construct() {
  8.         $this->nav = file(__DIR__.'/input.txt');
  9.         $this->nav = array_map('trim', $this->nav);
  10.     }
  11.  
  12.     public function part1() : int
  13.     {
  14.         $pos = [
  15.             'x' => 0,
  16.             'y' => 0,
  17.         ];
  18.         $orient = [
  19.             'x' => 1,
  20.             'y' => 0,
  21.         ];
  22.         foreach ($this->nav as $step) {
  23.             $split = [];
  24.             preg_match('/^([NSEWLRF])([0-9]+)$/', $step, $split);
  25.             $val = intval($split[2]);
  26.             switch ($split[1]) {
  27.                 case 'N':
  28.                     $pos['y'] += $val;
  29.                     break;
  30.                 case 'S':
  31.                     $pos['y'] -= $val;
  32.                     break;
  33.                 case 'E':
  34.                     $pos['x'] += $val;
  35.                     break;
  36.                 case 'W':
  37.                     $pos['x'] -= $val;
  38.                     break;
  39.                 case 'L':
  40.                     for ($rot=$val/90; $rot > 0; $rot--) {
  41.                         $orient = ['x' => -1 * $orient['y'], 'y' => $orient['x']];
  42.                     }
  43.                     // echo ("($orient[x],$orient[y])\n");
  44.                     break;
  45.                 case 'R':
  46.                     for ($rot=$val/90; $rot > 0; $rot--) {
  47.                         $orient = ['x' => $orient['y'], 'y' => -1 * $orient['x']];
  48.                     }
  49.                     // echo ("($orient[x],$orient[y])\n");
  50.                     break;
  51.                 case 'F':
  52.                     // echo ("facing ($orient[x],$orient[y])\n");
  53.                     $pos['x'] += $val * $orient['x'];
  54.                     $pos['y'] += $val * $orient['y'];
  55.                     break;
  56.             }
  57.             // echo ("$step -> ($pos[x],$pos[y])\n");
  58.         }
  59.         return abs($pos['x']) + abs($pos['y']);
  60.     }
  61.  
  62.     public function part2() : int
  63.     {
  64.         $pos = ['x' => 0, 'y' => 0];
  65.         $wp = ['x' => 10, 'y' => 1];
  66.  
  67.         foreach ($this->nav as $step) {
  68.             $split = [];
  69.             preg_match('/^([NSEWLRF])([0-9]+)$/', $step, $split);
  70.             $val = intval($split[2]);
  71.             switch ($split[1]) {
  72.                 case 'N':
  73.                     $wp['y'] += $val;
  74.                     break;
  75.                 case 'S':
  76.                     $wp['y'] -= $val;
  77.                     break;
  78.                 case 'E':
  79.                     $wp['x'] += $val;
  80.                     break;
  81.                 case 'W':
  82.                     $wp['x'] -= $val;
  83.                     break;
  84.                 case 'L':
  85.                     for ($rot=$val/90; $rot > 0; $rot--) {
  86.                         $wp = ['x' => -1 * $wp['y'], 'y' => $wp['x']];
  87.                     }
  88.                     break;
  89.                 case 'R':
  90.                     for ($rot=$val/90; $rot > 0; $rot--) {
  91.                         $wp = ['x' => $wp['y'], 'y' => -1 * $wp['x']];
  92.                     }
  93.                     break;
  94.                 case 'F':
  95.                     $pos['x'] += $val * $wp['x'];
  96.                     $pos['y'] += $val * $wp['y'];
  97.                     break;
  98.             }
  99.             // echo ("waypoint ($wp[x],$wp[y])\n");
  100.             // echo ("$step -> ($pos[x],$pos[y])\n");
  101.         }
  102.         return abs($pos['x']) + abs($pos['y']);
  103.     }
  104. }
  105.  
  106. $rr = new RainRisk();
  107. $part1 = $rr->part1();
  108. echo("Part 1: $part1\n");
  109. $part2 = $rr->part2();
  110. echo("Part 2: $part2\n");

Editor

You can edit this paste and save as new: