Add Go
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Tristan 2023-12-03 21:50:29 +01:00
parent d8d3821113
commit f228b7b494
Signed by: trizz
SSH Key Fingerprint: SHA256:Xsd2dTN+ZC3OZWfvuKIDMQ/1lWicuINSEPgRQw/CJT8
9 changed files with 299 additions and 3 deletions

View File

@ -5,7 +5,12 @@
In this repository, you'll find my Advent of Code framework and solutions. If you want to
use this framework for your own solution, just remove all data in the `./data` folder.
## 🛠 Setup and running
It provides both a PHP and a Go framework. The PHP framework is the most complete one while
the Go framework is still a work in progress and is meant to learn Go.
## PHP
### 🛠 Setup and running
- Run `composer install` to install the dependencies.
- Run `./aoc day {day} {year?}` to run the solution for a specific day. If year is not given, use the current year (for example `./aoc day 1` to run the code for day 1 2023)
- Run `./aoc test {day} {year?}` to run the solution against the specified results.
@ -15,12 +20,12 @@ use this framework for your own solution, just remove all data in the `./data` f
> - You can add `--one` or `--two` (or `-1` and `-2`) to the day to run the solution for part 1 or part 2.
> - You can add `--skip-example` (or `-s`) to skip the example data.
## 🧪 Testing and quality control
### 🧪 Testing and quality control
- Run `./vendor/bin/pest` to automatically validate the solutions.
- Run `./vendor/bin/phpstan analyse` to run static analysis on the code.
- Run `./vendor/bin/php-cs-fixer fix` to run (and fix) code style checks.
## 🧩 Add a new puzzle/solution
### 🧩 Add a new puzzle/solution
- Run `./aoc new {day?} {year?}` to create a new puzzle/solution.
<details>

21
aoc.go Normal file
View File

@ -0,0 +1,21 @@
package main
import (
y22 "adventofcode/data/Y22"
"adventofcode/src-go/helpers"
"fmt"
"github.com/fatih/color"
)
func main() {
runY22()
day, year := helpers.GetDayYear()
fmt.Println(day, year)
}
func runY22() {
color.HiYellow("\n--- Advent of Code 2022 ---\n\n")
helpers.PrintDayResults(y22.Day1())
helpers.PrintDayResults(y22.Day2())
}

56
data/Y22/day1/day1.go Normal file
View File

@ -0,0 +1,56 @@
package Y22
import (
"adventofcode/src-go/helpers"
"sort"
"strconv"
)
func Day1() helpers.DayResults {
day1Example := helpers.ReadFileByLine("data/Y22/day1/example.txt")
day1 := helpers.ReadFileByLine("data/Y22/day1/data.txt")
calorieCount := calculateCalories(day1Example)
part1Example := calorieCount[len(calorieCount)-1]
part2Example := calorieCount[len(calorieCount)-1] + calorieCount[len(calorieCount)-2] + calorieCount[len(calorieCount)-3]
calorieCount = calculateCalories(day1)
part1Result := calorieCount[len(calorieCount)-1]
part2Result := calorieCount[len(calorieCount)-1] + calorieCount[len(calorieCount)-2] + calorieCount[len(calorieCount)-3]
results := helpers.DayResults{
Day: 1,
Year: 2022,
Part1Example: part1Example,
Part1: part1Result,
Part2Example: part2Example,
Part2: part2Result,
}
return results
}
func calculateCalories(data []string) []int {
var calorieCount []int
total := 0
for _, line := range data {
if line == "" {
calorieCount = append(calorieCount, total)
total = 0
continue
}
val, err := strconv.Atoi(line)
if err != nil {
panic(err)
}
total += val
}
sort.Slice(calorieCount, func(i, j int) bool {
return calorieCount[i] < calorieCount[j]
})
return calorieCount
}

93
data/Y22/day2/day2.go Normal file
View File

