add day9
This commit is contained in:
93
day9/checksum.go
Normal file
93
day9/checksum.go
Normal file
@@ -0,0 +1,93 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
|
||||
// general util
|
||||
func check(e error) {
|
||||
if e != nil { panic(e) }
|
||||
}
|
||||
|
||||
func pop(arr []int, index *int) int {
|
||||
/* get last element that is not a -1 and replacing it with -1 int the source slice */
|
||||
for i := len(arr) - 1; i >= 0; i-- {
|
||||
if arr[i] != -1 {
|
||||
(*index) = i
|
||||
elem := arr[i]
|
||||
arr[i] = -1
|
||||
return elem
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func insert(arr []int, n int) int {
|
||||
/* insert element at the first -1, return the index of this -1 */
|
||||
for i, elem := range arr {
|
||||
if elem == -1 {
|
||||
arr[i] = n
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// main loop
|
||||
func main() {
|
||||
|
||||
// read in file
|
||||
dat, err := os.ReadFile("data.txt")
|
||||
check(err)
|
||||
dat_str := strings.TrimSpace(string(dat))
|
||||
|
||||
// contruct input as int arr
|
||||
input := make([]int, 0, len(dat_str))
|
||||
mem_size := 0
|
||||
for _, char := range []rune(dat_str) {
|
||||
num, err := strconv.Atoi(string(char))
|
||||
check(err)
|
||||
mem_size += num
|
||||
input = append(input, num)
|
||||
}
|
||||
|
||||
// convert to actual memory representation
|
||||
mem := make([]int, 0, mem_size)
|
||||
is_file := true
|
||||
file_id := 0
|
||||
for _, elem := range input {
|
||||
if is_file {
|
||||
for range elem {
|
||||
mem = append(mem, file_id)
|
||||
}
|
||||
file_id++
|
||||
} else {
|
||||
for range elem {
|
||||
mem = append(mem, -1)
|
||||
}
|
||||
}
|
||||
is_file = !is_file
|
||||
}
|
||||
|
||||
// reorder
|
||||
idx_pop := -1
|
||||
idx_insert := -2
|
||||
|
||||
for idx_pop != idx_insert {
|
||||
elem := pop(mem, &idx_pop)
|
||||
idx_insert = insert(mem, elem)
|
||||
}
|
||||
|
||||
// calc checksum
|
||||
checksum := 0
|
||||
for i, elem := range mem {
|
||||
if elem == -1 { break }
|
||||
checksum += i * elem
|
||||
}
|
||||
|
||||
fmt.Println(checksum)
|
||||
}
|
||||
Reference in New Issue
Block a user