Skip to content

Commit 205764e

Browse files
committed
day9: first part solved
1 parent 02d23c3 commit 205764e

File tree

4 files changed

+118
-16
lines changed

4 files changed

+118
-16
lines changed

day9/example.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2333133121414131402

day9/main.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"os"
7+
8+
"github.com/fxnn/adventofcode2024/util"
9+
)
10+
11+
const FREE = -1
12+
13+
func calculateDiskBlocks(diskMap string) []int {
14+
var diskBlocks = []int{}
15+
16+
var freeSpace = false
17+
var fileId = 0
18+
for _, b := range diskMap {
19+
var blockCount = util.Atoi(string(b))
20+
var blockUsage int
21+
if freeSpace {
22+
blockUsage = FREE
23+
} else {
24+
blockUsage = fileId
25+
fileId++
26+
}
27+
diskBlocks = append(diskBlocks, util.Times(blockCount, blockUsage)...)
28+
freeSpace = !freeSpace
29+
}
30+
31+
return diskBlocks
32+
}
33+
34+
func printDiskBlocks(diskBlocks []int) {
35+
for _, b := range diskBlocks {
36+
if b == FREE {
37+
fmt.Print(".")
38+
} else {
39+
fmt.Printf("%d", b)
40+
}
41+
}
42+
}
43+
44+
func compact(in []int) []int {
45+
var out = make([]int, len(in))
46+
var j = len(out) - 1
47+
for i := range in {
48+
for j >= 0 && in[j] == FREE {
49+
j--
50+
}
51+
if i > j {
52+
out[i] = FREE
53+
} else if in[i] == FREE {
54+
out[i] = in[j]
55+
j--
56+
} else {
57+
out[i] = in[i]
58+
}
59+
}
60+
return out
61+
}
62+
63+
func checksum(diskBlocks []int) int {
64+
var checksum = 0
65+
for i, b := range diskBlocks {
66+
if b != FREE {
67+
checksum += i * b
68+
}
69+
}
70+
return checksum
71+
}
72+
73+
func main() {
74+
scanner := bufio.NewScanner(os.Stdin)
75+
scanner.Split(bufio.ScanLines)
76+
77+
scanner.Scan()
78+
var diskMap = scanner.Text()
79+
80+
var diskBlocks = calculateDiskBlocks(diskMap)
81+
printDiskBlocks(diskBlocks)
82+
fmt.Println()
83+
84+
diskBlocks = compact(diskBlocks)
85+
printDiskBlocks(diskBlocks)
86+
fmt.Println()
87+
88+
var checksum = checksum(diskBlocks)
89+
fmt.Printf("checksum: %d\n", checksum)
90+
}

util/slice.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package util
2+
3+
import "fmt"
4+
5+
func Times[T any](size int, value T) []T {
6+
a := make([]T, size)
7+
for i := range a {
8+
a[i] = value
9+
}
10+
return a
11+
}
12+
13+
// RemoveElement removes element with given index from slice
14+
func RemoveElement(slice []int, index int) ([]int, error) {
15+
if index < 0 || index >= len(slice) {
16+
return nil, fmt.Errorf("index out of range")
17+
}
18+
19+
// Create a new slice and copy the elements before the index
20+
newSlice := make([]int, 0, len(slice)-1)
21+
newSlice = append(newSlice, slice[:index]...)
22+
23+
// Append the elements after the index
24+
newSlice = append(newSlice, slice[index+1:]...)
25+
26+
return newSlice, nil
27+
}

util/util.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,3 @@ func Sign(x int) int {
5252
}
5353
return -1
5454
}
55-
56-
// RemoveElement removes element with given index from slice
57-
func RemoveElement(slice []int, index int) ([]int, error) {
58-
if index < 0 || index >= len(slice) {
59-
return nil, fmt.Errorf("index out of range")
60-
}
61-
62-
// Create a new slice and copy the elements before the index
63-
newSlice := make([]int, 0, len(slice)-1)
64-
newSlice = append(newSlice, slice[:index]...)
65-
66-
// Append the elements after the index
67-
newSlice = append(newSlice, slice[index+1:]...)
68-
69-
return newSlice, nil
70-
}

0 commit comments

Comments
 (0)