diff options
author | HJ <thechairman@thechairman.info> | 2023-12-09 01:25:46 -0500 |
---|---|---|
committer | HJ <thechairman@thechairman.info> | 2023-12-09 01:25:46 -0500 |
commit | 7c69adbce6f3ab1075039e23c9c04ebd61ec0761 (patch) | |
tree | 38b84fb29bc09bdbaa32e4b601cc9affde38a28c /aoc2023/src/day5/solve.gleam | |
parent | 2f570466b75ca76636a692006bec59cbb3a038cf (diff) | |
parent | df2f2fd140f188dfb5df68b44e397a8855e79f02 (diff) | |
download | gleam_aoc-7c69adbce6f3ab1075039e23c9c04ebd61ec0761.tar.gz gleam_aoc-7c69adbce6f3ab1075039e23c9c04ebd61ec0761.zip |
Merge branch 'main' of https://github.com/hunkyjimpjorps/AdventOfCode
Diffstat (limited to 'aoc2023/src/day5/solve.gleam')
-rw-r--r-- | aoc2023/src/day5/solve.gleam | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/aoc2023/src/day5/solve.gleam b/aoc2023/src/day5/solve.gleam index 9885710..7c05310 100644 --- a/aoc2023/src/day5/solve.gleam +++ b/aoc2023/src/day5/solve.gleam @@ -26,7 +26,8 @@ type Mapper = // Parsing ----------------------------------------------------------------------------------------- fn parse_input(input: String) { - let ["seeds: " <> raw_seeds, ..raw_mappers] = string.split(input, on: "\n\n") + let assert ["seeds: " <> raw_seeds, ..raw_mappers] = + string.split(input, on: "\n\n") let seeds = string_to_int_list(raw_seeds) let mappers = @@ -45,7 +46,7 @@ fn string_to_int_list(str: String) { } fn parse_mapper(strs: List(String)) -> Mapper { - let [_, ..raw_ranges] = strs + let assert [_, ..raw_ranges] = strs list.map(raw_ranges, parse_mrange) |> list.sort(fn(a, b) { int.compare(a.start, b.start) }) } @@ -79,11 +80,11 @@ fn correspond(n: Int, mapper: Mapper) { pub fn part2(input: String) { let Almanac(seeds, mappers) = parse_input(input) - let [SRange(answer, _), ..] = + let assert [SRange(answer, _), ..] = seeds |> list.sized_chunk(into: 2) |> list.map(fn(chunk) { - let [start, length] = chunk + let assert [start, length] = chunk [SRange(start, start + length - 1)] |> remap_all_seed_ranges(mappers) }) @@ -131,22 +132,17 @@ fn do_remap_range(r: SeedRange, mapper: Mapper, acc: List(SeedRange)) { ] // range overlaps end but not start -> left side transformed, right side moves to next mapping [m, ..ms] if r.start >= m.start && r.end > m.end -> - do_remap_range( - SRange(m.end + 1, r.end), - ms, - [transform_range(SRange(r.start, m.end), m), ..acc], - ) + do_remap_range(SRange(m.end + 1, r.end), ms, [ + transform_range(SRange(r.start, m.end), m), + ..acc + ]) // mapping is fully inside range -> left not transformed, middle transformed, right to next [m, ..ms] -> - do_remap_range( - SRange(m.end + 1, r.end), - ms, - [ - SRange(r.start, m.start - 1), - transform_range(SRange(m.start, m.end), m), - ..acc - ], - ) + do_remap_range(SRange(m.end + 1, r.end), ms, [ + SRange(r.start, m.start - 1), + transform_range(SRange(m.start, m.end), m), + ..acc + ]) } } |