my solutions to advent of code
aoc advent-of-code
at main 3.6 kB view raw
1import gleam/int 2import gleam/io 3import gleam/list 4import gleam/order.{Eq, Gt, Lt} 5import gleam/set 6import gleam/string 7import simplifile as file 8 9pub 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 // nicer looking but idc 49 // |> list.filter(fn(i) { 50 // list.any(fresh_ranges, fn(range) { i >= range.0 && i <= range.1 }) 51 // }) 52 // |> list.length 53 54 // this thing crashed my computer btw im stupid 55 // let haha = 56 // fresh_ranges 57 // |> list.fold(set.new(), fn(acc, i) { 58 // list.range(i.0, i.1) |> list.fold(acc, fn(acc, i) { set.insert(acc, i) }) 59 // }) 60 // io.println(set.size(haha) |> int.to_string) 61 62 let base_set: set.Set(#(Int, Int)) = set.new() 63 fresh_ranges 64 |> list.fold(base_set, fn(prev_seen_ranges, range) { 65 let #(range, seen_ranges) = 66 prev_seen_ranges 67 |> set.fold(#(range, prev_seen_ranges), fn(acc, seen_range) { 68 let #(range, seen_ranges) = acc 69 // echo #( 70 // range, 71 // seen_range, 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 // btw im refusing to ever do something better than this idc about your sorting and whatever this is the way shut the fuck up i spent three hours on this i will be using it 78 case 79 int.compare(range.0, seen_range.0), 80 int.compare(range.1, seen_range.1), 81 int.compare(range.0, seen_range.1), 82 int.compare(range.1, seen_range.0) 83 { 84 // if there's no touching 85 Gt, Gt, Gt, Gt | Lt, Lt, Lt, Lt -> #(range, seen_ranges) 86 // if it's inside of the other one 87 Gt, Lt, _, _ | Eq, Lt, _, _ | Gt, Eq, _, _ | Eq, Eq, _, _ -> #( 88 #(-1, -1), 89 seen_ranges, 90 ) 91 // if the other one is inside it 92 Lt, Gt, _, _ | Eq, Gt, _, _ | Lt, Eq, _, _ -> #( 93 range, 94 set.delete(seen_ranges, seen_range), 95 ) 96 // if it's touching on the left side make them touch 97 Lt, Lt, _, _ -> #( 98 #(range.0, seen_range.1), 99 set.delete(seen_ranges, seen_range), 100 ) 101 // if it's touching on the right size make them touch 102 Gt, Gt, _, _ -> #( 103 #(seen_range.0, range.1), 104 set.delete(seen_ranges, seen_range), 105 ) 106 } 107 }) 108 109 case range == #(-1, -1) { 110 False -> seen_ranges |> set.insert(range) 111 True -> seen_ranges 112 } 113 }) 114 |> set.fold(0, fn(acc, range) { acc + range.1 - range.0 + 1 }) 115 |> int.to_string 116 |> io.println 117}