diff options
Diffstat (limited to '2024/go/src/day9')
| -rw-r--r-- | 2024/go/src/day9/main.go | 169 |
1 files changed, 0 insertions, 169 deletions
diff --git a/2024/go/src/day9/main.go b/2024/go/src/day9/main.go deleted file mode 100644 index 0a9b51b..0000000 --- a/2024/go/src/day9/main.go +++ /dev/null @@ -1,169 +0,0 @@ -package main - -import ( - "fmt" - "os" - "strconv" -) - -func InsertAt(arr *[]FileBlock, index int, value FileBlock) error { - if index < 0 || index > len(*arr) { - return fmt.Errorf("index out of range") - } - *arr = append((*arr)[:index], append([]FileBlock{value}, (*arr)[index:]...)...) - return nil -} - -func RemoveAt(arr *[]FileBlock, index int) (FileBlock, error) { - if index < 0 || index >= len(*arr) { - return FileBlock{}, fmt.Errorf("index out of range") - } - ele := (*arr)[index] - *arr = append((*arr)[:index], (*arr)[index+1:]...) - return ele, nil -} - -func FileRead(path string) string { - file, err := os.ReadFile(path) - if err != nil { - fmt.Println("Couldn't Read file: ", err) - } - return string(file) - -} - -func parseInput(data string) string { - return data -} - -func genereateBlockMap(diskMap string) []string { - var blockMap []string - id := 0 - for i, ch := range diskMap { - rep, _ := strconv.Atoi(string(ch)) - if i%2 == 0 { - for i := 0; i < rep; i++ { - blockMap = append(blockMap, strconv.Itoa(id)) - } - id += 1 - } else { - for i := 0; i < rep; i++ { - blockMap = append(blockMap, ".") - } - } - } - return blockMap -} - -func genereateFileBlocks(diskMap string) []FileBlock { - var fileBlocks []FileBlock - id := 0 - for i, ch := range diskMap { - rep, _ := strconv.Atoi(string(ch)) - if i%2 == 0 { - block := FileBlock{id: id, space: rep} - fileBlocks = append(fileBlocks, block) - id += 1 - } else { - block := FileBlock{id: -1, space: rep} - if rep > 0 { - fileBlocks = append(fileBlocks, block) - } - } - } - return fileBlocks -} - -func moveBlocks(blockMap []string) { - i := 0 - j := len(blockMap) - 1 - for i < j { - if blockMap[i] == "." { - if blockMap[j] != "." { - blockMap[i], blockMap[j] = blockMap[j], blockMap[i] - i++ - } - j-- - } else { - i++ - } - } -} - -type FileBlock struct { - id int // id -1 will be the free block '.' - space int -} - -func moveBlocksPartTwo(fileBlocks []FileBlock) []string { - for i := 0; i < len(fileBlocks); i++ { - if fileBlocks[i].id != -1 { - continue - } - for j := len(fileBlocks) - 1; j >= i; j-- { - if fileBlocks[j].id == -1 { - continue - } - if fileBlocks[i].space == fileBlocks[j].space { - fileBlocks[i], fileBlocks[j] = fileBlocks[j], fileBlocks[i] - i++ - j-- - break - } else if fileBlocks[i].space > fileBlocks[j].space { - _ = InsertAt(&fileBlocks, i+1, FileBlock{id: -1, space: fileBlocks[i].space - fileBlocks[j].space}) - spaceJ := fileBlocks[j+1].space - fileBlocks[i], fileBlocks[j+1] = fileBlocks[j+1], fileBlocks[i] - fileBlocks[j+1].id = -1 - fileBlocks[j+1].space = spaceJ - break - } - } - } - var blocks []string - for _, block := range fileBlocks { - if block.id == -1 { - for i := 0; i < block.space; i++ { - blocks = append(blocks, ".") - } - } else { - for i := 0; i < block.space; i++ { - blocks = append(blocks, strconv.Itoa(block.id)) - } - } - } - return blocks -} - -func checkSum(blockMap []string) int64 { - var sum int64 = 0 - for i, ch := range blockMap { - if ch == "." { - continue - } - id, _ := strconv.Atoi(ch) - sum += int64(id) * int64(i) - } - return sum -} -func solve_part_one(data string) int64 { - diskMap := parseInput(data) - blockMap := genereateBlockMap(diskMap) - moveBlocks(blockMap) - return checkSum(blockMap) -} - -func solve_part_two(data string) int64 { - diskMap := parseInput(data) - fileBlocks := genereateFileBlocks(diskMap) - blocks := moveBlocksPartTwo(fileBlocks) - return checkSum(blocks) -} - -func main() { - test := FileRead("../input/day9.test") - prod := FileRead("../input/day9.prod") - fmt.Println("Part_1 test: ", solve_part_one(test)) - fmt.Println("Part_1 prod: ", solve_part_one(prod)) - fmt.Println("Part_2 test: ", solve_part_two(test)) - fmt.Println("Part_2 prod: ", solve_part_two(prod)) -} |
