From 36dc294e980b706991b6d670ee664aa4f2b09818 Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 26 Jan 2024 17:42:55 +0500 Subject: [PATCH] Update solution --- .../src/main/kotlin/Solution05.kt | 97 +++++++++++-------- .../src/test/kotlin/Solution05Test.kt | 2 +- 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/advent-of-code-2023/src/main/kotlin/Solution05.kt b/advent-of-code-2023/src/main/kotlin/Solution05.kt index 55b4c43..3d4da94 100644 --- a/advent-of-code-2023/src/main/kotlin/Solution05.kt +++ b/advent-of-code-2023/src/main/kotlin/Solution05.kt @@ -1,6 +1,6 @@ class Solution05(lines: List) { private var seeds: MutableList = mutableListOf() - private var maps: MutableMap = mutableMapOf() + private var maps: MutableList = mutableListOf() init { // Parse seeds @@ -8,24 +8,16 @@ class Solution05(lines: List) { seeds.addAll(seedsStr.split(" ").map{it.toULong()}) // Parse all maps - var currentSrc = "" for (line in lines.subList(2, lines.size)) { if (line.isEmpty()) continue if (line.contains(" map:")) { - val (mapTitle, _) = line.split(" ") - val (src, dest) = mapTitle.split("-to-") - currentSrc = src - - if (!maps.containsKey(currentSrc)) { - maps[currentSrc] = Ranges(dest) - } - + maps.add(MapList()) continue } val (destRangeStart, srcRangeStart, rangeLength) = line.split(" ") - maps[currentSrc]?.addRange( + maps.last().addRange( srcRangeStart.toULong(), destRangeStart.toULong(), rangeLength.toULong(), @@ -33,52 +25,63 @@ class Solution05(lines: List) { } } + // Part 1. fun getLowestLocationNumber(): ULong { return seeds - .map{convertSeedNumber(it, "location")} - .min() - } + .map{ + var num = it - fun getLowestLocationNumberForRangeOfSeeds(): ULong { - val allSeeds: MutableSet = mutableSetOf() + for (map in maps) { + num = map.mapSrcNumberToDest(num) + } - for (i in 0.. = mutableListOf() - while (dest != target) { - val ranges = maps[dest]!! - dest = ranges.destName - num = ranges.mapNumber(num) + for (mapper in map.mappers) { + // Find intersections + currentRanges + + + for (rng in currentRanges) { + + } + } + + currentRanges = newList } - return num + return 0UL } } -data class Ranges(val destName: String) { - val ranges: MutableList = mutableListOf() +// Map stores the rules for matching one number to another. +class MapList() { + val mappers: MutableList = mutableListOf() fun addRange(sourceRangeStart: ULong, destRangeStart: ULong, rangeLength: ULong) { - ranges.add(Range(sourceRangeStart, destRangeStart, rangeLength)) + mappers.add( + Mapper(sourceRangeStart, destRangeStart, rangeLength), + ) } - fun mapNumber(src: ULong): ULong { - for (range in ranges) { - if (src >= range.sourceRangeStart && src < range.sourceRangeStart + range.rangeLength) { - return range.destRangeStart + src - range.sourceRangeStart + fun mapSrcNumberToDest(src: ULong): ULong { + for (range in mappers) { + if (range.isNumberInSrcRange(src)) { + return range.srcValueToDest(src) } } @@ -86,4 +89,20 @@ data class Ranges(val destName: String) { } } -data class Range(val sourceRangeStart: ULong, val destRangeStart: ULong, val rangeLength: ULong) +// Mapper contains one line of map. +data class Mapper(val sourceRangeStart: ULong, val destRangeStart: ULong, val rangeLength: ULong) { + fun srcValueToDest(v: ULong): ULong { + return destRangeStart + v - sourceRangeStart + } + + fun isNumberInSrcRange(num: ULong): Boolean { + return num >= sourceRangeStart && num < sourceRangeStart + rangeLength + } +} + +// Range of numbers with the first number of corresponding location. +data class RangeFromLoc(val rangeStart: ULong, val rangeLength: ULong, val locationStart: ULong) { + fun getIntersection(newRangeStart: ULong, newRangeLength: ULong): RangeFromLoc { + return RangeFromLoc(rangeStart, rangeLength, locationStart) + } +} diff --git a/advent-of-code-2023/src/test/kotlin/Solution05Test.kt b/advent-of-code-2023/src/test/kotlin/Solution05Test.kt index a5878af..11387fb 100644 --- a/advent-of-code-2023/src/test/kotlin/Solution05Test.kt +++ b/advent-of-code-2023/src/test/kotlin/Solution05Test.kt @@ -13,7 +13,7 @@ class Solution05Test { fun solvePart1() { val text = ResourceReader().readFile("day-05/input.txt") val res = Solution05(text).getLowestLocationNumber() - println(res) + assertEquals(621354867UL, res) } @Test