@ -0,0 +1,93 @@
package Y22
import (
"adventofcode/src-go/helpers"
"strings"
)
const (
aRock string = "A"
aPaper string = "B"
aScissors string = "C"
bRock string = "X"
bPaper string = "Y"
bScissors string = "Z"
resultLose string = "X"
resultDraw string = "Y"
resultWin string = "Z"
)
var scoreTable = map[string]map[string]int{
aRock: {
bRock: 4,
bPaper: 8,
bScissors: 3,
},
aPaper: {
bRock: 1,
bPaper: 5,
bScissors: 9,
},
aScissors: {
bRock: 7,
bPaper: 2,
bScissors: 6,
},
}
var winOrLoseTable = map[string]map[string]string{
aRock: {
resultWin: bPaper,
resultDraw: bRock,
resultLose: bScissors,
},
aPaper: {
resultWin: bScissors,
resultDraw: bPaper,
resultLose: bRock,
},
aScissors: {
resultWin: bRock,
resultDraw: bScissors,
resultLose: bPaper,
},
}
func Day2() helpers.DayResults {
day2Example := helpers.ReadFileByLine("data/Y22/day2/example.txt")
day2 := helpers.ReadFileByLine("data/Y22/day2/data.txt")
results := helpers.DayResults{
Day: 2,
Year: 2022,
Part1Example: part1(day2Example),
Part1: part1(day2),
Part2Example: part2(day2Example),
Part2: part2(day2),
}
return results
}
func part1(input []string) int {
score := 0
for _, line := range input {
data := strings.Split(line, " ")
score += scoreTable[data[0]][data[1]]
}
return score
}
func part2(input []string) int {
score := 0
for _, line := range input {
data := strings.Split(line, " ")
scoreValue := winOrLoseTable[data[0]][data[1]]
score += scoreTable[data[0]][scoreValue]
}
return score
}

15
data/Y22/y22.go Normal file
View File

@ -0,0 +1,15 @@
package Y22
import (
Y22D1 "adventofcode/data/Y22/day1"
Y22D2 "adventofcode/data/Y22/day2"
"adventofcode/src-go/helpers"
)
func Day1() helpers.DayResults {
return Y22D1.Day1()
}
func Day2() helpers.DayResults {
return Y22D2.Day2()
}

11
go.mod Normal file
View File

@ -0,0 +1,11 @@
module adventofcode
go 1.21.4
require github.com/fatih/color v1.16.0
require (
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
golang.org/x/sys v0.14.0 // indirect
)

11
go.sum Normal file
View File

@ -0,0 +1,11 @@
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=

29
src-go/helpers/Day.go Normal file
View File

@ -0,0 +1,29 @@
package helpers
import (
"strconv"
"strings"
"github.com/fatih/color"
)
type DayResults struct {
Day int `json:"day"`
Year int `json:"year"`
Part1Example int `json:"part1-example"`
Part1 int `json:"part1"`
Part2Example int `json:"part2-example"`
Part2 int `json:"part2"`
}
func PrintDayResults(results DayResults) {
yellow := color.New(color.FgYellow).SprintFunc()
gray := color.New(color.FgHiBlack).SprintFunc()
color.HiBlue("Day %d%s", results.Day, gray("/"+strconv.Itoa(results.Year)))
color.Green(" Part 1 (example): %s", yellow(results.Part1Example))
color.HiGreen(" Part 1 : %s", yellow(results.Part1))
color.Blue(" " + strings.Repeat("-", 23))
color.Green(" Part 2 (example): %s", yellow(results.Part2Example))
color.HiGreen(" Part 2 : %s", yellow(results.Part2))
}

View File

@ -0,0 +1,55 @@
package helpers
import (
"bufio"
"log"
"os"
"strconv"
"time"
)
func ReadFileByLine(path string) []string {
file, err := os.Open(path)
if err != nil {
log.Fatal(err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
log.Fatal(err)
}
}(file)
scanner := bufio.NewScanner(file)
var returnData []string
for scanner.Scan() {
returnData = append(returnData, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
return returnData
}
func GetDayYear() (int, int) {
// get current year
year, _, day := time.Now().Date()
// Change 2023 to 23
year = year % 100
if len(os.Args) == 2 {
day, _ := strconv.Atoi(os.Args[1])
return day, year
}
if len(os.Args) == 3 {
day, _ := strconv.Atoi(os.Args[1])
year, _ := strconv.Atoi(os.Args[2])
return day, year
}
return day, year
}