package main import ( "fmt" "strconv" "strings" "unicode" ) const ( seedToSoilMap = "seed-to-soil map" soilToFertilizerMap = "soil-to-fertilizer map" fertilizerToWaterMap = "fertilizer-to-water map" waterToLightMap = "water-to-light map" lightToTemperatureMap = "light-to-temperature map" temperatureToHumidityMap = "temperature-to-humidity map" humidityToLocationMap = "humidity-to-location map" ) type almanac struct { seeds []int seedToSoil map[int]int soilToFertilizer map[int]int fertilizerToWater map[int]int waterToLight map[int]int lightToTemperature map[int]int temperatureToHumidity map[int]int humidityToLocation map[int]int } func parseAlmanac(contents []string) (almanac, error) { // Assumption: The first line always contains the seed numbers. An error is returned // if this is not the case or if the format is all wrong. seeds, err := parseSeedNums(contents[0]) if err != nil { return almanac{}, fmt.Errorf("unable to parse the seed numbers; %w", err) } // mapLines = []string{} // loop while contents > 0 // if line is blank // if map lines > 0 -> parse map and populate relevant field // mapLines = []string{} // else // if first rune is digit, add line to mapLines: // else get map name output := almanac{ seeds: seeds, } return output, nil } func parseSeedNums(seedStr string) ([]int, error) { expectedPrefix := "seeds:" if !strings.HasPrefix(seedStr, expectedPrefix) { return nil, fmt.Errorf("%q does not begin with %s", seedStr, expectedPrefix) } seedStr = seedStr[strings.Index(seedStr, ":")+1:] seeds := []int{} seedNum := "" addSeed := func(digit string) error { value, err := strconv.Atoi(digit) if err != nil { return fmt.Errorf("unable to convert %q to int; %w", digit, err) } seeds = append(seeds, value) return nil } for ind, s := range seedStr { if unicode.IsDigit(s) { seedNum = seedNum + string(s) if ind == len(seedStr)-1 { if err := addSeed(seedNum); err != nil { return nil, fmt.Errorf("unable to add %q to seeds; %w", seedNum, err) } } } else { if len(seedNum) > 0 { if err := addSeed(seedNum); err != nil { return nil, fmt.Errorf("unable to add %q to seeds; %w", seedNum, err) } } seedNum = "" } } return seeds, nil } func parseMap(mapLines []string) (map[int]int, error) { var mapMatrix [][]int return nil, nil }