mirror of
https://github.com/onyx-and-iris/aoc2023.git
synced 2024-11-15 15:10:49 +00:00
day-1
This commit is contained in:
commit
07d24c2e8a
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
#
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
# input files
|
||||
input.txt
|
11
day-1/go.mod
Normal file
11
day-1/go.mod
Normal file
@ -0,0 +1,11 @@
|
||||
module github.com/onyx-and-iris/aoc2023/day-1
|
||||
|
||||
go 1.20
|
||||
|
||||
require github.com/stretchr/testify v1.8.4
|
||||
|
||||
require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
10
day-1/go.sum
Normal file
10
day-1/go.sum
Normal file
@ -0,0 +1,10 @@
|
||||
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/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
27
day-1/one.go
Normal file
27
day-1/one.go
Normal file
@ -0,0 +1,27 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// one takes a string array and for each line:
|
||||
// Combine the first digit and the last digit (in that order) to form a single two-digit number.
|
||||
// Returns the sum of all calibrated values.
|
||||
func one(lines []string) (int, error) {
|
||||
re := regexp.MustCompile(`\d`)
|
||||
|
||||
sum := 0
|
||||
for _, line := range lines {
|
||||
m := re.FindAllString(line, -1)
|
||||
if len(m) > 0 {
|
||||
num, err := strconv.Atoi(fmt.Sprintf("%s%s", m[0], m[len(m)-1]))
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
sum += num
|
||||
}
|
||||
}
|
||||
return sum, nil
|
||||
}
|
22
day-1/one_test.go
Normal file
22
day-1/one_test.go
Normal file
@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestOne(t *testing.T) {
|
||||
//t.Skip("skipping test")
|
||||
input := []string{
|
||||
"1abc2",
|
||||
"pqr3stu8vwx",
|
||||
"a1b2c3d4e5f",
|
||||
"treb7uchet",
|
||||
}
|
||||
retval, _ := one(input)
|
||||
|
||||
t.Run("Return the sum of all calibrated numbers, solution one", func(t *testing.T) {
|
||||
assert.Equal(t, 142, retval)
|
||||
})
|
||||
}
|
5
day-1/run.sh
Executable file
5
day-1/run.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
INPUT="input.txt"
|
||||
|
||||
cat $INPUT | go run .
|
22
day-1/solution.go
Normal file
22
day-1/solution.go
Normal file
@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
)
|
||||
|
||||
func main() {
|
||||
lines := readlines()
|
||||
|
||||
ans, err := one(lines)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Printf("solution one: %d\n", ans)
|
||||
|
||||
ans, err = two(lines)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Printf("solution two: %d\n", ans)
|
||||
}
|
68
day-1/two.go
Normal file
68
day-1/two.go
Normal file
@ -0,0 +1,68 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
var replaceMap = map[string]string{
|
||||
"one": "1",
|
||||
"two": "2",
|
||||
"three": "3",
|
||||
"four": "4",
|
||||
"five": "5",
|
||||
"six": "6",
|
||||
"seven": "7",
|
||||
"eight": "8",
|
||||
"nine": "9",
|
||||
}
|
||||
|
||||
var r = regexp.MustCompile(`\d|one|two|three|four|five|six|seven|eight|nine`)
|
||||
var rr = regexp.MustCompile(`\d|eno|owt|eerht|ruof|evif|xis|neves|thgie|enin`)
|
||||
|
||||
// forward parses a single line from start to last
|
||||
// Match all substrings matching `\d|one|two|three|four|five|six|seven|eight|nine`
|
||||
// Returns the first match
|
||||
func forward(s string) string {
|
||||
m_all := r.FindAllString(s, -1)
|
||||
match := m_all[0]
|
||||
match, ok := replaceMap[match]
|
||||
if !ok {
|
||||
match = m_all[0]
|
||||
}
|
||||
|
||||
return match
|
||||
}
|
||||
|
||||
// backward parses a single line in reverse order
|
||||
// Match all substrings matching `\d|eno|owt|eerht|ruof|evif|xis|neves|thgie|enin`
|
||||
// Returns the first match
|
||||
func backward(s string) string {
|
||||
m_all := rr.FindAllString(s, -1)
|
||||
match := m_all[0]
|
||||
match, ok := replaceMap[reverse(match)]
|
||||
if !ok {
|
||||
match = m_all[0]
|
||||
}
|
||||
|
||||
return match
|
||||
}
|
||||
|
||||
// two takes a string array and for each line:
|
||||
// Search by regex all substrings matching numeric (and word representations of numeric) values.
|
||||
// It then combines the first digit and the last digit (in that order) to form a single two-digit number.
|
||||
// Returns the sum of all calibrated values.
|
||||
func two(lines []string) (int, error) {
|
||||
sum := 0
|
||||
for _, line := range lines {
|
||||
m1 := forward(line)
|
||||
m2 := backward(reverse(line))
|
||||
n, err := strconv.Atoi(fmt.Sprintf("%s%s", m1, m2))
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
sum += n
|
||||
}
|
||||
return sum, nil
|
||||
}
|
25
day-1/two_test.go
Normal file
25
day-1/two_test.go
Normal file
@ -0,0 +1,25 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestTwo(t *testing.T) {
|
||||
//t.Skip("skipping test")
|
||||
input := []string{
|
||||
"two1nine",
|
||||
"eightwothree",
|
||||
"abcone2threexyz",
|
||||
"xtwone3four",
|
||||
"4nineeightseven2",
|
||||
"zoneight234",
|
||||
"7pqrstsixteen",
|
||||
}
|
||||
retval, _ := two(input)
|
||||
|
||||
t.Run("Return the sum of all calibrated numbers, solution two", func(t *testing.T) {
|
||||
assert.Equal(t, 281, retval)
|
||||
})
|
||||
}
|
32
day-1/util.go
Normal file
32
day-1/util.go
Normal file
@ -0,0 +1,32 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
// readlines reads lines from stdin.
|
||||
// Then it returns them as an array of strings
|
||||
func readlines() []string {
|
||||
lines := []string{}
|
||||
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
for scanner.Scan() {
|
||||
lines = append(lines, scanner.Text())
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
return lines
|
||||
}
|
||||
|
||||
// reverse accepts a string and returns its reverse
|
||||
func reverse(s string) (result string) {
|
||||
for _, v := range s {
|
||||
result = string(v) + result
|
||||
}
|
||||
return
|
||||
}
|
16
day-1/util_test.go
Normal file
16
day-1/util_test.go
Normal file
@ -0,0 +1,16 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestReverse(t *testing.T) {
|
||||
//t.Skip("skipping test")
|
||||
input := "eightwone3"
|
||||
expected := "3enowthgie"
|
||||
t.Run("Should reverse the string", func(t *testing.T) {
|
||||
assert.Equal(t, expected, reverse(input))
|
||||
})
|
||||
}
|
Loading…
Reference in New Issue
Block a user