mirror of
https://github.com/onyx-and-iris/aoc2023.git
synced 2024-11-15 15:10:49 +00:00
copy image from cachedImages
This commit is contained in:
parent
94ffd625c9
commit
eab63b0b36
@ -12,26 +12,28 @@ func cycleOnce(image img) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// cycleMany cycles a single image for a given number of iterations
|
// cycleMany cycles a single image for a given number of iterations
|
||||||
// it also caches the index of the iteration for each image
|
// it caches seen images as well as their location in the period
|
||||||
|
// finally it copies the cached image with idx matching the interval to image.raw
|
||||||
func cycleMany(image img, iterations int) {
|
func cycleMany(image img, iterations int) {
|
||||||
cache := make(map[string]int)
|
cachedIndexes := make(map[string]int)
|
||||||
|
cachedImages := make(map[int][]string)
|
||||||
i, start := 0, 0
|
i, start := 0, 0
|
||||||
for ; i < iterations; i++ {
|
for ; i < iterations; i++ {
|
||||||
cycleOnce(image)
|
cycleOnce(image)
|
||||||
|
|
||||||
if idx, ok := cache[image.String()]; ok { // we found first repeated image
|
if idx, ok := cachedIndexes[image.String()]; ok { // we found first repeated image
|
||||||
start = idx
|
start = idx
|
||||||
i++
|
i++
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
cache[image.String()] = i + 1
|
cachedIndexes[image.String()] = i + 1
|
||||||
|
cachedImages[i+1] = make([]string, len(image.raw))
|
||||||
|
copy(cachedImages[i+1], image.raw)
|
||||||
}
|
}
|
||||||
|
|
||||||
period := i - start // length of a full period
|
period := i - start // length of a full period
|
||||||
remaining := (iterations - i - 1) % period // number of cycles left in current period
|
copy(image.raw, cachedImages[start+((iterations-i-1)%period)]) // copy cachedImage into image.raw
|
||||||
for j := 0; j < remaining; j++ {
|
|
||||||
cycleOnce(image) // rotate to the final image in the period
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// two returns the load of all boulders after 1000000000 cycles
|
// two returns the load of all boulders after 1000000000 cycles
|
||||||
|
Loading…
Reference in New Issue
Block a user