71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
$instructions = explode("\n", file_get_contents('input.txt'));
 | 
						|
 | 
						|
const NORTH = 'N';
 | 
						|
const SOUTH = 'S';
 | 
						|
const EAST = 'E';
 | 
						|
const WEST = 'W';
 | 
						|
const LEFT = 'L';
 | 
						|
const RIGHT = 'R';
 | 
						|
const FORWARD = 'F';
 | 
						|
 | 
						|
$facings = [NORTH, EAST, SOUTH, WEST];
 | 
						|
 | 
						|
$facing = EAST;
 | 
						|
$east = 0;
 | 
						|
$north = 0;
 | 
						|
 | 
						|
function doingInstruction($direction, $value)
 | 
						|
{
 | 
						|
    global $north, $east, $facings, $facing;
 | 
						|
    switch ($direction) {
 | 
						|
        case NORTH:
 | 
						|
            $north += $value;
 | 
						|
            break;
 | 
						|
        case SOUTH:
 | 
						|
            $north -= $value;
 | 
						|
            break;
 | 
						|
        case EAST:
 | 
						|
            $east += $value;
 | 
						|
            break;
 | 
						|
        case WEST:
 | 
						|
            $east -= $value;
 | 
						|
            break;
 | 
						|
        case LEFT:
 | 
						|
            $turns = $value / 90;
 | 
						|
            $array_position = array_search($facing, $facings);
 | 
						|
            $array_max = 4;
 | 
						|
            for ($i = $turns; $i > 0; $i--) {
 | 
						|
                $array_position--;
 | 
						|
                if ($array_position === -1) {
 | 
						|
                    $array_position = $array_max - 1;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            $facing = $facings[$array_position];
 | 
						|
            break;
 | 
						|
        case RIGHT:
 | 
						|
            $turns = $value / 90;
 | 
						|
            $array_position = array_search($facing, $facings);
 | 
						|
            $array_max = 4;
 | 
						|
            for ($i = 0; $i < $turns; $i++) {
 | 
						|
                $array_position++;
 | 
						|
                if ($array_position === $array_max) {
 | 
						|
                    $array_position = 0;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            $facing = $facings[$array_position];
 | 
						|
            break;
 | 
						|
        case FORWARD:
 | 
						|
            doingInstruction($facing, (int)$value);
 | 
						|
            break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
foreach ($instructions as $instruction) {
 | 
						|
    $direction = $instruction[0];
 | 
						|
    $value = (int)substr($instruction, 1);
 | 
						|
    doingInstruction($direction, $value);
 | 
						|
}
 | 
						|
 | 
						|
echo abs($east) + abs($north); |