Rust/2024/12: add solution
This commit is contained in:
parent
3f0f5ecf6f
commit
62895a598d
19 changed files with 166 additions and 3 deletions
|
@ -9,12 +9,12 @@
|
|||
|[2021](https://adventofcode.com/2021/leaderboard)|**136**|438|13.41% (of 1014)|0.0532% (of ≥255548)|
|
||||
|[2020](https://adventofcode.com/2020/leaderboard)|**621**|46|65.23% (of 952)|0.3146% (of ≥197402)|
|
||||
|
||||
## [2024](https://adventofcode.com/2024) ([<img height=18 src=".assets/rs.svg"> Rust](Rust/2024): 11/25 | [<img height=18 src=".assets/ua.png"> Uiua](Uiua/2024): 10/25 | [<img height=18 src=".assets/rb.svg"> Ruby](Ruby/2024): 5/25 | [<img height=18 src=".assets/hs.svg"> Haskell](Haskell/2024): 4/25 | [<img height=18 src=".assets/nix.svg"> Nix](Nix/2024): 1/25)
|
||||
## [2024](https://adventofcode.com/2024) ([<img height=18 src=".assets/rs.svg"> Rust](Rust/2024): 12/25 | [<img height=18 src=".assets/ua.png"> Uiua](Uiua/2024): 10/25 | [<img height=18 src=".assets/rb.svg"> Ruby](Ruby/2024): 5/25 | [<img height=18 src=".assets/hs.svg"> Haskell](Haskell/2024): 4/25 | [<img height=18 src=".assets/nix.svg"> Nix](Nix/2024): 1/25)
|
||||
|Mo|Tu|We|Th|Fr|Sa|Su|
|
||||
|-|-|-|-|-|-|-|
|
||||
|||||||[**1**](https://adventofcode.com/2024/day/1) [<img height=12 src=".assets/rs.svg">](Rust/2024/01.rs "Rust solution for 2024/01") [<img height=12 src=".assets/hs.svg">](Haskell/2024/01.hs "Haskell solution for 2024/01") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgrCsOKKn-KNieKKnOKKnOKLleKIqeKJoEBcbixAIC4K4oipLyviioMo4pmtw5fiip7iirg9fOKMtS3iiKnijYYpCg== "Uiua solution for 2024/01") [<img height=12 src=".assets/nix.svg">](Nix/2024/01.nix "Nix solution for 2024/01") [<img height=12 src=".assets/rb.svg">](Ruby/2024/01.rb "Ruby solution for 2024/01")|
|
||||
|[**2**](https://adventofcode.com/2024/day/2) [<img height=12 src=".assets/rs.svg">](Rust/2024/02.rs "Rust solution for 2024/02") [<img height=12 src=".assets/hs.svg">](Haskell/2024/02.hs "Haskell solution for 2024/02") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipwo4pah4oqc4ouVKeKIqeKJoEBcbixAIC4KCkNoZWNrIOKGkCDDl-KKgygvw5fiiaQz4oy1fOKJjcKkMeKMteKXtMKxKeKniC0K4oipLyviiaHil4fiioMoL-KGpeKJoShDaGVja-KWvSniip7iiaAu4oeh4qe74p-cwqR8Q2hlY2spCg== "Uiua solution for 2024/02") [<img height=12 src=".assets/rb.svg">](Ruby/2024/02.rb "Ruby solution for 2024/02")|[**3**](https://adventofcode.com/2024/day/3) [<img height=12 src=".assets/rs.svg">](Rust/2024/03.rs "Rust solution for 2024/03") [<img height=12 src=".assets/hs.svg">](Haskell/2024/03.hs "Haskell solution for 2024/03") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgrilr3irJoxXCjihqXihqfiipnCsOKKnynijYniip_CrOKIqeKMlSJkb24ndCgpIiwiZG8oKSIuLgriiKkoLysvw5fii5Xihpgx4o2JcmVnZXgibXVsXFwoKFxcZCspLChcXGQrKVxcKSIpCg== "Uiua solution for 2024/03") [<img height=12 src=".assets/rb.svg">](Ruby/2024/03.rb "Ruby solution for 2024/03")|[**4**](https://adventofcode.com/2024/day/4) [<img height=12 src=".assets/rs.svg">](Rust/2024/04.rs "Rust solution for 2024/04") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipziiJjiiaBAXG4uCgripLAg4oaQIOKIqeKKleKWoeKKmSzijZzima3iipviip7iioMtK-KIqeKHocKw4oqf4oq44pazCgrin5woLyviiaHil4coLyvijJUiWE1BUyIp4oqC4p-c4o2a4oeM4oqC4oqDKOKKguKksHziioLiiKniiaHilqHin5zijYkpKQovK-KZreKniCjDl-KIqSgv4oal4omh4omN4pahIk1BUyLiioLin5zijZrih4wp4qSwKTNfMwo= "Uiua solution for 2024/04") [<img height=12 src=".assets/rb.svg">](Ruby/2024/04.rb "Ruby solution for 2024/04")|[**5**](https://adventofcode.com/2024/day/5) [<img height=12 src=".assets/rs.svg">](Rust/2024/05.rs "Rust solution for 2024/05") [<img height=12 src=".assets/hs.svg">](Haskell/2024/05.hs "Haskell solution for 2024/05") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriioPihpjihpniiqLiiprijJUiXG5cbiIuCuKKmSjiipziipzii5XiiKniiaBAXG4sQHwuKQriipwo4pah4oqc4ouVKeKIqeKJoEBcbixALC4KCk1pbiAgICDihpAg4oqi4pa9wqziirjiiIg64p-cKOKJoeKKo-KWveKIiOKKmeKKuOKJoeKKoikKUmVtb3ZlIOKGkCDiioLiioMo4oaZfOKGmCsxKeKKouKKmuKKuD0KU29ydCAgIOKGkCDiipnii4Xil4zijaIo4oqD4oqC4ouFUmVtb3Zl4oqZ4pehTWlufOKJoDDip7vil4wpW10KTWlkICAgIOKGkCDiio_ijIrDtzLiirjip7sKCuKIqSgvK-KJoeKXh01pZOKWvSkgwqwsLOKKuOKJoeKJjSDin5zijZpTb3J04oqZwqQK "Uiua solution for 2024/05") [<img height=12 src=".assets/rb.svg">](Ruby/2024/05.rb "Ruby solution for 2024/05")|[**6**](https://adventofcode.com/2024/day/6) [<img height=12 src=".assets/rs.svg">](Rust/2024/06.rs "Rust solution for 2024/06") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipziiJjiiaBAXG4uCgpJbml0ICDihpAgwq8xXzDiiqLiipo9QF4KU3RlcCAg4oaQIOKorCjin5wrfOKHjOKNnOKKosKvKT1AI-KXoSjirJpALuKKoSspClZhbGlkIOKGkCAvw5fDl-KIqT7CrzEu4oqZ4pazCgptYXAuW10g4oq4SW5pdAomcOKKuOKnuyDiipnii4Xil4zijaIo4oqDKGluc2VydOKKmTA64oqZ4peMfOKLhVN0ZXApfOKLheKLhVZhbGlkKQoKU2tpcEZvcndhcmQg4oaQIOKNoijin5wrfMOX4oqDKOKLhVZhbGlkfOKJoEAj4qyaQC7iiqErKSkKQ2hlY2tDeWNsZSDihpAgKAogIG1hcC5bXSDiirhJbml0CiAg4o2iKOKKgyhpbnNlcnTiipkwOuKKmeKKgnzih4zijZziiqLCr1NraXBGb3J3YXJk4peMKXzCrGhhc-KWoTriipniioIpCiAgVmFsaWTii4Xil4wKKQoK4pa9PUAu4peh4oqh4oqZ4peMwrBtYXAKJnAgLyviiaF3YWl04omhcG9vbChDaGVja0N5Y2xl4o2c4oqh4ouFQCMp4oqZwqQK "Uiua solution for 2024/06")|[**7**](https://adventofcode.com/2024/day/7) [<img height=12 src=".assets/rs.svg">](Rust/2024/07.rs "Rust solution for 2024/07") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=IyBFeHBlcmltZW50YWwhCgomc2MKCuKKnCjiipnilqHCsOKKguKKnOKLlSniiaBAXG4swqziirjiiIgiOiAiCgpDaGVjayEg4oaQIHwyIOKNoygKICA94oqZwrDCpAp8IOKNoyjijaQuLkNoZWNrIV4w4o2c4oipKOKHjMKw4ouVKeKMneKKgl4wfOKNpC4uQ2hlY2shXjDijaQuPTDiioPil7_Dt3xDaGVjayFeMC0pIDriipnijZzih4zCsOKKgikKCuKIqSgvK8OXKeKJoSjin5w64p-c4oqDQ2hlY2sh4oiYQ2hlY2shKOKNpC4wKeKKmcKw4pahKQo= "Uiua solution for 2024/07")|[**8**](https://adventofcode.com/2024/day/8) [<img height=12 src=".assets/rs.svg">](Rust/2024/08.rs "Rust solution for 2024/08") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipziiJjiiaBAXG4uCgpWYWxpZCDihpAgL8OXw5fiiKk-wq8xLgpXYWxrICDihpAg4oqZ4ouF4ouF4peM4o2iKOKKgyjiioLiipnil4x84ouF4p-cKyl84ouF4ouFVmFsaWQp4oavMC7iirgtCgriiaEo4pah4qeFPDLiipo9KeKKmcKk4pa94oq44omgQC7il7Tiirjima3in5wowqTCpOKWsykKCkEg4oaQIOKNmuKJoSjilqHilr064p-c4omhVmFsaWTiip_iiKkoK-KKuC0p4pehOsKw4oqfKQpCIOKGkCDijZriiaEo4pah4oqC4oipV2FsayDil6EoOuKKmeKKmeKImCnCsOKKnykKCuKIqSjip7vil7Qv4peH4oqC4o2aL-KXh-KKgikg4oqDQiBBCg== "Uiua solution for 2024/08")|
|
||||
|[**9**](https://adventofcode.com/2024/day/9) [<img height=12 src=".assets/rs.svg">](Rust/2024/09.rs "Rust solution for 2024/09")|[**10**](https://adventofcode.com/2024/day/10) [<img height=12 src=".assets/rs.svg">](Rust/2024/10.rs "Rust solution for 2024/10") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=IyBFeHBlcmltZW50YWwhCgomc2MKCuKKnOKJoeKLleKKuOKJoEBcbgoKTmVpZ2gg4oaQIOKWvT0rMeKKuOKKojrin5zirJow4oqhK-KKgjBb4peh4oipwq_in5zih4zih6EyXcKkCuKIqS8r4omhKOKIqeKnu-KfnOKXtOKJoeKXh-KKo-KKmeKXjGFzdGFyKE5laWdofD054oqhKSniipo9MOKfnMKkCg== "Uiua solution for 2024/10")|[**11**](https://adventofcode.com/2024/day/11) [<img height=12 src=".assets/rs.svg">](Rust/2024/11.rs "Rust solution for 2024/11") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipzii5XiirjiiIgrQDDih6ExMAoKTmV4dCAg4oaQIOKNoyjCpDHCsDB84omh4ouV4oavMl_iiJ7CsDDil78y4oq44qe7wrDii5V8wqTDlzIwMjQpCkJsaW5rIOKGkCDiiKco4oinKOKNnOKsmjBnZXQr4oqZOilOZXh0KcKwbWFw4oqZKG1hcC5bXSkKCi8r4o2lQmxpbms1MCDin5wvK-KNpUJsaW5rMjUgbWFw4oqV4oqD4oqi4qe74oq44oqbCg== "Uiua solution for 2024/11")|[**12**](https://adventofcode.com/2024/day/12)|[**13**](https://adventofcode.com/2024/day/13)|[**14**](https://adventofcode.com/2024/day/14)|[**15**](https://adventofcode.com/2024/day/15)|
|
||||
|[**9**](https://adventofcode.com/2024/day/9) [<img height=12 src=".assets/rs.svg">](Rust/2024/09.rs "Rust solution for 2024/09")|[**10**](https://adventofcode.com/2024/day/10) [<img height=12 src=".assets/rs.svg">](Rust/2024/10.rs "Rust solution for 2024/10") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=IyBFeHBlcmltZW50YWwhCgomc2MKCuKKnOKJoeKLleKKuOKJoEBcbgoKTmVpZ2gg4oaQIOKWvT0rMeKKuOKKojrin5zirJow4oqhK-KKgjBb4peh4oipwq_in5zih4zih6EyXcKkCuKIqS8r4omhKOKIqeKnu-KfnOKXtOKJoeKXh-KKo-KKmeKXjGFzdGFyKE5laWdofD054oqhKSniipo9MOKfnMKkCg== "Uiua solution for 2024/10")|[**11**](https://adventofcode.com/2024/day/11) [<img height=12 src=".assets/rs.svg">](Rust/2024/11.rs "Rust solution for 2024/11") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipzii5XiirjiiIgrQDDih6ExMAoKTmV4dCAg4oaQIOKNoyjCpDHCsDB84omh4ouV4oavMl_iiJ7CsDDil78y4oq44qe7wrDii5V8wqTDlzIwMjQpCkJsaW5rIOKGkCDiiKco4oinKOKNnOKsmjBnZXQr4oqZOilOZXh0KcKwbWFw4oqZKG1hcC5bXSkKCi8r4o2lQmxpbms1MCDin5wvK-KNpUJsaW5rMjUgbWFw4oqV4oqD4oqi4qe74oq44oqbCg== "Uiua solution for 2024/11")|[**12**](https://adventofcode.com/2024/day/12) [<img height=12 src=".assets/rs.svg">](Rust/2024/12.rs "Rust solution for 2024/12")|[**13**](https://adventofcode.com/2024/day/13)|[**14**](https://adventofcode.com/2024/day/14)|[**15**](https://adventofcode.com/2024/day/15)|
|
||||
|[**16**](https://adventofcode.com/2024/day/16)|[**17**](https://adventofcode.com/2024/day/17)|[**18**](https://adventofcode.com/2024/day/18)|[**19**](https://adventofcode.com/2024/day/19)|[**20**](https://adventofcode.com/2024/day/20)|[**21**](https://adventofcode.com/2024/day/21)|[**22**](https://adventofcode.com/2024/day/22)|
|
||||
|[**23**](https://adventofcode.com/2024/day/23)|[**24**](https://adventofcode.com/2024/day/24)|[**25**](https://adventofcode.com/2024/day/25)|26|27|28|29|
|
||||
|30|31||||||
|
||||
|
|
120
Rust/2024/12.rs
Normal file
120
Rust/2024/12.rs
Normal file
|
@ -0,0 +1,120 @@
|
|||
#![feature(test)]
|
||||
|
||||
use aoc::grid::Direction;
|
||||
use itertools::Itertools;
|
||||
|
||||
type Input = Vec<Vec<u8>>;
|
||||
|
||||
fn setup(input: &str) -> Input {
|
||||
input
|
||||
.trim()
|
||||
.lines()
|
||||
.map(|line| line.bytes().collect())
|
||||
.collect()
|
||||
}
|
||||
|
||||
struct Regions {
|
||||
area_by_id: Vec<usize>,
|
||||
id_by_idx: Vec<usize>,
|
||||
}
|
||||
|
||||
fn dfs(input: &Input) -> Regions {
|
||||
let rows = input.len();
|
||||
let cols = input[0].len();
|
||||
|
||||
let mut stack = (0..rows)
|
||||
.flat_map(|i| (0..cols).map(move |j| (i, j, usize::MAX)))
|
||||
.collect::<Vec<_>>();
|
||||
let mut visited = vec![false; rows * cols];
|
||||
|
||||
let mut regions = Regions {
|
||||
area_by_id: Vec::new(),
|
||||
id_by_idx: vec![usize::MAX; rows * cols],
|
||||
};
|
||||
|
||||
while let Some((i, j, mut region_id)) = stack.pop() {
|
||||
let idx = i * cols + j;
|
||||
if visited[idx] {
|
||||
continue;
|
||||
};
|
||||
visited[idx] = true;
|
||||
|
||||
if region_id == usize::MAX {
|
||||
region_id = regions.area_by_id.len();
|
||||
regions.area_by_id.push(0);
|
||||
}
|
||||
|
||||
regions.id_by_idx[idx] = region_id;
|
||||
regions.area_by_id[region_id] += 1;
|
||||
|
||||
stack.extend(
|
||||
Direction::iter()
|
||||
.flat_map(|d| d.step(j, i, cols, rows))
|
||||
.filter(|&(nj, ni)| input[ni][nj] == input[i][j])
|
||||
.map(|(nj, ni)| (ni, nj, region_id)),
|
||||
);
|
||||
}
|
||||
|
||||
regions
|
||||
}
|
||||
|
||||
fn part1(input: &Input) -> usize {
|
||||
let rows = input.len();
|
||||
let cols = input[0].len();
|
||||
|
||||
let regions = dfs(input);
|
||||
|
||||
let mut region_perimeters = regions
|
||||
.area_by_id
|
||||
.iter()
|
||||
.map(|&area| area * 4)
|
||||
.collect::<Vec<_>>();
|
||||
(0..rows)
|
||||
.flat_map(|i| (0..cols).map(move |j| (i, j)))
|
||||
.for_each(|(i, j)| {
|
||||
region_perimeters[regions.id_by_idx[i * cols + j]] -= Direction::iter()
|
||||
.flat_map(|d| d.step(j, i, cols, rows))
|
||||
.filter(|&(nj, ni)| input[ni][nj] == input[i][j])
|
||||
.count();
|
||||
});
|
||||
|
||||
regions
|
||||
.area_by_id
|
||||
.into_iter()
|
||||
.zip(region_perimeters)
|
||||
.map(|(area, perimeter)| area * perimeter)
|
||||
.sum()
|
||||
}
|
||||
|
||||
fn part2(input: &Input) -> usize {
|
||||
let rows = input.len();
|
||||
let cols = input[0].len();
|
||||
|
||||
let regions = dfs(input);
|
||||
|
||||
let mut corner_counts = vec![0; regions.area_by_id.len()];
|
||||
(0..=rows)
|
||||
.flat_map(|i| (0..=cols).map(move |j| (i, j)))
|
||||
.for_each(|(i, j)| {
|
||||
[(0, 0), (0, 1), (1, 1), (1, 0)]
|
||||
.map(|(ci, cj)| {
|
||||
((1..=cols).contains(&(i + ci)) && (1..=rows).contains(&(j + cj)))
|
||||
.then(|| regions.id_by_idx[(i + ci - 1) * cols + j + cj - 1])
|
||||
.unwrap_or(usize::MAX)
|
||||
})
|
||||
.into_iter()
|
||||
.circular_tuple_windows()
|
||||
.filter(|&(a, _, _, _)| a != usize::MAX)
|
||||
.filter(|&(a, b, c, d)| a != b && a != d || a == b && a == d && a != c)
|
||||
.for_each(|(a, _, _, _)| corner_counts[a] += 1);
|
||||
});
|
||||
|
||||
regions
|
||||
.area_by_id
|
||||
.into_iter()
|
||||
.zip(corner_counts)
|
||||
.map(|(area, corners)| area * corners)
|
||||
.sum()
|
||||
}
|
||||
|
||||
aoc::main!(2024, 12, ex: 1, 2, 3, 4, 5);
|
|
@ -10,7 +10,7 @@ aoc::year! {
|
|||
"09.rs",
|
||||
"10.rs",
|
||||
"11.rs",
|
||||
// "12.rs",
|
||||
"12.rs",
|
||||
// "13.rs",
|
||||
// "14.rs",
|
||||
// "15.rs",
|
||||
|
|
|
@ -393,3 +393,6 @@ path = "2024/10.rs"
|
|||
[[bin]]
|
||||
name = "2024_11"
|
||||
path = "2024/11.rs"
|
||||
[[bin]]
|
||||
name = "2024_12"
|
||||
path = "2024/12.rs"
|
||||
|
|
4
examples/2024/12/1
Normal file
4
examples/2024/12/1
Normal file
|
@ -0,0 +1,4 @@
|
|||
AAAA
|
||||
BBCD
|
||||
BBCC
|
||||
EEEC
|
1
examples/2024/12/1.1
Normal file
1
examples/2024/12/1.1
Normal file
|
@ -0,0 +1 @@
|
|||
140
|
1
examples/2024/12/1.2
Normal file
1
examples/2024/12/1.2
Normal file
|
@ -0,0 +1 @@
|
|||
80
|
5
examples/2024/12/2
Normal file
5
examples/2024/12/2
Normal file
|
@ -0,0 +1,5 @@
|
|||
OOOOO
|
||||
OXOXO
|
||||
OOOOO
|
||||
OXOXO
|
||||
OOOOO
|
1
examples/2024/12/2.1
Normal file
1
examples/2024/12/2.1
Normal file
|
@ -0,0 +1 @@
|
|||
772
|
1
examples/2024/12/2.2
Normal file
1
examples/2024/12/2.2
Normal file
|
@ -0,0 +1 @@
|
|||
436
|
10
examples/2024/12/3
Normal file
10
examples/2024/12/3
Normal file
|
@ -0,0 +1,10 @@
|
|||
RRRRIICCFF
|
||||
RRRRIICCCF
|
||||
VVRRRCCFFF
|
||||
VVRCCCJFFF
|
||||
VVVVCJJCFE
|
||||
VVIVCCJJEE
|
||||
VVIIICJJEE
|
||||
MIIIIIJJEE
|
||||
MIIISIJEEE
|
||||
MMMISSJEEE
|
1
examples/2024/12/3.1
Normal file
1
examples/2024/12/3.1
Normal file
|
@ -0,0 +1 @@
|
|||
1930
|
1
examples/2024/12/3.2
Normal file
1
examples/2024/12/3.2
Normal file
|
@ -0,0 +1 @@
|
|||
1206
|
5
examples/2024/12/4
Normal file
5
examples/2024/12/4
Normal file
|
@ -0,0 +1,5 @@
|
|||
EEEEE
|
||||
EXXXX
|
||||
EEEEE
|
||||
EXXXX
|
||||
EEEEE
|
1
examples/2024/12/4.1
Normal file
1
examples/2024/12/4.1
Normal file
|
@ -0,0 +1 @@
|
|||
692
|
1
examples/2024/12/4.2
Normal file
1
examples/2024/12/4.2
Normal file
|
@ -0,0 +1 @@
|
|||
236
|
6
examples/2024/12/5
Normal file
6
examples/2024/12/5
Normal file
|
@ -0,0 +1,6 @@
|
|||
AAAAAA
|
||||
AAABBA
|
||||
AAABBA
|
||||
ABBAAA
|
||||
ABBAAA
|
||||
AAAAAA
|
1
examples/2024/12/5.1
Normal file
1
examples/2024/12/5.1
Normal file
|
@ -0,0 +1 @@
|
|||
1184
|
1
examples/2024/12/5.2
Normal file
1
examples/2024/12/5.2
Normal file
|
@ -0,0 +1 @@
|
|||
368
|
Loading…
Add table
Add a link
Reference in a new issue