Compare commits

..

2 Commits

Author SHA1 Message Date
b04ae5c077
day 4 2025-12-04 09:02:48 +02:00
2834ad59ee
use logger interface 2025-12-04 08:36:46 +02:00
7 changed files with 102 additions and 13 deletions

4
go.mod
View File

@ -1,3 +1,7 @@
module git.bizdoc.ro/gabi-public/Advent-of-Code.git
go 1.25.1
require git.bizdoc.ro/private/devkit.git v0.0.0-20250902190935-21cc248cb135
require golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect

4
go.sum Normal file
View File

@ -0,0 +1,4 @@
git.bizdoc.ro/private/devkit.git v0.0.0-20250902190935-21cc248cb135 h1:mUorxNlLlyvmPuZMKP80RFJVRcI1j85u1g8TDPht7AM=
git.bizdoc.ro/private/devkit.git v0.0.0-20250902190935-21cc248cb135/go.mod h1:r/tE3YYNlrYNQc9DF4ph2Ur5WYKCtaqOM+8jqvzSoAQ=
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo=
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak=

View File

@ -5,11 +5,10 @@ import (
"fmt"
"io"
"iter"
"log"
"strconv"
)
func Day1Part1(r io.Reader, l *log.Logger) (any, error) {
func Day1Part1(r io.Reader, l Logger) (any, error) {
dial := 50
solution := 0
for pair := range day1GetPairs(r) {
@ -27,7 +26,7 @@ func Day1Part1(r io.Reader, l *log.Logger) (any, error) {
return solution, nil
}
func Day1Part2Slow(r io.Reader, l *log.Logger) (any, error) {
func Day1Part2Slow(r io.Reader, l Logger) (any, error) {
dial := 50
solution := 0
for pair := range day1GetPairs(r) {
@ -45,7 +44,7 @@ func Day1Part2Slow(r io.Reader, l *log.Logger) (any, error) {
return solution, nil
}
func Day1Part2Fast(r io.Reader, l *log.Logger) (any, error) {
func Day1Part2Fast(r io.Reader, l Logger) (any, error) {
dial := 50
solution := 0
for pair := range day1GetPairs(r) {

View File

@ -5,7 +5,6 @@ import (
"bytes"
"fmt"
"io"
"log"
"strconv"
"strings"
@ -51,7 +50,7 @@ func (s *day2Scanner) Bounds() (int, int) {
return s.a, s.b
}
func Day2Part1Simple(r io.Reader, l *log.Logger) (any, error) {
func Day2Part1Simple(r io.Reader, l Logger) (any, error) {
input, err := aocutils.ReadString(r)
if err != nil {
return nil, fmt.Errorf("failed to read input: %s", err)
@ -95,7 +94,7 @@ func Day2Part1Simple(r io.Reader, l *log.Logger) (any, error) {
return sum, nil
}
func Day2Part2Simple(r io.Reader, l *log.Logger) (any, error) {
func Day2Part2Simple(r io.Reader, l Logger) (any, error) {
input, err := aocutils.ReadString(r)
if err != nil {
return nil, fmt.Errorf("failed to read input: %s", err)
@ -155,7 +154,7 @@ func Day2Part2Simple(r io.Reader, l *log.Logger) (any, error) {
return sum, nil
}
func Day2Part1(r io.Reader, logger *log.Logger) (any, error) {
func Day2Part1(r io.Reader, logger Logger) (any, error) {
inputScanner := bufio.NewScanner(r)
inputScanner.Split(aocutils.SplitComma)
scanner := &day2Scanner{scanner: inputScanner, sep: '-'}
@ -182,7 +181,7 @@ func Day2Part1(r io.Reader, logger *log.Logger) (any, error) {
return sum, scanner.Err()
}
func Day2Part2(r io.Reader, logger *log.Logger) (any, error) {
func Day2Part2(r io.Reader, logger Logger) (any, error) {
inputScanner := bufio.NewScanner(r)
inputScanner.Split(aocutils.SplitComma)

View File

@ -4,17 +4,16 @@ import (
"bufio"
"fmt"
"io"
"log"
"strings"
)
func Day3Part1(r io.Reader, l *log.Logger) (any, error) {
func Day3Part1(r io.Reader, l Logger) (any, error) {
return Day3(r, l, 2)
}
func Day3Part2(r io.Reader, l *log.Logger) (any, error) {
func Day3Part2(r io.Reader, l Logger) (any, error) {
return Day3(r, l, 12)
}
func Day3(r io.Reader, logger *log.Logger, size int) (int64, error) {
func Day3(r io.Reader, logger Logger, size int) (int64, error) {
scanner := bufio.NewScanner(r)
scanner.Split(bufio.ScanLines)
var sum int64

78
year25/day4.go Normal file
View File

@ -0,0 +1,78 @@
package year25
import (
"fmt"
"io"
"git.bizdoc.ro/private/devkit.git/collections/geometry/v2"
)
const Day4PaperRoll = '@'
func Day4Part1(r io.Reader, l Logger) (any, error) {
// 4 rolls in 8 adjacent positions
var accessibleRolls int
g, err := geometry.ReaderToByteGrid(r)
if err != nil {
return nil, fmt.Errorf("day4: failed to read grid: %w", err)
}
for c := range g.Points() {
if g.At(c) != Day4PaperRoll {
continue
}
var count int
for p := range g.SubgridPointsIter(c.MoveUpLeft(), c.MoveDownRight()) {
if g.At(p) == Day4PaperRoll {
count += 1
}
}
if count <= 4 {
accessibleRolls += 1
}
}
return accessibleRolls, nil
}
func Day4Part2(r io.Reader, l Logger) (any, error) {
// 4 rolls in 8 adjacent positions
var totalRemovedRolls int
g, err := geometry.ReaderToByteGrid(r)
if err != nil {
return nil, fmt.Errorf("day4: failed to read grid: %w", err)
}
for {
removedRolls := 0
for c := range g.Points() {
if g.At(c) != Day4PaperRoll {
continue
}
var count int
for p := range g.SubgridPointsIter(c.MoveUpLeft(), c.MoveDownRight()) {
if g.At(p) == Day4PaperRoll {
count += 1
}
}
if count <= 4 {
removedRolls += 1
g.Set(c, '.') // remove grid
}
}
if removedRolls == 0 {
break
}
totalRemovedRolls += removedRolls
}
return totalRemovedRolls, nil
}

6
year25/utils.go Normal file
View File

@ -0,0 +1,6 @@
package year25
type Logger interface {
Printf(string, ...interface{})
Println(...interface{})
}