advent_of_code_2019/day_12/functions.php

66 lines
1.9 KiB
PHP

<?php
/**
* @param Moon[] $moons
*/
function calculateVelocity(array $moons)
{
foreach ($moons as $i => $base_moon) {
foreach ($moons as $j => $target_moon) {
if ($i === $j) {
// same planet
continue;
}
$velocity_x = $base_moon->getVelocity()->getX();
$velocity_y = $base_moon->getVelocity()->getY();
$velocity_z = $base_moon->getVelocity()->getZ();
if ($base_moon->getX() > $target_moon->getX()) {
--$velocity_x;
} elseif ($base_moon->getX() < $target_moon->getX()) {
++$velocity_x;
}
if ($base_moon->getY() > $target_moon->getY()) {
--$velocity_y;
} elseif ($base_moon->getY() < $target_moon->getY()) {
++$velocity_y;
}
if ($base_moon->getZ() > $target_moon->getZ()) {
--$velocity_z;
} elseif ($base_moon->getZ() < $target_moon->getZ()) {
++$velocity_z;
}
$base_moon->getVelocity()->setX($velocity_x)->setY($velocity_y)->setZ($velocity_z);
}
}
}
/**
* @param Moon[] $moons
*/
function updateCoordinates(array $moons)
{
foreach ($moons as $moon) {
$moon->setX($moon->getX() + $moon->getVelocity()->getX());
$moon->setY($moon->getY() + $moon->getVelocity()->getY());
$moon->setZ($moon->getZ() + $moon->getVelocity()->getZ());
}
}
/**
* @param Moon[] $moons
* @return float|int
*/
function calculateEnergy(array $moons)
{
$energy = 0;
foreach ($moons as $moon) {
$pot = abs($moon->getX()) + abs($moon->getY()) + abs($moon->getZ());
$velocity = $moon->getVelocity();
$kin = abs($velocity->getX()) + abs($velocity->getY()) + abs($velocity->getZ());
$energy += $pot * $kin;
}
return $energy;
}