mirror of
				https://github.com/onyx-and-iris/aoc2024.git
				synced 2025-11-04 06:51:47 +00:00 
			
		
		
		
	add day-04 + benchmarks
This commit is contained in:
		
							parent
							
								
									fca32422e4
								
							
						
					
					
						commit
						e7aa98d637
					
				
							
								
								
									
										15
									
								
								day-04/benchmark
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								day-04/benchmark
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
goos: linux
 | 
			
		||||
goarch: amd64
 | 
			
		||||
pkg: github.com/onyx-and-iris/aoc2024/day-04
 | 
			
		||||
cpu: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.007163 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.007083 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.007305 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.006918 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.006992 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.007054 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.007061 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.007061 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.007928 ns/op
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.007870 ns/op
 | 
			
		||||
ok  	github.com/onyx-and-iris/aoc2024/day-04	0.470s
 | 
			
		||||
							
								
								
									
										41
									
								
								day-04/cmd/cli/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								day-04/cmd/cli/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,41 @@
 | 
			
		||||
/********************************************************************************
 | 
			
		||||
    Advent of Code 2024 - day-04
 | 
			
		||||
********************************************************************************/
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"embed"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"slices"
 | 
			
		||||
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
 | 
			
		||||
	problems "github.com/onyx-and-iris/aoc2024/day-04"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:embed testdata
 | 
			
		||||
