day9
This commit is contained in:
117
2024/go/day09/day09.go
Normal file
117
2024/go/day09/day09.go
Normal 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")
|
||||
}
|
||||
17
2024/go/day09/day09_test.go
Normal file
17
2024/go/day09/day09_test.go
Normal 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
1
2024/go/day09/input.txt
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user