117 lines
1.8 KiB
Go
117 lines
1.8 KiB
Go
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")
|
|
} |