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

almost there

aylac.top 1185346f f624b321

verified
Changed files
+182 -2
2015
20
rust
src
2025
+1
.gitignore
··· 15 *.png 16 *.gif 17 *.qoi
··· 15 *.png 16 *.gif 17 *.qoi 18 + *.txt
+30 -2
2015/20/rust/src/main.rs
··· 1 fn main() { 2 - let input = include_str!("../../input.txt").trim(); 3 4 - println!("{}", &input); 5 }
··· 1 fn main() { 2 + let input: u64 = include_str!("../../input.txt") 3 + .trim() 4 + .parse() 5 + .expect("bad input"); 6 + let input = input / 10; 7 8 + let mut highest_house = (0, 0); 9 + let mut house: u64 = 1; 10 + // while highest_house.1 < input { 11 + while house < 10 { 12 + let presents = if house % 2 == 0 { 13 + (1..house + 1).fold(0, |acc, elf| { 14 + if house % elf == 0 { acc + elf } else { acc } 15 + }) 16 + } else { 17 + (1..house.div_ceil(2) + 1).fold(0, |acc, elf| { 18 + if house % (elf * 2) == 0 { 19 + acc + elf 20 + } else { 21 + acc 22 + } 23 + }) 24 + }; 25 + if presents > highest_house.1 { 26 + highest_house = (house, presents); 27 + } 28 + house += 1; 29 + println!("{} {}", house, presents); 30 + } 31 + 32 + println!("Part 1: {:?}", highest_house); 33 }
+20
2025/5/gleam/gleam.toml
···
··· 1 + name = "main" 2 + version = "1.0.0" 3 + 4 + # Fill out these fields if you intend to generate HTML documentation or publish 5 + # your project to the Hex package manager. 6 + # 7 + # description = "" 8 + # licences = ["Apache-2.0"] 9 + # repository = { type = "github", user = "", repo = "" } 10 + # links = [{ title = "Website", href = "" }] 11 + # 12 + # For a full reference of all the available options, you can have a look at 13 + # https://gleam.run/writing-gleam/gleam-toml/. 14 + 15 + [dependencies] 16 + gleam_stdlib = ">= 0.44.0 and < 2.0.0" 17 + simplifile = ">= 2.3.0 and < 3.0.0" 18 + 19 + [dev-dependencies] 20 + gleeunit = ">= 1.0.0 and < 2.0.0"
+14
2025/5/gleam/manifest.toml
···
··· 1 + # This file was generated by Gleam 2 + # You typically do not need to edit this file 3 + 4 + packages = [ 5 + { name = "filepath", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "B06A9AF0BF10E51401D64B98E4B627F1D2E48C154967DA7AF4D0914780A6D40A" }, 6 + { name = "gleam_stdlib", version = "0.65.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "7C69C71D8C493AE11A5184828A77110EB05A7786EBF8B25B36A72F879C3EE107" }, 7 + { name = "gleeunit", version = "1.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "CD701726CBCE5588B375D157B4391CFD0F2F134CD12D9B6998A395484DE05C58" }, 8 + { name = "simplifile", version = "2.3.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0A868DAC6063D9E983477981839810DC2E553285AB4588B87E3E9C96A7FB4CB4" }, 9 + ] 10 + 11 + [requirements] 12 + gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } 13 + gleeunit = { version = ">= 1.0.0 and < 2.0.0" } 14 + simplifile = { version = ">= 2.3.0 and < 3.0.0" }
+117
2025/5/gleam/src/main.gleam
···
··· 1 + import gleam/int 2 + import gleam/io 3 + import gleam/list 4 + import gleam/order.{Eq, Gt, Lt} 5 + import gleam/set 6 + import gleam/string 7 + import simplifile as file 8 + 9 + pub fn main() { 10 + let assert Ok(input) = file.read(from: "../input.txt") 11 + as "Input file not found" 12 + let assert [fresh_ranges, available] = 13 + input |> string.trim |> string.split("\n\n") 14 + let fresh_ranges = 15 + fresh_ranges 16 + |> string.trim 17 + |> string.split("\n") 18 + |> list.reverse 19 + |> list.drop(5) 20 + |> list.take(12) 21 + |> list.reverse 22 + |> list.map(fn(i) { 23 + let assert [from, to] = i |> string.trim |> string.split("-") 24 + let assert Ok(from) = int.parse(from) 25 + let assert Ok(to) = int.parse(to) 26 + #(from / 100_000_000, to / 100_000_000) 27 + // #(from, to) 28 + }) 29 + let available = 30 + available 31 + |> string.split("\n") 32 + |> list.map(fn(i) { 33 + let assert Ok(id) = int.parse(i) 34 + id 35 + }) 36 + 37 + available 38 + |> list.fold(0, fn(acc, i) { 39 + acc 40 + + case list.any(fresh_ranges, fn(range) { i >= range.0 && i <= range.1 }) { 41 + True -> 1 42 + False -> 0 43 + } 44 + }) 45 + |> int.to_string 46 + |> io.println 47 + 48 + // let haha = 49 + // fresh_ranges 50 + // |> list.fold(set.new(), fn(acc, i) { 51 + // list.range(i.0, i.1) |> list.fold(acc, fn(acc, i) { set.insert(acc, i) }) 52 + // }) 53 + // io.println(set.size(haha) |> int.to_string) 54 + 55 + let base_set: set.Set(#(Int, Int)) = set.new() 56 + let ranges = 57 + fresh_ranges 58 + |> list.fold(base_set, fn(prev_seen_ranges, range) { 59 + let #(range, seen_ranges) = 60 + prev_seen_ranges 61 + |> set.fold(#(range, prev_seen_ranges), fn(acc, seen_range) { 62 + let #(range, seen_ranges) = acc 63 + echo #( 64 + range, 65 + seen_range, 66 + int.compare(range.0, seen_range.0), 67 + int.compare(range.1, seen_range.1), 68 + int.compare(range.0, seen_range.1), 69 + int.compare(range.1, seen_range.0), 70 + ) 71 + case 72 + int.compare(range.0, seen_range.0), 73 + int.compare(range.1, seen_range.1), 74 + int.compare(range.0, seen_range.1), 75 + int.compare(range.1, seen_range.0) 76 + { 77 + Gt, Gt, Gt, Gt | Lt, Lt, Lt, Lt -> #(range, seen_ranges) 78 + Eq, Eq, Eq, Eq 79 + | Gt, Lt, Lt, Gt 80 + | Eq, Lt, Lt, Gt 81 + | Eq, Lt, Lt, Eq 82 + | Gt, Eq, Lt, Gt 83 + | Gt, Eq, Eq, Gt 84 + | Eq, Eq, Lt, Gt 85 + -> #(#(0, 0), seen_ranges) 86 + Eq, Gt, Eq, Gt | Lt, Eq, Lt, Gt | Lt, Gt, Lt, Gt | Lt, Eq, Lt, Eq -> #( 87 + range, 88 + set.delete(seen_ranges, seen_range), 89 + ) 90 + Eq, Gt, Lt, Gt -> #(range, set.delete(seen_ranges, seen_range)) 91 + Lt, Lt, Lt, Gt | Lt, Lt, Lt, Eq -> #( 92 + #(range.0, seen_range.1), 93 + set.delete(seen_ranges, seen_range), 94 + ) 95 + Gt, Gt, Lt, Gt -> #( 96 + #(seen_range.0, range.1), 97 + set.delete(seen_ranges, seen_range), 98 + ) 99 + Gt, Gt, Eq, Gt -> #( 100 + #(seen_range.0, range.0), 101 + set.delete(seen_ranges, seen_range), 102 + ) 103 + _, _, _, _ -> #(range, seen_ranges) 104 + } 105 + }) 106 + 107 + case range == #(0, 0) { 108 + False -> seen_ranges |> set.insert(range) 109 + True -> seen_ranges 110 + } 111 + }) 112 + echo ranges 113 + ranges 114 + |> set.fold(0, fn(acc, range) { acc + range.1 - range.0 + 1 }) 115 + |> int.to_string 116 + |> io.println 117 + }