summaryrefslogtreecommitdiff
path: root/2023
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2023-12-14 07:56:14 +0100
committernekineki <nekineki@nekineki.net>2023-12-14 08:18:50 +0100
commit1383458f70da63f82cf577957d5a0798898752e6 (patch)
tree6a4e0fdfc41b678e4e1c7b0f69088efb2c77b3c1 /2023
parente2d2c3cedf0cd4af66f413f920e9181f4b0bb710 (diff)
day14
Diffstat (limited to '2023')
-rw-r--r--2023/day14.rs133
-rw-r--r--2023/in/day14.pzl100
-rw-r--r--2023/in/day14.ref10
3 files changed, 243 insertions, 0 deletions
diff --git a/2023/day14.rs b/2023/day14.rs
new file mode 100644
index 0000000..cb5ea93
--- /dev/null
+++ b/2023/day14.rs
@@ -0,0 +1,133 @@
+#![allow(dead_code)]
+use std::collections::HashMap;
+use std::fs::File;
+use std::io::Read;
+
+#[derive(Hash, Eq, Debug, PartialEq, Clone, Copy)]
+enum Spc {
+ Rol,
+ Fix,
+ Non,
+}
+
+fn new_north_y(x: usize, y: usize, m: &Vec<Vec<Spc>>) -> usize {
+ for yi in (0..y).rev() {
+ if m[yi][x] != Spc::Non {
+ return yi + 1;
+ }
+ }
+ // reached the end of map
+ return 0;
+}
+
+fn rotate_positive(m: Vec<Vec<Spc>>) -> Vec<Vec<Spc>> {
+ let mut out: Vec<Vec<Spc>> = Vec::new();
+ for i in (0..m[0].len()).rev() {
+ let mut r: Vec<Spc> = Vec::new();
+ for j in 0..m.len() {
+ r.push(m[j][i]);
+ }
+ out.push(r);
+ }
+ out
+}
+
+fn print_m(m: &Vec<Vec<Spc>>) {
+ for i in 0..m.len() {
+ for j in 0..m[0].len() {
+ let a = match m[i][j] {
+ Spc::Rol => 'O',
+ Spc::Fix => '#',
+ Spc::Non => '.',
+ };
+ print!("{}", a);
+ }
+ println!();
+ }
+ println!();
+}
+
+fn calc_load(m: &Vec<Vec<Spc>>) -> usize {
+ let mut load = 0;
+ for i in 0..m[0].len() {
+ for j in 0..m.len() {
+ if m[j][i] == Spc::Rol {
+ load += m.len() - j;
+ }
+ }
+ }
+ load
+}
+
+fn main() {
+ // let filename = "in/day14.ref";
+ let filename = "in/day14.pzl";
+
+ let mut f = File::open(filename).expect("cannot open file");
+ let mut content = String::new();
+ f.read_to_string(&mut content).expect("cannot read file");
+ let lines = content.trim_end().split('\n');
+
+ let mut m: Vec<Vec<Spc>> = Vec::new();
+ for line in lines {
+ let mut r: Vec<Spc> = Vec::new();
+ for c in line.chars() {
+ let s = match c {
+ 'O' => Spc::Rol,
+ '#' => Spc::Fix,
+ '.' => Spc::Non,
+ _ => panic!(),
+ };
+ r.push(s);
+ }
+ m.push(r);
+ }
+ let mut m2 = m.clone();
+
+ for i in 0..m[0].len() {
+ for j in 0..m.len() {
+ if m[j][i] == Spc::Rol {
+ let new_y = new_north_y(i, j, &m);
+ m[j][i] = Spc::Non;
+ m[new_y][i] = Spc::Rol;
+ }
+ }
+ }
+ let res1 = calc_load(&m);
+
+ let mut mm: HashMap<Vec<Vec<Spc>>, u64> = HashMap::new();
+ let mut cm: HashMap<u64, usize> = HashMap::new();
+
+ let mut c0 = 0;
+ let mut c1 = 0;
+ for cycle in 0..1000000000 {
+ for _ in 0..4 {
+ for i in 0..m2[0].len() {
+ for j in 0..m2.len() {
+ if m2[j][i] == Spc::Rol {
+ let new_y = new_north_y(i, j, &m2);
+ m2[j][i] = Spc::Non;
+ m2[new_y][i] = Spc::Rol;
+ }
+ }
+ }
+ m2 = rotate_positive(m2);
+ m2 = rotate_positive(m2);
+ m2 = rotate_positive(m2);
+ }
+ if let Some(cycle_start) = mm.insert(m2.clone(), cycle) {
+ c0 = cycle_start;
+ c1 = cycle;
+ break;
+ }
+ cm.insert(cycle, calc_load(&m2));
+ }
+
+ // ne vem zakaj rabis ta - 1
+ let res2 = cm[&((1000000000 - c0 - 1) % (c1 - c0) + c0)];
+
+ println!("res1: {}", res1);
+ println!("res2: {}", res2);
+ assert_eq!(res1, 103333);
+ assert_eq!(res2, 97241);
+}
diff --git a/2023/in/day14.pzl b/2023/in/day14.pzl
new file mode 100644
index 0000000..610c8fb
--- /dev/null
+++ b/2023/in/day14.pzl
@@ -0,0 +1,100 @@
+..O.O..O.#.#..#......O.....O.#.O..O.OO.O..OO...O..#.#OO......O.#..#OOOO..O.....O#.O.OO.O.O#......OO.
+..O........#O..O...O....O.......#.....#.#.O..#O#...........##.O.....O#.##O..#....#.#.....##.O.....#.
+......O..####...#O.#.O.#.#.O....O..#.....O.#O...#.#.#.....O#...#...O.....O....O....O........O.O...#.
+.O.O.O.....#......O...O..#....#...O##.OO.O.O.O##.O#O#.#.O##...OOO.....O...O....OO.#.....#..#....##..
+.#..O...O...........#....#.O#.....O.........O....OO.O.#.O#O#.#..O##...O...O...O....#OO.O..O#..#.....
+#.O#..#.....O###..##.....O..#....O#OO.OO......O..O.#....OO.OO#.O...O....#.#O..O.OO..O#.#.O..........
+O.#.O.OO...O..OO.O..#O......##O.O#.OO...#.......O...............OO.O..O.....O..#.O....O...#O..#..O..
+OO.##...#....O....#.##O..#....O#O.#......O##..#.O..O.#O#..##..#.O.O.O.#O.....#O.O.O....O......#...#O
+.##.........#.O#..#.#.#.#..O..#....OO.O.#O..#.............#....O..O.O.....O..........#.....#.O..O.O.
+..#......O.O#..O..#O.O..O.O..O#......#O...O........OO...O.#.OO...O..........O....O.#........#O....#O
+..#....#..#..O.O.#..#.#.......#.O.#.O#.#.#....####OO....##.O..#.OO#.##.#..O#.#....OOO#O.O.......#..O
+O..#OOO.O..#..O......#O#..O............#..O.OO.....#..O#.##...O...#....O#...#O.O..##..O.OO....#OOO.O
+OO#O.#..#..#.#.OOO.O#.O.#.O..O.##..#.#O#....#O.....#..O........#......#..#..O.#.O..O#OO#O....O.O.#.O
+.O.OO.......O..O........#.....#...##....##..#.........#.......#.OO.#..#....#..O.O.#.O##........#..O.
+.....#...#O......#.....O.#..#O##O....#O....#...##O.....#.....#....OO#...O....O#O...#.#.#.####.OO.#..
+.O#.O.O...##.O..O.O..#..O##.OO.#.#..........#........#.#.#....O.....O.O.#..O...O#.#.O....#.#...#.#..
+.#.#O............O#....#O.O##......#.OOO##.O.O.....OO##OO............O.O....##OO.O#.....#.O.#..O#...
+O.O.O......#OO..O#..O.#.#.#.O#...#.OO.O.O#OO.O.#.O....#...O#....O..O#...O...##.OO#..O....##O.#..O.O#
+.#.#........#...OOO#..O#O..#..O..O.O#..O#...#..#O.............O#.#O..O.OOOO.....OO##.#.O.###.#...O..
+.....O...OO#.O..O.O..##.#...O#..O#...O...O...O.###OO........#..O.O..OO#..#....#.##..O#..#......##..O
+OO.....#O#.#..#...#..OO.#..#O.......#.O.O.....O......O..OO#..........OO....O.....#.#O.#O.O..O..O....
+#.O.....#...O......#.#...#.OO....#O.O.O......O..OOO..O#.#...O#.O##..OO.OO.O##.#...#.O...#....OOOOO#O
+##O...#.O.#.O#.O##O#...#.#.O....#.........#......#O#.#O......#O..#O..#..#......O.....O.###O..O.O....
+O..##.#....O...OO#..#...OO##..#O.#O...O.................#..O..#..O.O.O###.O.O.#....O...#.O.......#..
+O#..#....O....O....OO.....#.O#.....#.......O..O.....O#OO..O..O..##...#O#.O............#.#.#..#......
+.OO..#....#...O..O....#O.......OO.##.O..O.#.O.O.#O.##.......O#......O...O...O.O##O##..#..#O.......#.
+OO#.OO.......#...#.#.O#.....#O.###.O...O#..O#..#..O#..........#......O........O..#...O#...OO#O.OO...
+.#.#.O.......##.#.O....#..###..OO#..#..O#O...............O.O...O#.#.....#OO..#O............O.O..O...
+.....#O..#.O......#O..O...........O.....O...O.#..O.O.#O#.#..OOO##..OO#....#O..#.#..#....O..O..O.#O..
+..O.#O....#.O..#O##.O##.#O.....#..#.....O...##..O........##.O.O......O...O#O###..#OO......#.OO.#O.#.
+OO..#........#..........O..##...#....OO..O..O...O.O.....O#.O......O...O.O.O..#.O.......#.O...#..#.#.
+.....#...#.....#.....###..OO...O.O#.O.#O..#...........OO....#O.O.O.......OO...OO...OO....#O..O#.O#..
+..O.O#.##...#.##.O..#.......#..#OO.OO.......O#OO..##...O##O.O..##.O..#O..#O...O..##..#.O#.##..O.O..O
+..OO.OO..O#.O#..O..O.#.O...#O##.O#....O....#..O#.O#O..OO.OO##O..OO..#..#.O.O#..#....O#O.#...O.......
+..O..#.....O.#..OO.....#..O....#...O.......O##.#..#OO....O...O..O.O#O#..O....O..#.#.OO.....##OO.....
+#.O.OOO...O.....O#.##.O..O#..#...OO..#OO#.#..O#....O..###...O#....O................#....OO#....O..#.
+.O..#...O#.#..#.O.##..####.#..#..O..#.......#......O....#.....O...#.O.#.OO.O...OO..#....O#.OO....O.O
+O.#..OO.....O.....O.O.#...#.OOO..####....O.O###....O.#.#O.#O#.#O..#.......O...........O...OO.....O..
+........O.OO.....O.O.#.O.O..O#.O.....#.....#....#..O......OOO#.#.#O........O.O.#..O...#OOO..#......O
+OO.....O#..#.#...OO...#...#......O...#..O.O#...#.#.O#..O.#O....#...OO#..#..#.OO.####....O#..#..O#...
+..O#.###OO.O...O#O....OOO...O#...O.OO...O#.#O.#..O......#..O#..O..#O...#O.....##..O#..O..##.#OO..O..
+#O.O.....#O#O#......#.O.OOOO....#..O..O.#.O.O...#O##.O....O..####OO#...#.#.....O..O.OO..##O#........
+#...#.#O.......O....O#.##..#O#..#.............O....O..#...OO.O..O#...O.#O...O..........#.O#..##OO#..
+.#.O..O.#O..#O#O##..O..........O#O#..##.#.OO.O.#...#.#.O....#..O#.#..#.#..#........#...O#......##..#
+...#OO.#.O#.......#...OO#..O#..O....#....#...O.#.OO.O......O...OOO......#.#.O..#..#..##O...O.#.#.O..
+#..#...#.#.......O...#.O....O##...O#O.#.#..#..##..O.#O.#O....O..O.O.#...OOO..#...OO.#.O##.#.#..O....
+..#...O....#.....O.O.....O........#..O....#..#....##.#O.#.#OO.O.OO.O..O..#.OO....O..O#..#...#..O#.O.
+...O###O...O..O#OO#.##.#O..O...#.#O...O#.OO..O...#.#O..O.OO#O...#O.#....#O#...O..O..#O.##.#.....O#..
+.##.....O....O...#.....O....#...............O.#.##..#.O........O#.O.#O#.OO#..O.#.O.O#.OO....#..O....
+....#...##O...O...O.O....#....OO#OO#.##..#OOO.....#.O..OOO#..##.......O.....O..O#.#...#.....OOO.....
+..O..O...#....O.O#O#.###..#...#O.#O#..##.O...##.#................O#....O.O..OO......OO.O##O......#..
+..#O..O.....O.#.O..........#..#..O...OO#OO...#..O..OO#....O..O..#O.#O..#..#...#...O............#.O#.
+.O......#.O.#.O...O.............#.#.#...#..OO........O..#.O.#.O.OO...#O.O#.............O#.#....O..OO
+####.#OO.#....#O.O..O.##.O#..#....O..O#......O.....O.#.#.O..O....O...O.O.........##....#....OO.O..O.
+##.OO.O#O.O.O.###O...###.O.O....O...#.........OO.#.#OOO#O..#O.........#....OO.....O...O.#.O.O..#.O..
+.......#.OO#.O.#.O#..O##O...O.###.O#....#.#O#.OO..#.......#..###..##.#O..O.O.........O.#OO.#.#.#.O..
+..#.O.#...O...##.O.O.#.......O............O.O..O....O...O#..O.#....O.#...O#...OO.#...#OO..##OO..O.#O
+#..OOO...O.OO.....O..O#...O....#..O..#....#.##OO...#..#.O....O........#OO....OOOO...##O....O.#.##..#
+.........#..#OO...OO....O.O#O##..O..O...O..#O#.O#......O..#..##..#......O.....O.......#..#.#.OOO....
+#...#..##...##.O...#.#O......OO....#...#.OO.OOO.##..##...O#O.#O....#.#....##...O.O..O......O...O....
+....O...#....O.OO.....OO............O#..#.......O...OO..O.O...#.#..##.....#.......O....O.....O..O..#
+O.....#.##...O.....OO.....##O.......#.O.O.#O.OO..O......O....##OO#...#O#..##...O.#...O.....#.O.O.#.O
+.O#..#....#.#..#.O.O.....O...#..##.O...#..O....O.O#O..O...#O...#.O..........O.O..O.##O#.#O##........
+.O#.#.#..#..#O...OO....#..OOO.......#..OOO.#O....O....O...#...#O##.....#.O.O#..#...O.OO..OO...#..O..
+.........O.OO...........O#..#..O##.......#.....O.#OO.....O...O..##...O...O...O#...#...O..OO....O....
+O#.....#...#....#....#O#....#..##OO#.O.#O...O#....O..OO#O.OO....#O#.#.O.#..O..##OO.O....##.O.#.O#O..
+O.#...O.O.#..##O..O.O.#O.#O.O##O#..#.#O.O..O..OOO...O#.#.#...OO.......#.....#O..##..##..O#......#...
+.O..#...O.O..#O...O.O.O..O.........#..OO..#..#O.#.O.OO.#O.OO.##.......O.........#...O.#OO....OOO.O..
+...#O#....O#....O.#......O..........O....###....OO#O.......O..OO....#O...O.OO.O..O......#...O.....##
+O.##.#...##..........O#...#O.O............#..O..#O#O#OO.O..O.......O#.....O#...O..O###OOO.O.#.....#.
+O#.#O..O..#...O#..O.#..#..#.......O.#...O.........#.OO..O..O#O...O#..#O..O#...O#.#..........#O.O...#
+O..####.....#....#OO#.O#O..#..#...O..##....O.......#.O.OO....O...O.......O#O..#.....#.#......O.O....
+..O#..O...O#..O.......#..#O#...##.......O.#O.#..O.#..O...###.....O.O...#.....#.#......O...OOO.....#.
+.....#O...#..#..O..#.OO#..#.O......OO.#..O#.###O.....#.OO..........OOO..##OO...##..OOO#O.#O.##......
+O...#..O.OO.O..OO..#..OO.#....#....#.O.....#..#...O...OO#........##O.......O..#.#.......OO#...O#.OO.
+O...##............O...#..#OO#O........O.#..O....O#..OOO.....O.O........##.##.....##..#.#O..##....O..
+..#...#...OO..O..O...OO.....O.O.O....O.....OO.OOO..O...#O...O.O..#...O.##....#..#...OO##.O.O#.#.#.#.
+.OO.....#.#...O.#...#.O.OO..###..O..#O.#.O##..O...O.O..#O.O.#...O...#.#O.O.O...#.#....#..O.......#.O
+...O.O#O......O.........OO..#O..OO.....OO##O.O..#.O##O.O.#.....O..#.#.....OO#.#.O.#.O#...#O.#....O#.
+..#...O..#.O...#.#..##..O..O..O.O.O.O...O.O..OO......O....#..O.O#...##..OO..O.#O..........#....#O.#.
+.O...O##.#O.OO##.O..#.#.....O#....#....#O.O#.##....#..................O#..O.##.#OO..O..O##O.O.O.....
+.OO......O##...O#.O......OO.OO.#..OO#..O..#.......O#...O.OO......OO##O.O...........#...#OOOO.#.O..#.
+..#.O...#.#..O.....#.O.O#.O...O#.......O.#.O#...O.....#....#.#O...O..O...O#.O..........#O...#....#O.
+.OO.......O#.#........#O..#...........OO.#........#OO.OO#....#..#O#..........OO.O..O.O.....#..#O....
+.OO#.......#.#.#..#.OO.#.O#.#.O....O..OO...O.#...O#O..#.O.....O#.OOO.#..O..O..#.#OO.#....##O........
+.#...O#O....O#..OOO....#....#......OO..#OOO....O.#....O...O.#..O..O.#OO..O#...#.O.....#......###OO..
+O...##.......#......O#OO.#O#O#O.O.O.O...O...#...O.#..O.......O#...#O.O##..#.O......##...#.O#.......O
+#..#O#.......OO...OO.....#.#...OO..O.O..O#.OO..O#...O......#.##O..#.#...O..O#...#.#....#O.#O...O...#
+..#.OO##O.O.O...##......##..#.###.O....##.O..O#.O.#..O..O.O..#.O#O#..O................O.....O......O
+OO...O#O.OO..OO..O...#....#..O...O###.O...#.OO..O#....O..OO.#OO...........O.O.##..OO#.O......O.#..O.
+..OO...#..#.O.O.....##..#O#.O...O..O#.##..#.#..#...OO.#...#..........#....O........O.#O#.....O....#.
+#...O..O..###O.....O......O..O.#O..#......OO.....##....#.OO#.O..#..O..##.#..O..O....##..#O#....O...#
+O#.#..O..O.#.OOO....O.....O....O..O#....#O#.O...O##..OO.#..#.........####..#O#O#.O.O...O.O.O.#.....O
+.O...O......#.......OO...O.#.....##.O...O#...O.#..O.O#O....OO.#....O...#O#..#....OO...#.#......O.O..
+O..OO....O.O..#.O...O...OO......#.#..O..O.O.O.#.#.O.....O......#..#..##.O.##O#.#O........O.O....OO.O
+..O.OOOO.........O#....O...##OO..O.O........O#.O.O.O##..#....#O...#.......##..#....O...O....O##..O#.
+.#.#...#..O.#..O#.O..#.....#O..O...O#..#..O.#....O.#O...#O.O#O.##......O.O.#.#.##....##..O..#....O..
+O...#O.......OO..#.O.#.#..O.....OO.........O.O#..O#O.#.#......OO.#.OO..#..O.#.O..##..#.....O........
+..#.#.....#.O..O#.........O.O...#..O..O...##...........###O............#.O..O..#..O.......O....O....
+#O..O....O.#..##O..#.O.#.#...#O..#.##...OO.#.O...O..O..O..###O....OOOO..#O......#O.OO..#.OO#O......#
diff --git a/2023/in/day14.ref b/2023/in/day14.ref
new file mode 100644
index 0000000..5a24dce
--- /dev/null
+++ b/2023/in/day14.ref
@@ -0,0 +1,10 @@
+O....#....
+O.OO#....#
+.....##...
+OO.#O....O
+.O.....O#.
+O.#..O.#.#
+..O..#O..O
+.......O..
+#....###..
+#OO..#....