This commit is contained in:
2024-12-09 16:46:10 +00:00
parent 19c4afdc98
commit f8c29be7ef
3 changed files with 135 additions and 0 deletions

117
2024/go/day09/day09.go Normal file
View File

@@ -0,0 +1,117 @@
package day09
import (
"adventofcode2024/utils"
"fmt"
)
func Part1(input string) int {
disk := []int{}
file_id := 0
for i := 0; i <= len(input); i++ {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, file_id)
}
i++
if i < len(input) {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, -1)
}
}
file_id++
}
printDisk(disk)
for i:=len(disk)-1;i>0;i--{
if disk[i] != -1 {
id := disk[i]
disk[i] = -1
for j:=0;j<=len(disk);j++ {
if disk[j] == -1 {
disk[j] = id
break
}
}
}
}
printDisk(disk)
checksum := 0
for i:=0;i<len(disk);i++ {
if disk[i] != -1 {
checksum += i * disk[i]
}
}
return checksum
}
func Part2(input string) int {
disk := []int{}
file_id := 0
for i := 0; i <= len(input); i++ {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, file_id)
}
i++
if i < len(input) {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, -1)
}
}
file_id++
}
printDisk(disk)
for i:=len(disk)-1;i>0;i--{
size := 0
if disk[i] != -1 {
id := disk[i]
for {
if i-size > 0 && disk[i-size] == id {
size++
} else {
break
}
}
free := 0
j := 0
found := false
for ;j<i && free < size;j++{
if disk[j] != -1 {
free = 0
continue
}
free++
if free == size { found = true }
}
if found {
for k:=0;k<size;k++ {
disk[i-k] = -1
disk[j-size+k] = id
}
// printDisk(disk)
}
i -= (size -1)
}
}
printDisk(disk)
checksum := 0
for i:=0;i<len(disk);i++ {
if disk[i] != -1 {
checksum += i * disk[i]
}
}
return checksum}
func printDisk(disk []int) {
for _, x := range disk {
if x == -1 {fmt.Print(".")} else {
fmt.Printf("%d", x)
}
}
fmt.Print("\n")
}

View File

@@ -0,0 +1,17 @@
package day09
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1("2333133121414131402")
require.Equal(t,1928, r)
}
func TestPart2(t *testing.T) {
r := Part2("2333133121414131402")
require.Equal(t, 2858, r)
}

1
2024/go/day09/input.txt Normal file

File diff suppressed because one or more lines are too long