From 353d5e92c98bf33286f0d32ec68c71d152765a20 Mon Sep 17 00:00:00 2001 From: David Ashby Date: Tue, 15 Dec 2020 21:41:07 -0500 Subject: [PATCH] performance improvements; no more string conversions or lookups in the map --- 15/main.go | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/15/main.go b/15/main.go index 0191b3a..4a16246 100644 --- a/15/main.go +++ b/15/main.go @@ -4,6 +4,7 @@ import ( "bufio" "fmt" "os" + "strconv" "strings" "time" ) @@ -55,32 +56,30 @@ func partTwo() { // caching implementation. It's still slow, but it at least finishes...! scanner.Scan() numbers := strings.Split(scanner.Text(), ",") - seen := make(map[string]int) + seen := make(map[int]int) // load in numbers for i, v := range numbers[:len(numbers)-1] { - seen[v] = i + j, _ := strconv.Atoi(v) + seen[j] = i } + i := len(numbers) - 1 + lastNumber, _ := strconv.Atoi(numbers[i]) for { - i := len(numbers) - 1 - lastNumber := numbers[i] - if len(numbers) == 30000000 { - fmt.Println(numbers[30000000-1]) + if seen[lastNumber] == 30000000-1 { + fmt.Println(lastNumber) return } - if v, ok := seen[lastNumber]; !ok { - // never seen that before - numbers = append(numbers, "0") - seen[lastNumber] = i - continue - } else { + if v, ok := seen[lastNumber]; ok { // a number matched; insert the difference between the last number and when we last saw it - n := fmt.Sprintf("%d", i-v) - numbers = append(numbers, n) seen[lastNumber] = i - continue + lastNumber = i - v + } else { + // never seen that before + seen[lastNumber] = i + lastNumber = 0 } + i = i + 1 } - }