var files embed.FS
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	filename := flag.String("f", "input.txt", "input file")
 | 
			
		||||
	loglevel := flag.Int("l", int(log.InfoLevel), "log level")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	if slices.Contains(log.AllLevels, log.Level(*loglevel)) {
 | 
			
		||||
		log.SetLevel(log.Level(*loglevel))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data, err := files.ReadFile(fmt.Sprintf("testdata/%s", *filename))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	one, two, err := problems.Solve(data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Printf("solution one: %d\nsolution two: %d\n", one, two)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								day-04/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								day-04/go.mod
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
module github.com/onyx-and-iris/aoc2024/day-04
 | 
			
		||||
 | 
			
		||||
go 1.23.3
 | 
			
		||||
 | 
			
		||||
require github.com/sirupsen/logrus v1.9.3
 | 
			
		||||
 | 
			
		||||
require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
 | 
			
		||||
							
								
								
									
										15
									
								
								day-04/go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								day-04/go.sum
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 | 
			
		||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 | 
			
		||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
							
								
								
									
										6
									
								
								day-04/internal/one/benchmark
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								day-04/internal/one/benchmark
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
goos: linux
 | 
			
		||||
goarch: amd64
 | 
			
		||||
pkg: github.com/onyx-and-iris/aoc2024/day-04/internal/one
 | 
			
		||||
cpu: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.001288 ns/op
 | 
			
		||||
ok  	github.com/onyx-and-iris/aoc2024/day-04/internal/one	0.013s
 | 
			
		||||
							
								
								
									
										12
									
								
								day-04/internal/one/direction.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								day-04/internal/one/direction.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
package one
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	N = iota
 | 
			
		||||
	NE
 | 
			
		||||
	E
 | 
			
		||||
	SE
 | 
			
		||||
	S
 | 
			
		||||
	SW
 | 
			
		||||
	W
 | 
			
		||||
	NW
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										58
									
								
								day-04/internal/one/neighbours.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								day-04/internal/one/neighbours.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,58 @@
 | 
			
		||||
package one
 | 
			
		||||
 | 
			
		||||
type neighbour struct {
 | 
			
		||||
	x         int
 | 
			
		||||
	y         int
 | 
			
		||||
	direction int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newNeighbour(direction, x, y int) neighbour {
 | 
			
		||||
	switch direction {
 | 
			
		||||
	case N:
 | 
			
		||||
		return neighbour{x, y + 1, direction}
 | 
			
		||||
	case NE:
 | 
			
		||||
		return neighbour{x + 1, y + 1, direction}
 | 
			
		||||
	case E:
 | 
			
		||||
		return neighbour{x + 1, y, direction}
 | 
			
		||||
	case SE:
 | 
			
		||||
		return neighbour{x + 1, y - 1, direction}
 | 
			
		||||
	case S:
 | 
			
		||||
		return neighbour{x, y - 1, direction}
 | 
			
		||||
	case SW:
 | 
			
		||||
		return neighbour{x - 1, y - 1, direction}
 | 
			
		||||
	case W:
 | 
			
		||||
		return neighbour{x - 1, y, direction}
 | 
			
		||||
	case NW:
 | 
			
		||||
		return neighbour{x - 1, y + 1, direction}
 | 
			
		||||
	default:
 | 
			
		||||
		return neighbour{}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type neighbours struct {
 | 
			
		||||
	N  neighbour
 | 
			
		||||
	NE neighbour
 | 
			
		||||
	E  neighbour
 | 
			
		||||
	SE neighbour
 | 
			
		||||
	S  neighbour
 | 
			
		||||
	SW neighbour
 | 
			
		||||
	W  neighbour
 | 
			
		||||
	NW neighbour
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newNeighbours(x, y int) neighbours {
 | 
			
		||||
	return neighbours{
 | 
			
		||||
		newNeighbour(N, x, y),
 | 
			
		||||
		newNeighbour(NE, x, y),
 | 
			
		||||
		newNeighbour(E, x, y),
 | 
			
		||||
		newNeighbour(SE, x, y),
 | 
			
		||||
		newNeighbour(S, x, y),
 | 
			
		||||
		newNeighbour(SW, x, y),
 | 
			
		||||
		newNeighbour(W, x, y),
 | 
			
		||||
		newNeighbour(NW, x, y),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n neighbours) all() [8]neighbour {
 | 
			
		||||
	return [8]neighbour{n.N, n.NE, n.E, n.SE, n.S, n.SW, n.W, n.NW}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								day-04/internal/one/solve.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								day-04/internal/one/solve.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
package one
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
 | 
			
		||||
	"github.com/onyx-and-iris/aoc2024/day-04/internal/util"
 | 
			
		||||
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Solve(data []byte) (int, error) {
 | 
			
		||||
	r := bytes.NewReader(data)
 | 
			
		||||
	lines, err := util.ReadLines(r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var sum int
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < len(lines); i++ {
 | 
			
		||||
		for j := 0; j < len(lines[i]); j++ {
 | 
			
		||||
			neighbours := newNeighbours(j, i)
 | 
			
		||||
			for _, n := range neighbours.all() {
 | 
			
		||||
				if n.x < 0 || n.y < 0 || n.y >= len(lines) || n.x >= len(lines[i]) {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if lines[i][j] == 'X' {
 | 
			
		||||
					if checkNeighbours(n, "MAS", lines) {
 | 
			
		||||
						sum++
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sum, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkNeighbours(n neighbour, word string, lines []string) bool {
 | 
			
		||||
	if len(word) == 0 {
 | 
			
		||||
		log.Debug("we found a full XMAS")
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if n.x < 0 || n.y < 0 || n.y >= len(lines) || n.x >= len(lines[n.y]) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if lines[n.y][n.x] != word[0] {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return checkNeighbours(newNeighbour(n.direction, n.x, n.y), word[1:], lines)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								day-04/internal/one/solve_internal_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								day-04/internal/one/solve_internal_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
package one
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	_ "embed"
 | 
			
		||||
	"os"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:embed testdata/input.txt
 | 
			
		||||
var data []byte
 | 
			
		||||
 | 
			
		||||
func BenchmarkSolve(b *testing.B) {
 | 
			
		||||
	os.Stdout, _ = os.Open(os.DevNull)
 | 
			
		||||
	Solve(data)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								day-04/internal/two/benchmark
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								day-04/internal/two/benchmark
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
goos: linux
 | 
			
		||||
goarch: amd64
 | 
			
		||||
pkg: github.com/onyx-and-iris/aoc2024/day-04/internal/two
 | 
			
		||||
cpu: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
 | 
			
		||||
BenchmarkSolve-12    	1000000000	         0.005979 ns/op
 | 
			
		||||
ok  	github.com/onyx-and-iris/aoc2024/day-04/internal/two	0.042s
 | 
			
		||||
							
								
								
									
										8
									
								
								day-04/internal/two/direction.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								day-04/internal/two/direction.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
package two
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NW = iota
 | 
			
		||||
	NE
 | 
			
		||||
	SE
 | 
			
		||||
	SW
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										56
									
								
								day-04/internal/two/matrix.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								day-04/internal/two/matrix.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,56 @@
 | 
			
		||||
package two
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type matrix [3][3]rune
 | 
			
		||||
 | 
			
		||||
func newMatrix(mid, nw, ne, se, sw rune) *matrix {
 | 
			
		||||
	return &matrix{
 | 
			
		||||
		{nw, -1, ne},
 | 
			
		||||
		{-1, mid, -1},
 | 
			
		||||
		{sw, -1, se},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *matrix) String() string {
 | 
			
		||||
	temp := [3][3]string{}
 | 
			
		||||
	for i := 0; i < 3; i++ {
 | 
			
		||||
		for j := 0; j < 3; j++ {
 | 
			
		||||
			temp[i][j] = string(m[i][j])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("\n%s\n%s\n%s", temp[0], temp[1], temp[2])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *matrix) rotate() *matrix {
 | 
			
		||||
	temp := matrix{}
 | 
			
		||||
	for i := 0; i < 3; i++ {
 | 
			
		||||
		for j := 0; j < 3; j++ {
 | 
			
		||||
			temp[3-j-1][i] = m[i][j]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return &temp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *matrix) validate() bool {
 | 
			
		||||
	golden := &matrix{
 | 
			
		||||
		{'M', -1, 'M'},
 | 
			
		||||
		{-1, 'A', -1},
 | 
			
		||||
		{'S', -1, 'S'},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for range 4 {
 | 
			
		||||
		if reflect.DeepEqual(m, golden) {
 | 
			
		||||
			log.Debugf("%s \n---- %s", m.String(), golden.String())
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
		golden = golden.rotate()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								day-04/internal/two/neighbours.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								day-04/internal/two/neighbours.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,50 @@
 | 
			
		||||
package two
 | 
			
		||||
 | 
			
		||||
type neighbour struct {
 | 
			
		||||
	x         int
 | 
			
		||||
	y         int
 | 
			
		||||
	direction int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newNeighbour(direction, x, y int) neighbour {
 | 
			
		||||
	switch direction {
 | 
			
		||||
	case NW:
 | 
			
		||||
		return neighbour{x - 1, y + 1, direction}
 | 
			
		||||
	case NE:
 | 
			
		||||
		return neighbour{x + 1, y + 1, direction}
 | 
			
		||||
	case SE:
 | 
			
		||||
		return neighbour{x + 1, y - 1, direction}
 | 
			
		||||
	case SW:
 | 
			
		||||
		return neighbour{x - 1, y - 1, direction}
 | 
			
		||||
	default:
 | 
			
		||||
		return neighbour{}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n neighbour) outOfBounds(lines []string) bool {
 | 
			
		||||
	return n.x < 0 || n.y < 0 || n.y >= len(lines) || n.x >= len(lines[0])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n neighbour) value(lines []string) rune {
 | 
			
		||||
	return rune(lines[n.y][n.x])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type neighbours struct {
 | 
			
		||||
	NW neighbour
 | 
			
		||||
	NE neighbour
 | 
			
		||||
	SE neighbour
 | 
			
		||||
	SW neighbour
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newNeighbours(x, y int) neighbours {
 | 
			
		||||
	return neighbours{
 | 
			
		||||
		newNeighbour(NW, x, y),
 | 
			
		||||
		newNeighbour(NE, x, y),
 | 
			
		||||
		newNeighbour(SE, x, y),
 | 
			
		||||
		newNeighbour(SW, x, y),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (n neighbours) all() [4]neighbour {
 | 
			
		||||
	return [4]neighbour{n.NW, n.NE, n.SE, n.SW}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								day-04/internal/two/solve.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								day-04/internal/two/solve.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
package two
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"slices"
 | 
			
		||||
 | 
			
		||||
	"github.com/onyx-and-iris/aoc2024/day-04/internal/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Solve(data []byte) (int, error) {
 | 
			
		||||
	r := bytes.NewReader(data)
 | 
			
		||||
	lines, err := util.ReadLines(r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var sum int
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < len(lines); i++ {
 | 
			
		||||
		for j := 0; j < len(lines[i]); j++ {
 | 
			
		||||
			if lines[i][j] == 'A' {
 | 
			
		||||
				neighbours := newNeighbours(j, i)
 | 
			
		||||
				if func() bool {
 | 
			
		||||
					for _, n := range neighbours.all() {
 | 
			
		||||
						if n.outOfBounds(lines) {
 | 
			
		||||
							return true
 | 
			
		||||
						}
 | 
			
		||||
						if !slices.Contains([]rune{'M', 'S'}, n.value(lines)) {
 | 
			
		||||
							return true
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					return false
 | 
			
		||||
				}() {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				matrix := newMatrix(
 | 
			
		||||
					rune(lines[i][j]),
 | 
			
		||||
					neighbours.NW.value(lines),
 | 
			
		||||
					neighbours.NE.value(lines),
 | 
			
		||||
					neighbours.SE.value(lines),
 | 
			
		||||
					neighbours.SW.value(lines),
 | 
			
		||||
				)
 | 
			
		||||
 | 
			
		||||
				if matrix.validate() {
 | 
			
		||||
					sum++
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sum, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								day-04/internal/two/solve_internal_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								day-04/internal/two/solve_internal_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
package two
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	_ "embed"
 | 
			
		||||
	"os"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:embed testdata/input.txt
 | 
			
		||||
var data []byte
 | 
			
		||||
 | 
			
		||||
func BenchmarkSolve(b *testing.B) {
 | 
			
		||||
	os.Stdout, _ = os.Open(os.DevNull)
 | 
			
		||||
	Solve(data)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								day-04/internal/util/util.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								day-04/internal/util/util.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
			
		||||
package util
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func ReadLines(r io.Reader) ([]string, error) {
 | 
			
		||||
	lines := []string{}
 | 
			
		||||
 | 
			
		||||
	scanner := bufio.NewScanner(r)
 | 
			
		||||
	for scanner.Scan() {
 | 
			
		||||
		lines = append(lines, scanner.Text())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := scanner.Err(); err != nil {
 | 
			
		||||
		return []string{}, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return lines, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								day-04/makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								day-04/makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
program = day-04
 | 
			
		||||
 | 
			
		||||
GO = go
 | 
			
		||||
SRC_DIR := src
 | 
			
		||||
BIN_DIR := bin
 | 
			
		||||
 | 
			
		||||
EXE := $(BIN_DIR)/$(program)
 | 
			
		||||
 | 
			
		||||
.DEFAULT_GOAL := build
 | 
			
		||||
 | 
			
		||||
.PHONY: fmt vet build bench clean
 | 
			
		||||
fmt:        
 | 
			
		||||
	$(GO) fmt ./...
 | 
			
		||||
 | 
			
		||||
vet: fmt        
 | 
			
		||||
	$(GO) vet ./...
 | 
			
		||||
 | 
			
		||||
build: vet | $(BIN_DIR)
 | 
			
		||||
	$(GO) build -o $(EXE) ./$(SRC_DIR)
 | 
			
		||||
 | 
			
		||||
bench:
 | 
			
		||||
	$(GO) test ./internal/one/ -bench=. > internal/one/benchmark
 | 
			
		||||
	$(GO) test ./internal/two/ -bench=. > internal/two/benchmark
 | 
			
		||||
	$(GO) test . -count=10 -bench=. > benchmark
 | 
			
		||||
 | 
			
		||||
$(BIN_DIR):
 | 
			
		||||
	@mkdir -p $@
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	@rm -rv $(BIN_DIR)
 | 
			
		||||
							
								
								
									
										20
									
								
								day-04/solve.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								day-04/solve.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
package dayfour
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/onyx-and-iris/aoc2024/day-04/internal/one"
 | 
			
		||||
	"github.com/onyx-and-iris/aoc2024/day-04/internal/two"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Solve(data []byte) (int, int, error) {
 | 
			
		||||
	answerOne, err := one.Solve(data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	answerTwo, err := two.Solve(data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return answerOne, answerTwo, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								day-04/solve_internal_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								day-04/solve_internal_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
package dayfour
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	_ "embed"
 | 
			
		||||
	"os"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:embed testdata/input.txt
 | 
			
		||||
var data []byte
 | 
			
		||||
 | 
			
		||||
func BenchmarkSolve(b *testing.B) {
 | 
			
		||||
	os.Stdout, _ = os.Open(os.DevNull)
 | 
			
		||||
	Solve(data)
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user