Skip to content

Commit

Permalink
[Rust/2023/16] Add solution
Browse files Browse the repository at this point in the history
  • Loading branch information
Defelo committed Dec 16, 2023
1 parent 822576d commit 6f803fd
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 3 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
|[2021](https://adventofcode.com/2021/leaderboard)|**136**|438|
|[2020](https://adventofcode.com/2020/leaderboard)|**621**|46|

## [2023](https://adventofcode.com/2023) ([<img height=18 src=".assets/rs.svg"> Rust](Rust/2023): 15/25 | [<img height=18 src=".assets/ua.png"> Uiua](Uiua/2023): 11/25 | [<img height=18 src=".assets/hs.svg"> Haskell](Haskell/2023): 4/25)
## [2023](https://adventofcode.com/2023) ([<img height=18 src=".assets/rs.svg"> Rust](Rust/2023): 16/25 | [<img height=18 src=".assets/ua.png"> Uiua](Uiua/2023): 11/25 | [<img height=18 src=".assets/hs.svg"> Haskell](Haskell/2023): 4/25)
|Mo|Tu|We|Th|Fr|Sa|Su|
|-|-|-|-|-|-|-|
|||||[**1**](https://adventofcode.com/2023/day/1) [<img height=12 src=".assets/rs.svg">](Rust/2023/01.rs "Rust solution for 2023/01") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpOdW1zIOKGkCB7Im9uZSIgInR3byIgInRocmVlIiAiZm91ciIgImZpdmUiCiAgICAgICAgInNpeCIgInNldmVuIiAiZWlnaHQiICJuaW5lIn0KRGlnaXRzIOKGkCArQDHih6E5CkZpbmQg4oaQIC8rIMOXKzHih6E5IOKJoeKKkOKMlQpFeHRyYWN0IOKGkCArw5cxMCDiiKniiqLiioPiiJjih4wg4pa94omgMC4KCsKw4oqfLysg4oqcKOKKnyDiiKlFeHRyYWN0IOKKg-KGpeKImCDiiKlGaW5kIERpZ2l0cyxOdW1zwqQp4omgQFxuLgo= "Uiua solution for 2023/01")|[**2**](https://adventofcode.com/2023/day/2) [<img height=12 src=".assets/rs.svg">](Rust/2023/02.rs "Rust solution for 2023/02") [<img height=12 src=".assets/hs.svg">](Haskell/2023/02.hs "Haskell solution for 2023/02") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpDb2xvcnMg4oaQIHsicmVkIiAiZ3JlZW4iICJibHVlIn0KUGFyc2VDb3VudCDihpAg4oqX4oqZQ29sb3JzIOKKmeKKkOKLlSDCsOKKn-KHjCDiipzilqHiiaBAIC4KUGFyc2VSb3VuZCDihpAgLyviipwow5firJow4oavwqQzwrDiippQYXJzZUNvdW50KeKJoEAsLgpQYXJzZUdhbWUg4oaQIOKKnFBhcnNlUm91bmTiiaBAOy4g4oaYKzLiipdAOi4KCuKKnCgv4oalUGFyc2VHYW1lKeKJoEBcbi4K4oipLysg4oqDL8OXKMOXKzHih6Hip7suL8OX4omkMTJfMTNfMTQp4o2JCg== "Uiua solution for 2023/02")|[**3**](https://adventofcode.com/2023/day/3) [<img height=12 src=".assets/rs.svg">](Rust/2023/03.rs "Rust solution for 2023/03") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpOdW1zIOKGkCAoCiAg4oiKOitAMOKHoTEwCiAgw5fCrOKsmjDihrswX8KvMS4uCiAgw5fijZzima1cKwopClN5bWJvbHMg4oaQIMOX4oqDKOKJoEAuKSg9ME51bXMpCkdlYXJzIOKGkCA9QCoKTmVpZ2hib3JzIOKGkCDiiaEow5firJow4oa7KeKYhzEtMeKHoTNfM-KIqcKkCkEg4oaQICgKICBOZWlnaGJvcnMg4oqDU3ltYm9scyBOdW1zCiAg4oqP4oqd4pmtL-KGpQopCkIg4oaQICgKICBOZWlnaGJvcnMg4oqDTnVtcyBHZWFycwogIOKYhzHijYkKICDirJow4omhKOKWvT0y4qe7LuKWveKJoDAu4oqdKQogIOKJoS_Dl-KJoeKKj-KKmcKkCikKCuKKgyjiipziiJjiiaBAXG4uKSjiioIw4omh4ouV4pmtIHJlZ2V4ICJcXGQrIikK4oipLysg4oqDQiBBCg== "Uiua solution for 2023/03")|
|[**4**](https://adventofcode.com/2023/day/4) [<img height=12 src=".assets/rs.svg">](Rust/2023/04.rs "Rust solution for 2023/04") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpQYXJzZUNhcmQg4oaQIOKIqcKw4pahwrDiip8g4oqcKOKWoeKKnOKLleKJoEAgLiniiaBAfC4g4oaYKzLiipdAOi4KTWF0Y2hlcyDihpAg4qe74pa94oiKLApQb2ludHMg4oaQIOKMiuKBv-KKmTItMQpXaW5NYXRyaXgg4oaQIOKsmjDiiaEo4oqCMeKKguKIqeKGr-KKmSgw4oqZMSkpIOKHoeKnuy7iioIwCkEg4oaQIC8r4omhUG9pbnRzCkIg4oaQIOKKojsg4o2l4oqD4oiYKC8rw5cp4qe7LiDiioPiiJgowqziiqIpIFdpbk1hdHJpeAoK4oqDQiBBIOKKnChNYXRjaGVzIFBhcnNlQ2FyZCniiaBAXG4uCg== "Uiua solution for 2023/04")|[**5**](https://adventofcode.com/2023/day/5) [<img height=12 src=".assets/rs.svg">](Rust/2023/05.rs "Rust solution for 2023/05") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpQYXJzZVNlZWRzIOKGkCDiiaHii5Xihpgx4oqc4pah4omgQCAuwrDilqHiiqIKUGFyc2VSYW5nZU1hcCDihpAg4o2cwrBb4oqZ4oqZ4oiYXeKKgygtOnzii4XiiJh84ouFKyniipzii5XiiaBAIC4KUGFyc2VNYXBzIOKGkCDiiaEo4pah4omh4oqQUGFyc2VSYW5nZU1hcOKGmDHiipzilqHiiaBAXG4uwrDilqEpIOKGmDEKQ29udGFpbnMg4oaQIOKJjTFfMOKJpApGaW5kUmFuZ2VNYXAg4oaQIOKKouKKmuKKguKKmTEg4omhQ29udGFpbnMg4oqZ4o2c4o2JKOKGmDEpCk1hcE51bSDihpAgK-KKoeKKg0ZpbmRSYW5nZU1hcCjiioLiipkw4oqi4o2JOikKU2VlZFJhbmdlcyDihpAg4o2cKMKw4oqf4o2JKeKKg-KImCsg4oavwq8xXzIKSW50ZXJzZWN0IOKGkCDiip_iipMv4oalL-KGp-KNnOKKn-KNiQpJc0VtcHR5IOKGkCAv4omkClNwbGl0QXQg4oaQIOKKgyjihqfiioLiiJ4pKOKGpeKKgjrCr-KInikKTWFwU2VlZFJhbmdlIOKGkCAoCiAgwqQr4oqZKOKKmeKKnyA64oqZSW50ZXJzZWN0IOKIqVNwbGl0QXQg4oqZLCkgwrBb4oqZ4oqZ4oiYXToKICDiiKko4pa9wqziiaFJc0VtcHR5LikKKQpGbGF0TWFwU2VlZFJhbmdlcyDihpAgO-KIpyjiioPii4XiiJgo4oip4oqC4oqZOjpNYXBTZWVkUmFuZ2UpKSDiipniipkoLuKGrzBfMltdKQpNYXBTZWVkUmFuZ2VzIOKGkCDiioLiiKco4oqZ4oqCRmxhdE1hcFNlZWRSYW5nZXM6KSA64oqZ4oqZKOKGrzBfMltdKQpBIOKGkCAv4oan4omhKOKIpyhNYXBOdW06wrDilqEpOikg4oqZwqQKQiDihpAgL-KGp-KKouKNiSDiiKcoTWFwU2VlZFJhbmdlczrCsOKWoSkgOlNlZWRSYW5nZXMKCuKKg0IgQSDiioNQYXJzZVNlZWRzIFBhcnNlTWFwcyDiipzilqHCrOKMlSJcblxuIi4K "Uiua solution for 2023/05")|[**6**](https://adventofcode.com/2023/day/6) [<img height=12 src=".assets/rs.svg">](Rust/2023/06.rs "Rust solution for 2023/06") [<img height=12 src=".assets/hs.svg">](Haskell/2023/06.hs "Haskell solution for 2023/06") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpTb2x2ZSDihpAgKAogIMKw4oqf4oeMCiAgLeKKkyjDlzR84oG_Mi4pCiAg4oqD4oiYKOKMiuKImikKICA94oG_MiwKICAr4oqDLSjil78yKysrMSkKKQoK4oqcKOKKnOKLleKJoEAgLuKGmCsx4oqXQDouKeKJoEBcbi4K4oqDKFNvbHZlIOKJoS8o4ouV4oqC4oipwrDii5UpKSAoL8OX4omhU29sdmXijYkpCg== "Uiua solution for 2023/06")|[**7**](https://adventofcode.com/2023/day/7) [<img height=12 src=".assets/rs.svg">](Rust/2023/07.rs "Rust solution for 2023/07") [<img height=12 src=".assets/hs.svg">](Haskell/2023/07.hs "Haskell solution for 2023/07") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpQYXJzZUNhcmQg4oaQICsy4oqX4oqZIjIzNDU2Nzg5VEpRS0EiClBhcnNlSGFuZCDihpAg4oqC4oqTKFBhcnNlQ2FyZMKw4pahfOKLlSnCsOKKnyDiipzilqHiiaBAIC4KQ291bnRDYXJkcyDihpAgwqTirJow4oavWzRdIOKGmDEg4oqP4o2WLiDiipXip7viipsuIOKWveKJoDAuCkhhbmRUeXBlIOKGkCAt4oqZNuKKouKKmiDiiaHiiY1bCiAgMF8wXzBfMCAxXzBfMF8wCiAgMl8wXzBfMCAxXzFfMF8wCiAgMl8xXzBfMCAxXzFfMV8wCiAgMV8xXzFfMV0gQ291bnRDYXJkcwpTb3J0IOKGkCDiio_ijY8g4omhKOKKgkhhbmRUeXBlLuKGmMKvMSkgLgpSZXBsYWNlSm9rZXJzIOKGkCDijZwo4oaYwq8xKSjDl-KJoDExLikKCuKKnFBhcnNlSGFuZOKJoEBcbi4K4omhUmVwbGFjZUpva2Vycy4K4oipKC8rw5cgKzHih6Hip7suIOKKouKHjOKNiSBTb3J0KQo= "Uiua solution for 2023/07")|[**8**](https://adventofcode.com/2023/day/8) [<img height=12 src=".assets/rs.svg">](Rust/2023/08.rs "Rust solution for 2023/08") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpQYXJzZUluc3RydWN0aW9ucyDihpAgPUBSwrDilqHiiqIKUGFyc2VOb2RlIOKGkCDihpgx4oqicmVnZXgiKFteICxdKykgPSBcXCgoW14gLF0rKSwgKFteICxdKylcXCkiClBhcnNlTmV0d29yayDihpAg4omhUGFyc2VOb2RlIOKGmDEKUmVwbGFjZU5hbWVzIOKGkCDijZzijYko4oqX4oqDKOKGmDEp4oqiKQpGaW5kU3RhcnRBbmRHb2FsIOKGkCDiiKko4oqX4pahKSAiQUFBIiwiWlpaIuKKouKNiQpTdGFydEFuZEdvYWxNYXNrIOKGkCDiiKk9QEEsQFriiaEo4oqi4oeMKeKKouKNiQpTdGVwIOKGkCDiioMo4oqP4oqDKOKKj-KXv-Knuyzii4Xiipnii4Xii4XiiJh84oqP4oqZ4ouF4ouF4oiYKXwrMeKLheKImHzii4Xii4XiipniipniiJgpClJ1biEg4oaQIOKLheKKmeKLheKLhTsg4o2iU3RlcCjCrF4zKSDiipkwCkxDTSDihpAgw7c74oqD4o2i4oqD4pe_4oiYwrHDlwpBIOKGkCBSdW4hKD3iipnii4XiiJgpIEZpbmRTdGFydEFuZEdvYWwKQiDihpAgL0xDTSDiiaEoUnVuISjiio_iipnii4XiiJgpKSDiipMo4oqafMKkfMKkfMKkKSBTdGFydEFuZEdvYWxNYXNrCgriipzilqHiiaBAXG4uCuKKg1BhcnNlTmV0d29yayBQYXJzZUluc3RydWN0aW9ucwriioNCIEEg4oqD4oiYUmVwbGFjZU5hbWVzCg== "Uiua solution for 2023/08")|[**9**](https://adventofcode.com/2023/day/9) [<img height=12 src=".assets/rs.svg">](Rust/2023/09.rs "Rust solution for 2023/09") [<img height=12 src=".assets/hs.svg">](Haskell/2023/09.hs "Haskell solution for 2023/09") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgrijYniipwo4oqc4ouV4omgQCAuKeKJoEBcbi4K4oipKC8r4pmtWzvijaXiioMo4omhLy3il6syKSjiiqLih4wpXS0x4qe7Likg4oeMLgo= "Uiua solution for 2023/09")|[**10**](https://adventofcode.com/2023/day/10) [<img height=12 src=".assets/rs.svg">](Rust/2023/10.rs "Rust solution for 2023/10")|
|[**11**](https://adventofcode.com/2023/day/11) [<img height=12 src=".assets/rs.svg">](Rust/2023/11.rs "Rust solution for 2023/11") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpFeHBhbmQg4oaQIOKWvTriiKko4piHwq8yKeKKnuKKn-KIqShcKysxw5ctMTovw5fCrCnijYksLCwKCj1AI-KKnOKImOKJoEBcbi4K4oqDKEV4cGFuZCAxMDAwMDAwKShFeHBhbmQgMikK4oipKMO3Mi8r4pmt4oqgKC8r4oy1LSkuKQo= "Uiua solution for 2023/11")|[**12**](https://adventofcode.com/2023/day/12) [<img height=12 src=".assets/rs.svg">](Rust/2023/12.rs "Rust solution for 2023/12")|[**13**](https://adventofcode.com/2023/day/13) [<img height=12 src=".assets/rs.svg">](Rust/2023/13.rs "Rust solution for 2023/13") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpNaXNtYXRjaGVzIOKGkCAvK-KZreKJoCDiiKnihpksOiDihqfiiKnip7ssLCDiipnih4wg4oqD4oaY4oaZClNvbHZlISDihpAgK8OXMTAwOiDiiKkoLyvDlz1eMDog4oqZ4omhTWlzbWF0Y2hlcy4g4o2cKC0xKeKHoeKKg-Knu8KkKSDijYkuCgriipwo4pah4oqc4oiY4omgQFxuLinCrOKMlSJcblxuIi4K4oipLysg4oqQ4omh4oqDU29sdmUhMSBTb2x2ZSEwCg== "Uiua solution for 2023/13")|[**14**](https://adventofcode.com/2023/day/14) [<img height=12 src=".assets/rs.svg">](Rust/2023/14.rs "Rust solution for 2023/14")|[**15**](https://adventofcode.com/2023/day/15) [<img height=12 src=".assets/rs.svg">](Rust/2023/15.rs "Rust solution for 2023/15")|[**16**](https://adventofcode.com/2023/day/16)|[**17**](https://adventofcode.com/2023/day/17)|
|[**11**](https://adventofcode.com/2023/day/11) [<img height=12 src=".assets/rs.svg">](Rust/2023/11.rs "Rust solution for 2023/11") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpFeHBhbmQg4oaQIOKWvTriiKko4piHwq8yKeKKnuKKn-KIqShcKysxw5ctMTovw5fCrCnijYksLCwKCj1AI-KKnOKImOKJoEBcbi4K4oqDKEV4cGFuZCAxMDAwMDAwKShFeHBhbmQgMikK4oipKMO3Mi8r4pmt4oqgKC8r4oy1LSkuKQo= "Uiua solution for 2023/11")|[**12**](https://adventofcode.com/2023/day/12) [<img height=12 src=".assets/rs.svg">](Rust/2023/12.rs "Rust solution for 2023/12")|[**13**](https://adventofcode.com/2023/day/13) [<img height=12 src=".assets/rs.svg">](Rust/2023/13.rs "Rust solution for 2023/13") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgpNaXNtYXRjaGVzIOKGkCAvK-KZreKJoCDiiKnihpksOiDihqfiiKnip7ssLCDiipnih4wg4oqD4oaY4oaZClNvbHZlISDihpAgK8OXMTAwOiDiiKkoLyvDlz1eMDog4oqZ4omhTWlzbWF0Y2hlcy4g4o2cKC0xKeKHoeKKg-Knu8KkKSDijYkuCgriipwo4pah4oqc4oiY4omgQFxuLinCrOKMlSJcblxuIi4K4oipLysg4oqQ4omh4oqDU29sdmUhMSBTb2x2ZSEwCg== "Uiua solution for 2023/13")|[**14**](https://adventofcode.com/2023/day/14) [<img height=12 src=".assets/rs.svg">](Rust/2023/14.rs "Rust solution for 2023/14")|[**15**](https://adventofcode.com/2023/day/15) [<img height=12 src=".assets/rs.svg">](Rust/2023/15.rs "Rust solution for 2023/15")|[**16**](https://adventofcode.com/2023/day/16) [<img height=12 src=".assets/rs.svg">](Rust/2023/16.rs "Rust solution for 2023/16")|[**17**](https://adventofcode.com/2023/day/17)|
|[**18**](https://adventofcode.com/2023/day/18)|[**19**](https://adventofcode.com/2023/day/19)|[**20**](https://adventofcode.com/2023/day/20)|[**21**](https://adventofcode.com/2023/day/21)|[**22**](https://adventofcode.com/2023/day/22)|[**23**](https://adventofcode.com/2023/day/23)|[**24**](https://adventofcode.com/2023/day/24)|
|[**25**](https://adventofcode.com/2023/day/25)|26|27|28|29|30|31|

Expand Down
139 changes: 139 additions & 0 deletions Rust/2023/16.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
#![feature(test)]

use core::panic;

use aoc::grid::Direction;
use rayon::prelude::*;

type Input = Vec<Vec<Cell>>;
type Position = (usize, usize);

#[derive(Debug, Clone, Copy)]
enum Cell {
Empty,
Mirror1,
Mirror2,
SplitterVert,
SplitterHoriz,
}

fn setup(input: &str) -> Input {
input
.lines()
.map(|line| {
line.bytes()
.map(|b| match b {
b'.' => Cell::Empty,
b'/' => Cell::Mirror1,
b'\\' => Cell::Mirror2,
b'|' => Cell::SplitterVert,
b'-' => Cell::SplitterHoriz,
_ => panic!(),
})
.collect()
})
.collect()
}

impl Cell {
fn step1(
self,
(x, y): Position,
d: Direction,
w: usize,
h: usize,
) -> Option<(Position, Direction)> {
let d = match self {
Cell::Empty => d,
Cell::Mirror1 => match d {
Direction::North => Direction::East,
Direction::East => Direction::North,
Direction::South => Direction::West,
Direction::West => Direction::South,
},
Cell::Mirror2 => match d {
Direction::North => Direction::West,
Direction::East => Direction::South,
Direction::South => Direction::East,
Direction::West => Direction::North,
},
Cell::SplitterVert => match d {
Direction::East | Direction::West => Direction::North,
_ => d,
},
Cell::SplitterHoriz => match d {
Direction::North | Direction::South => Direction::West,
_ => d,
},
};
Some((d.step(x, y, w, h)?, d))
}

fn step2(
self,
(x, y): Position,
d: Direction,
w: usize,
h: usize,
) -> Option<(Position, Direction)> {
let d = match self {
Cell::SplitterVert => match d {
Direction::East | Direction::West => Direction::South,
_ => d,
},
Cell::SplitterHoriz => match d {
Direction::North | Direction::South => Direction::East,
_ => d,
},
_ => return None,
};
Some((d.step(x, y, w, h)?, d))
}
}

fn count(input: &Input, start: Position, direction: Direction) -> usize {
let n = input.len() * input[0].len();
let mut queue = Vec::new();
let mut visited = vec![false; n * 4];
let mut visited_tiles = vec![false; n];
queue.push((start, direction));
while let Some((p, d)) = queue.pop() {
let i = (p.0 + p.1 * input.len()) * 4 + d as usize;
if visited[i] {
continue;
}
visited[i] = true;
visited_tiles[i / 4] = true;

let c = input[p.1][p.0];
queue.extend(c.step1(p, d, input[0].len(), input.len()));
queue.extend(c.step2(p, d, input[0].len(), input.len()));
}
visited_tiles.into_iter().filter(|&x| x).count()
}

fn part1(input: &Input) -> usize {
count(input, (0, 0), Direction::East)
}

fn part2(input: &Input) -> usize {
(0..input.len())
.flat_map(|y| {
[
(0, y, Direction::East),
(input[0].len() - 1, y, Direction::West),
]
})
.chain((0..input[0].len()).flat_map(|x| {
[
(x, 0, Direction::South),
(x, input.len() - 1, Direction::North),
]
}))
.par_bridge()
.map(|(x, y, d)| count(input, (x, y), d))
.max()
.unwrap()
}

aoc::main!(2023, 16, ex: 1);
3 changes: 3 additions & 0 deletions Rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -269,3 +269,6 @@ path = "2023/14.rs"
[[bin]]
name = "2023_15"
path = "2023/15.rs"
[[bin]]
name = "2023_16"
path = "2023/16.rs"
2 changes: 1 addition & 1 deletion Rust/lib/grid.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#[derive(Debug)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Direction {
North,
East,
Expand Down
10 changes: 10 additions & 0 deletions examples/2023/16/1
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|....
1 change: 1 addition & 0 deletions examples/2023/16/1.1
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
46
1 change: 1 addition & 0 deletions examples/2023/16/1.2
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
51

0 comments on commit 6f803fd

Please sign in to comment.