my solutions to advent of code
aoc advent-of-code

Compare changes

Choose any two refs to compare.

Changed files
+93 -21
2025
7
+18 -21
2025/7/gleam/src/main.gleam
···
import gleam/int
import gleam/io
import gleam/list
-
import gleam/result
import gleam/set
import gleam/string
import simplifile as file
···
let timelines =
splitters_map
-
|> list.fold(dict.new() |> dict.insert(0, start), fn(timelines, splitters) {
-
// echo #(timelines, splitters)
-
timelines
-
|> dict.fold(timelines, fn(timelines, timeline, beam) {
-
case splitters |> set.contains(beam) {
-
False -> timelines
-
True -> {
-
timelines
-
|> dict.delete(timeline)
-
|> dict.insert(
-
int.random(100_000_000_000_000_000_000_000),
-
beam - 1,
-
)
-
|> dict.insert(
-
int.random(100_000_000_000_000_000_000_000),
-
beam + 1,
-
)
}
-
}
-
})
-
})
echo timelines
timelines
|> dict.size
···
import gleam/int
import gleam/io
import gleam/list
import gleam/set
import gleam/string
import simplifile as file
···
let timelines =
splitters_map
+
|> list.index_fold(
+
dict.new() |> dict.insert("", start),
+
fn(timelines, splitters, i) {
+
echo i
+
// echo #(timelines, splitters)
+
timelines
+
|> dict.fold(timelines, fn(timelines, timeline, beam) {
+
case splitters |> set.contains(beam) {
+
False -> timelines
+
True -> {
+
timelines
+
|> dict.delete(timeline)
+
|> dict.insert(timeline <> "-", beam - 1)
+
|> dict.insert(timeline <> "+", beam + 1)
+
}
}
+
})
+
},
+
)
echo timelines
timelines
|> dict.size
+7
2025/7/rust/Cargo.lock
···
···
+
# This file is automatically @generated by Cargo.
+
# It is not intended for manual editing.
+
version = 4
+
+
[[package]]
+
name = "rust"
+
version = "0.1.0"
+6
2025/7/rust/Cargo.toml
···
···
+
[package]
+
name = "rust"
+
version = "0.1.0"
+
edition = "2024"
+
+
[dependencies]
+62
2025/7/rust/src/main.rs
···
···
+
use std::{
+
collections::{HashMap, HashSet},
+
mem::swap,
+
};
+
+
fn main() {
+
let input = include_str!("../../input.txt").trim();
+
+
let input: Vec<&str> = input.trim().split("\n").collect();
+
// let width = input[0].len() as u64;
+
let start = input[0].find("S").unwrap() as u64;
+
let splitters_map: Vec<HashSet<u64>> = input[0..input.len()]
+
.iter()
+
.enumerate()
+
.map(|(i, line)| if i % 2 != 0 { "" } else { line })
+
.filter(|line| line != &"")
+
.map(|line| {
+
line.chars()
+
.enumerate()
+
.fold(HashSet::new(), |mut s, (i, char)| {
+
if char == '^' {
+
s.insert(i as u64);
+
}
+
s
+
})
+
})
+
.collect();
+
+
let timelines = {
+
let mut timelines: HashMap<u64, u64> = HashMap::new();
+
timelines.insert(start, 1);
+
let mut timelines_new: HashMap<u64, u64> = HashMap::new();
+
for splitters in splitters_map {
+
for (pos, amount) in &timelines {
+
if splitters.contains(&pos) {
+
let m1 = timelines_new.entry(pos - 1).or_insert(0);
+
*m1 += amount;
+
let p1 = timelines_new.entry(pos + 1).or_insert(0);
+
*p1 += amount;
+
} else {
+
let e = timelines_new.entry(*pos).or_insert(0);
+
*e += amount;
+
}
+
}
+
// for pos in 0..width as u64 {
+
// if splitters.contains(&pos) {
+
// print!("^");
+
// } else if timelines_new.contains_key(&pos) {
+
// print!("|");
+
// } else {
+
// print!(".");
+
// }
+
// }
+
// print!("\n\n");
+
swap(&mut timelines, &mut timelines_new);
+
timelines_new.clear();
+
}
+
timelines
+
};
+
// println!("{:?}", timelines);
+
println!("{}", timelines.iter().fold(0, |acc, v| { acc + v.1 }))
+
}