From 0f07ffcc0054f712adf8bd955578fc240dae3017 Mon Sep 17 00:00:00 2001 From: David Ashby Date: Wed, 15 Dec 2021 22:11:02 -0500 Subject: [PATCH] day 15 part 1 works. part 2 works on the sample, not the real input. --- 15/main.go | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 15/main.go diff --git a/15/main.go b/15/main.go new file mode 100644 index 0000000..6b87f9f --- /dev/null +++ b/15/main.go @@ -0,0 +1,128 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" + "time" +) + +func mustAtoi(line string) int { + i, _ := strconv.Atoi(line) + return i +} + +func main() { + start := time.Now() + partOne() + duration := time.Since(start) + partTwo() + duration2 := time.Since(start) + fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration) +} + +func makeScanner(test bool) *bufio.Scanner { + var f *os.File + if test { + f, _ = os.Open("inputs/testinput") + } else { + f, _ = os.Open("inputs/input") + } + reader := bufio.NewReader(f) + return bufio.NewScanner(reader) +} + +type room struct { + row int + col int + distance int + cost int +} + +func partOne() { + scanner := makeScanner(false) + + grid := [100][100]room{} + col := 0 + for scanner.Scan() { + line := scanner.Text() + for row, v := range line { + r := room{ + distance: 1000, + cost: mustAtoi(string(v)), + } + grid[row][col] = r + } + col++ + } + grid[0][0].distance = 0 + + for row := 0; row < 100; row++ { + for col := 0; col < 100; col++ { + if col+1 < 100 { + d := grid[row][col+1].distance + // if the cost of the space is less than the current known distance, this is the best route there + if d > grid[row][col+1].cost+grid[row][col].distance { + grid[row][col+1].distance = grid[row][col].distance + grid[row][col+1].cost + } + } + if row+1 < 100 { + d := grid[row+1][col].distance + // if the cost of the space is less than the current known distance, this is the best route there + if d > grid[row+1][col].cost+grid[row][col].distance { + grid[row+1][col].distance = grid[row][col].distance + grid[row+1][col].cost + } + } + } + } + fmt.Println(grid[99][99].distance) +} + +func partTwo() { + scanner := makeScanner(false) + width := 100 + scale := 5 + len := width * scale + + grid := [500][500]room{} + col := 0 + for scanner.Scan() { + line := scanner.Text() + for row, v := range line { + for i := 0; i < scale; i++ { + for j := 0; j < scale; j++ { + cost := mustAtoi(string(v)) + i + j + if cost > 9 { + cost = ((mustAtoi(string(v)) + i + j) % 10) + 1 + } + grid[row+i*width][col+j*width] = room{ + row: row + i*width, + col: col + j*width, + distance: 100000, + cost: cost, + } + } + } + } + col++ + } + grid[0][0].distance = 0 + + for row := 0; row < len; row++ { + for col := 0; col < len; col++ { + // if the cost of the space is less than the current known distance, this is the best route there + if col+1 < len { + if grid[row][col+1].distance > grid[row][col+1].cost+grid[row][col].distance { + grid[row][col+1].distance = grid[row][col].distance + grid[row][col+1].cost + } + } + if row+1 < len { + if grid[row+1][col].distance > grid[row+1][col].cost+grid[row][col].distance { + grid[row+1][col].distance = grid[row][col].distance + grid[row+1][col].cost + } + } + } + } + fmt.Println(grid[width*scale-1][width*scale-1]) +}