diff options
| author | DJ O'Leary <dijitol@proton.me> | 2025-11-29 20:23:02 +0100 |
|---|---|---|
| committer | DJ O'Leary <dijitol@proton.me> | 2025-11-29 20:23:02 +0100 |
| commit | 4c3a50166bf0f78ce89459c352cc1c6536a8b96d (patch) | |
| tree | 02e4b66a1435680ef1e92bf82576747b27f16447 /2024/php/day_04/Grid.php | |
| parent | be2f8528b3829f8263507da301812d852297c168 (diff) | |
chore: make language folders snake_case
Diffstat (limited to '2024/php/day_04/Grid.php')
| -rw-r--r-- | 2024/php/day_04/Grid.php | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/2024/php/day_04/Grid.php b/2024/php/day_04/Grid.php new file mode 100644 index 0000000..75d531b --- /dev/null +++ b/2024/php/day_04/Grid.php @@ -0,0 +1,69 @@ +<?php + +declare(strict_types=1); + +class Grid implements Stringable +{ + /** + * @param string[][] $data + */ + public function __construct(public array $data) + { + } + + public function __toString(): string + { + $rowToLine = fn (array $row): string => array_reduce( + array: $row, + callback: fn (string $acc, string $character): string => $acc . $character, + initial: "", + ); + + return array_reduce( + array: $this->data, + callback: fn (string $acc, array $row): string => $acc . $rowToLine($row) . PHP_EOL, + initial: "", + ); + } + + public function getCharacterAtPosition(Position $position): string + { + if ($this->isInBounds($position)) { + return $this->data[$position->y][$position->x]; + } + + return "."; + } + + /** + * @param Position[] $positions + */ + public function getStringFromPositions(array $positions): string + { + $characters = array_map( + callback: fn (Position $position): string => $this->getCharacterAtPosition($position), + array: $positions, + ); + + $string = array_reduce( + array: $characters, + callback: fn (string $acc, string $character): string => $acc . $character, + initial: "", + ); + + return $string; + } + + public function isInBounds(Position $position): bool + { + if (!array_key_exists($position->y, $this->data)) { + return false; + } + + if (!array_key_exists($position->x, $this->data[$position->y])) { + return false; + } + + return true; + } +} |
