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