Add day 1 '22 solution
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
64597b0860
commit
d91701b50f
2252
data/Y22/day1/data.txt
Normal file
2252
data/Y22/day1/data.txt
Normal file
File diff suppressed because it is too large
Load Diff
14
data/Y22/day1/example.txt
Normal file
14
data/Y22/day1/example.txt
Normal file
@ -0,0 +1,14 @@
|
||||
1000
|
||||
2000
|
||||
3000
|
||||
|
||||
4000
|
||||
|
||||
5000
|
||||
6000
|
||||
|
||||
7000
|
||||
8000
|
||||
9000
|
||||
|
||||
10000
|
57
data/Y22/day1/puzzle.md
Normal file
57
data/Y22/day1/puzzle.md
Normal file
@ -0,0 +1,57 @@
|
||||
# Day 1: Calorie Counting
|
||||
|
||||
[https://adventofcode.com/2022/day/1](https://adventofcode.com/2022/day/1)
|
||||
|
||||
## Description
|
||||
|
||||
### Part One
|
||||
|
||||
Santa's reindeer typically eat regular reindeer food, but they need a lot of [magical energy](https://adventofcode.com/2018/day/25) to deliver presents on Christmas. For that, their favorite snack is a special type of _star_ fruit that only grows deep in the jungle. The Elves have brought you on their annual expedition to the grove where the fruit grows.
|
||||
|
||||
To supply enough magical energy, the expedition needs to retrieve a minimum of _fifty stars_ by December 25th. Although the Elves assure you that the grove has plenty of fruit, you decide to grab any fruit you see along the way, just in case.
|
||||
|
||||
Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants _one star_. Good luck!
|
||||
|
||||
The jungle must be too overgrown and difficult to navigate in vehicles or access from the air; the Elves' expedition traditionally goes on foot. As your boats approach land, the Elves begin taking inventory of their supplies. One important consideration is food - in particular, the number of _Calories_ each Elf is carrying (your puzzle input).
|
||||
|
||||
The Elves take turns writing down the number of Calories contained by the various meals, snacks, rations, <span title="By "etc", you're pretty sure they just mean "more snacks".">etc.</span> that they've brought with them, one item per line. Each Elf separates their own inventory from the previous Elf's inventory (if any) by a blank line.
|
||||
|
||||
For example, suppose the Elves finish writing their items' Calories and end up with the following list:
|
||||
|
||||
1000
|
||||
2000
|
||||
3000
|
||||
|
||||
4000
|
||||
|
||||
5000
|
||||
6000
|
||||
|
||||
7000
|
||||
8000
|
||||
9000
|
||||
|
||||
10000
|
||||
|
||||
|
||||
This list represents the Calories of the food carried by five Elves:
|
||||
|
||||
* The first Elf is carrying food with `1000`, `2000`, and `3000` Calories, a total of `6000` Calories.
|
||||
* The second Elf is carrying one food item with `4000` Calories.
|
||||
* The third Elf is carrying food with `5000` and `6000` Calories, a total of `11000` Calories.
|
||||
* The fourth Elf is carrying food with `7000`, `8000`, and `9000` Calories, a total of `24000` Calories.
|
||||
* The fifth Elf is carrying one food item with `10000` Calories.
|
||||
|
||||
In case the Elves get hungry and need extra snacks, they need to know which Elf to ask: they'd like to know how many Calories are being carried by the Elf carrying the _most_ Calories. In the example above, this is `24000` (carried by the fourth Elf).
|
||||
|
||||
Find the Elf carrying the most Calories. _How many total Calories is that Elf carrying?_
|
||||
|
||||
### Part Two
|
||||
|
||||
By the time you calculate the answer to the Elves' question, they've already realized that the Elf carrying the most Calories of food might eventually _run out of snacks_.
|
||||
|
||||
To avoid this unacceptable situation, the Elves would instead like to know the total Calories carried by the _top three_ Elves carrying the most Calories. That way, even if one of those Elves runs out of snacks, they still have two backups.
|
||||
|
||||
In the example above, the top three Elves are the fourth Elf (with `24000` Calories), then the third Elf (with `11000` Calories), then the fifth Elf (with `10000` Calories). The sum of the Calories carried by these three elves is `45000`.
|
||||
|
||||
Find the top three Elves carrying the most Calories. _How many Calories are those Elves carrying in total?_
|
@ -14,6 +14,11 @@ abstract class Solution
|
||||
|
||||
public static int|string|null $part2Result = null;
|
||||
|
||||
/**
|
||||
* @var bool When false, do not apply the `array_filter` function when the data is loaded.
|
||||
*/
|
||||
public bool $filterDataOnLoad = true;
|
||||
|
||||
/**
|
||||
* @var string[] The data to use.
|
||||
*
|
||||
@ -60,14 +65,14 @@ abstract class Solution
|
||||
if (file_exists($dataFile)) {
|
||||
$data = file_get_contents($dataFile);
|
||||
if ($data !== false) {
|
||||
$this->data = array_filter(explode(PHP_EOL, $data));
|
||||
$this->data = $this->filterDataOnLoad ? array_filter(explode(PHP_EOL, $data)) : explode(PHP_EOL, $data);
|
||||
}
|
||||
}
|
||||
|
||||
if (file_exists($dataExampleFile)) {
|
||||
$data = file_get_contents($dataExampleFile);
|
||||
if ($data !== false) {
|
||||
$this->exampleData = array_filter(explode(PHP_EOL, $data));
|
||||
$this->exampleData = $this->filterDataOnLoad ? array_filter(explode(PHP_EOL, $data)) : explode(PHP_EOL, $data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
55
src/Y22/Day1.php
Normal file
55
src/Y22/Day1.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
namespace trizz\AdventOfCode\Y22;
|
||||
|
||||
use trizz\AdventOfCode\Solution;
|
||||
|
||||
final class Day1 extends Solution
|
||||
{
|
||||
public static int|string|null $part1ExampleResult = 24000;
|
||||
|
||||
public static int|string|null $part1Result = 72240;
|
||||
|
||||
public static int|string|null $part2ExampleResult = 45000;
|
||||
|
||||
public static int|string|null $part2Result = 210957;
|
||||
|
||||
public bool $filterDataOnLoad = false;
|
||||
|
||||
public function part1(array $data): int
|
||||
{
|
||||
return $this->calculateCalories($data)[0];
|
||||
}
|
||||
|
||||
public function part2(array $data): int
|
||||
{
|
||||
$results = $this->calculateCalories($data);
|
||||
|
||||
return $results[0] + $results[1] + $results[2];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string[] $data
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
private function calculateCalories(array $data): array
|
||||
{
|
||||
$results = [];
|
||||
$tmpResult = 0;
|
||||
foreach ($data as $value) {
|
||||
if ($value !== '') {
|
||||
$tmpResult += (int) $value;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$results[] = $tmpResult;
|
||||
$tmpResult = 0;
|
||||
}
|
||||
|
||||
rsort($results);
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user