Skip to content

Commit 2962e3c

Browse files
committed
2024 day 9
1 parent 0d5a68d commit 2962e3c

File tree

4 files changed

+190
-0
lines changed

4 files changed

+190
-0
lines changed

2024/day9/day9.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strconv"
7+
"strings"
8+
)
9+
10+
func main() {
11+
filenames := []string{"testInput", "input"}
12+
for _, fileName := range filenames {
13+
fileContents, err := os.ReadFile(fileName)
14+
if err != nil {
15+
panic(err)
16+
}
17+
fmt.Println(fileName)
18+
fileContentsSplit := strings.Split(string(fileContents), "")
19+
fileContentsInt := make([]int, len(fileContentsSplit))
20+
diskSize := 0
21+
for index, value := range fileContentsSplit {
22+
fileContentsInt[index], _ = strconv.Atoi(value)
23+
diskSize += fileContentsInt[index]
24+
}
25+
//int for file id, -1 for free space
26+
var fileSystemContents = make([]int, diskSize)
27+
var cursorIsOnFile = true
28+
var fileSystemPosition = 0
29+
var fileIndex = -1
30+
for _, value := range fileContentsInt {
31+
if cursorIsOnFile {
32+
fileIndex++
33+
}
34+
nextFileStart := fileSystemPosition + value
35+
for ; fileSystemPosition < nextFileStart; fileSystemPosition++ {
36+
if cursorIsOnFile {
37+
fileSystemContents[fileSystemPosition] = fileIndex
38+
} else {
39+
fileSystemContents[fileSystemPosition] = -1 //free space
40+
}
41+
}
42+
cursorIsOnFile = !cursorIsOnFile
43+
}
44+
lastFreeSpaceInTheStart := 0
45+
firstNonFreeSpaceInTheEnd := len(fileSystemContents) - 1
46+
for {
47+
lastFreeSpaceInTheStart, firstNonFreeSpaceInTheEnd = defragOneBlock(lastFreeSpaceInTheStart, firstNonFreeSpaceInTheEnd, &fileSystemContents)
48+
if lastFreeSpaceInTheStart == -1 || firstNonFreeSpaceInTheEnd == -1 {
49+
break
50+
}
51+
}
52+
var total = 0
53+
for index, value := range fileSystemContents {
54+
if value != -1 {
55+
total += index * value
56+
}
57+
}
58+
println(total)
59+
}
60+
}
61+
func defragOneBlock(lastFreeSpaceInTheStart int, firstNonFreeSpaceInTheEnd int, diskContents *[]int) (int, int) {
62+
63+
var blockToMove = -1
64+
var freeSpace = -1
65+
for index := firstNonFreeSpaceInTheEnd; index > lastFreeSpaceInTheStart; index-- {
66+
if (*diskContents)[index] == -1 {
67+
continue
68+
}
69+
blockToMove = index
70+
break
71+
}
72+
for index := lastFreeSpaceInTheStart; index < firstNonFreeSpaceInTheEnd; index++ {
73+
if (*diskContents)[index] != -1 {
74+
continue
75+
}
76+
freeSpace = index
77+
break
78+
}
79+
if blockToMove == -1 || freeSpace == -1 {
80+
return -1, -1
81+
}
82+
(*diskContents)[freeSpace] = (*diskContents)[blockToMove]
83+
(*diskContents)[blockToMove] = -1
84+
85+
return freeSpace, blockToMove
86+
87+
}

2024/day9/day9_pt2.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strconv"
7+
"strings"
8+
)
9+
10+
func main() {
11+
filenames := []string{"testInput", "input"}
12+
for _, fileName := range filenames {
13+
fileContents, err := os.ReadFile(fileName)
14+
if err != nil {
15+
panic(err)
16+
}
17+
fmt.Println(fileName)
18+
fileContentsSplit := strings.Split(string(fileContents), "")
19+
fileContentsInt := make([]int, len(fileContentsSplit))
20+
diskSize := 0
21+
for index, value := range fileContentsSplit {
22+
fileContentsInt[index], _ = strconv.Atoi(value)
23+
diskSize += fileContentsInt[index]
24+
}
25+
//int for file id, -1 for free space
26+
var fileSystemContents = make([]int, diskSize)
27+
var cursorIsOnFile = true
28+
var fileSystemPosition = 0
29+
var fileIndex = -1
30+
var fileSizes = make([]int, len(fileContents)/2+1)
31+
for _, value := range fileContentsInt {
32+
if cursorIsOnFile {
33+
fileIndex++
34+
fileSizes[fileIndex] = value
35+
}
36+
nextFileStart := fileSystemPosition + value
37+
for ; fileSystemPosition < nextFileStart; fileSystemPosition++ {
38+
if cursorIsOnFile {
39+
fileSystemContents[fileSystemPosition] = fileIndex
40+
} else {
41+
fileSystemContents[fileSystemPosition] = -1 //free space
42+
}
43+
}
44+
cursorIsOnFile = !cursorIsOnFile
45+
}
46+
lastKnownFileEndPosition := len(fileSystemContents) - 1
47+
for {
48+
lastKnownFileEndPosition = defragOneFile(lastKnownFileEndPosition, &fileSystemContents, &fileSizes)
49+
if lastKnownFileEndPosition <= 0 {
50+
break
51+
}
52+
}
53+
var total = 0
54+
for index, value := range fileSystemContents {
55+
if value != -1 {
56+
total += index * value
57+
}
58+
}
59+
println(total)
60+
}
61+
}
62+
func defragOneFile(lastKnownFileEndPosition int, diskContents *[]int, fileSizes *[]int) int {
63+
64+
var actualFileEnd = -1
65+
for index := lastKnownFileEndPosition; index > 0; index-- {
66+
if (*diskContents)[index] == -1 {
67+
continue
68+
}
69+
actualFileEnd = index
70+
break
71+
}
72+
if actualFileEnd == -1 {
73+
return -1
74+
}
75+
var fileId = (*diskContents)[actualFileEnd]
76+
var fileSize = (*fileSizes)[fileId]
77+
var freeSpaceStart = -1
78+
scanDiskForFreeSpace:
79+
for diskIndex := 0; diskIndex < len(*diskContents); diskIndex++ {
80+
for fileIndex := diskIndex; fileIndex < min(diskIndex+fileSize, len(*diskContents)-1); fileIndex++ {
81+
if (*diskContents)[fileIndex] != -1 {
82+
continue scanDiskForFreeSpace
83+
}
84+
}
85+
freeSpaceStart = diskIndex
86+
break
87+
}
88+
var fileStart = actualFileEnd - fileSize + 1
89+
if freeSpaceStart == -1 || freeSpaceStart > fileStart {
90+
return fileStart - 1
91+
}
92+
for index := fileStart; index <= actualFileEnd; index++ {
93+
(*diskContents)[index] = -1
94+
}
95+
for index := freeSpaceStart; index <= min(freeSpaceStart+fileSize-1, len(*diskContents)-1); index++ {
96+
(*diskContents)[index] = fileId
97+
}
98+
99+
return fileStart - 1
100+
101+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy