From 172efc02f9ffe120fd6deb439d113b084bf45182 Mon Sep 17 00:00:00 2001 From: RPJosh Date: Tue, 6 Dec 2022 22:10:52 +0100 Subject: [PATCH] Create basic directory structure --- .gitignore | 3 ++ cmd/adventOfCode/main.go | 97 ++++++++++++++++++++++++++++++++++++++++ go.mod | 3 ++ internal/day_01/in.go | 64 ++++++++++++++++++++++++++ internal/day_02/in.go | 11 +++++ internal/day_03/in.go | 11 +++++ internal/day_04/in.go | 11 +++++ internal/day_05/in.go | 11 +++++ internal/day_06/in.go | 11 +++++ internal/day_07/in.go | 11 +++++ internal/day_08/in.go | 11 +++++ internal/day_09/in.go | 11 +++++ internal/day_10/in.go | 11 +++++ internal/day_11/in.go | 11 +++++ internal/day_12/in.go | 11 +++++ internal/day_13/in.go | 11 +++++ internal/day_14/in.go | 11 +++++ internal/day_15/in.go | 11 +++++ internal/day_16/in.go | 11 +++++ internal/day_17/in.go | 11 +++++ internal/day_18/in.go | 11 +++++ internal/day_19/in.go | 11 +++++ internal/day_20/in.go | 11 +++++ internal/day_21/in.go | 11 +++++ internal/day_22/in.go | 11 +++++ internal/day_23/in.go | 11 +++++ internal/day_24/in.go | 11 +++++ internal/day_25/in.go | 11 +++++ pkg/utils/utils.go | 83 ++++++++++++++++++++++++++++++++++ run.sh | 3 ++ 30 files changed, 517 insertions(+) create mode 100644 .gitignore create mode 100644 cmd/adventOfCode/main.go create mode 100644 go.mod create mode 100644 internal/day_01/in.go create mode 100644 internal/day_02/in.go create mode 100644 internal/day_03/in.go create mode 100644 internal/day_04/in.go create mode 100644 internal/day_05/in.go create mode 100644 internal/day_06/in.go create mode 100644 internal/day_07/in.go create mode 100644 internal/day_08/in.go create mode 100644 internal/day_09/in.go create mode 100644 internal/day_10/in.go create mode 100644 internal/day_11/in.go create mode 100644 internal/day_12/in.go create mode 100644 internal/day_13/in.go create mode 100644 internal/day_14/in.go create mode 100644 internal/day_15/in.go create mode 100644 internal/day_16/in.go create mode 100644 internal/day_17/in.go create mode 100644 internal/day_18/in.go create mode 100644 internal/day_19/in.go create mode 100644 internal/day_20/in.go create mode 100644 internal/day_21/in.go create mode 100644 internal/day_22/in.go create mode 100644 internal/day_23/in.go create mode 100644 internal/day_24/in.go create mode 100644 internal/day_25/in.go create mode 100644 pkg/utils/utils.go create mode 100755 run.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d68f937 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/session.txt + +/inputData/* \ No newline at end of file diff --git a/cmd/adventOfCode/main.go b/cmd/adventOfCode/main.go new file mode 100644 index 0000000..ae51bcb --- /dev/null +++ b/cmd/adventOfCode/main.go @@ -0,0 +1,97 @@ +package main + +import ( + "os" + "strconv" + + "rpjosh.de/adventOfCode2022/internal/day_01" + "rpjosh.de/adventOfCode2022/internal/day_02" + "rpjosh.de/adventOfCode2022/internal/day_03" + "rpjosh.de/adventOfCode2022/internal/day_04" + "rpjosh.de/adventOfCode2022/internal/day_05" + "rpjosh.de/adventOfCode2022/internal/day_06" + "rpjosh.de/adventOfCode2022/internal/day_07" + "rpjosh.de/adventOfCode2022/internal/day_08" + "rpjosh.de/adventOfCode2022/internal/day_09" + "rpjosh.de/adventOfCode2022/internal/day_10" + "rpjosh.de/adventOfCode2022/internal/day_11" + "rpjosh.de/adventOfCode2022/internal/day_12" + "rpjosh.de/adventOfCode2022/internal/day_13" + "rpjosh.de/adventOfCode2022/internal/day_14" + "rpjosh.de/adventOfCode2022/internal/day_15" + "rpjosh.de/adventOfCode2022/internal/day_16" + "rpjosh.de/adventOfCode2022/internal/day_17" + "rpjosh.de/adventOfCode2022/internal/day_18" + "rpjosh.de/adventOfCode2022/internal/day_19" + "rpjosh.de/adventOfCode2022/internal/day_20" + "rpjosh.de/adventOfCode2022/internal/day_21" + "rpjosh.de/adventOfCode2022/internal/day_22" + "rpjosh.de/adventOfCode2022/internal/day_23" + "rpjosh.de/adventOfCode2022/internal/day_24" + "rpjosh.de/adventOfCode2022/internal/day_25" + "rpjosh.de/adventOfCode2022/pkg/utils" +) + +func main() { + year := 2022 + day := 1 + if len(os.Args) >= 2 && os.Args[1] != "" { + var err error + day, err = strconv.Atoi(os.Args[1]) + if err != nil { + utils.PrintError("Expected the day of the challenge (integer) as argument: %s", err) + } + } + data := utils.GetInputData(year, day) + + challenge := getAllChallenges()[day-1] + part := 1 + if len(os.Args) >= 3 && os.Args[2] != "" { + var err error + part, err = strconv.Atoi(os.Args[2]) + if err != nil { + utils.PrintError("Expected the part of the challenge (integer) as argument: %s", err) + } + } + + if part == 1 { + utils.CopyToClipboard(challenge.Part1(data)) + } else { + utils.CopyToClipboard(challenge.Part2(data)) + } +} + +type Challenge interface { + Part1(string) string + Part2(string) string +} + +func getAllChallenges() []Challenge { + return []Challenge{ + &day_01.Day{}, + &day_02.Day{}, + &day_03.Day{}, + &day_04.Day{}, + &day_05.Day{}, + &day_06.Day{}, + &day_07.Day{}, + &day_08.Day{}, + &day_09.Day{}, + &day_10.Day{}, + &day_11.Day{}, + &day_12.Day{}, + &day_13.Day{}, + &day_14.Day{}, + &day_15.Day{}, + &day_16.Day{}, + &day_17.Day{}, + &day_18.Day{}, + &day_19.Day{}, + &day_20.Day{}, + &day_21.Day{}, + &day_22.Day{}, + &day_23.Day{}, + &day_24.Day{}, + &day_25.Day{}, + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..88a611c --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module rpjosh.de/adventOfCode2022 + +go 1.18 diff --git a/internal/day_01/in.go b/internal/day_01/in.go new file mode 100644 index 0000000..71425ba --- /dev/null +++ b/internal/day_01/in.go @@ -0,0 +1,64 @@ +package day_01 + +import ( + "fmt" + "strings" + + "rpjosh.de/adventOfCode2022/pkg/utils" +) + +type Day struct{} + +func (d *Day) Part1(in string) string { + current := 0 + max := 0 + + for _, val := range strings.Split(in, "\n") { + if val == "" { + // Clear it + if current > max { + max = current + } + current = 0 + continue + } + + current += utils.ToInt(val) + } + + return fmt.Sprintf("%d", max) +} + +func (d *Day) Part2(in string) string { + current := 0 + var totals []int + + for _, val := range strings.Split(in, "\n") { + if val == "" { + // Clear it + totals = append(totals, current) + current = 0 + continue + } + + current += utils.ToInt(val) + } + totals = append(totals, current) + + // Sort array + for i := 0; i < len(totals)-1; i++ { + if totals[i+1] > totals[i] { + tmp := totals[i] + totals[i] = totals[i+1] + totals[i+1] = tmp + i = -1 + } + } + + sum := 0 + for i := 0; i < 3; i++ { + sum += totals[i] + } + + return fmt.Sprintf("%d", sum) +} diff --git a/internal/day_02/in.go b/internal/day_02/in.go new file mode 100644 index 0000000..bc6c878 --- /dev/null +++ b/internal/day_02/in.go @@ -0,0 +1,11 @@ +package day_02 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_03/in.go b/internal/day_03/in.go new file mode 100644 index 0000000..d1da985 --- /dev/null +++ b/internal/day_03/in.go @@ -0,0 +1,11 @@ +package day_03 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_04/in.go b/internal/day_04/in.go new file mode 100644 index 0000000..5216173 --- /dev/null +++ b/internal/day_04/in.go @@ -0,0 +1,11 @@ +package day_04 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_05/in.go b/internal/day_05/in.go new file mode 100644 index 0000000..7f45e3c --- /dev/null +++ b/internal/day_05/in.go @@ -0,0 +1,11 @@ +package day_05 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_06/in.go b/internal/day_06/in.go new file mode 100644 index 0000000..13c4fba --- /dev/null +++ b/internal/day_06/in.go @@ -0,0 +1,11 @@ +package day_06 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_07/in.go b/internal/day_07/in.go new file mode 100644 index 0000000..2e8ba94 --- /dev/null +++ b/internal/day_07/in.go @@ -0,0 +1,11 @@ +package day_07 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_08/in.go b/internal/day_08/in.go new file mode 100644 index 0000000..ba756a5 --- /dev/null +++ b/internal/day_08/in.go @@ -0,0 +1,11 @@ +package day_08 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_09/in.go b/internal/day_09/in.go new file mode 100644 index 0000000..4b931f3 --- /dev/null +++ b/internal/day_09/in.go @@ -0,0 +1,11 @@ +package day_09 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_10/in.go b/internal/day_10/in.go new file mode 100644 index 0000000..d92902b --- /dev/null +++ b/internal/day_10/in.go @@ -0,0 +1,11 @@ +package day_10 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_11/in.go b/internal/day_11/in.go new file mode 100644 index 0000000..57698fe --- /dev/null +++ b/internal/day_11/in.go @@ -0,0 +1,11 @@ +package day_11 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_12/in.go b/internal/day_12/in.go new file mode 100644 index 0000000..8805946 --- /dev/null +++ b/internal/day_12/in.go @@ -0,0 +1,11 @@ +package day_12 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_13/in.go b/internal/day_13/in.go new file mode 100644 index 0000000..6aa3e94 --- /dev/null +++ b/internal/day_13/in.go @@ -0,0 +1,11 @@ +package day_13 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_14/in.go b/internal/day_14/in.go new file mode 100644 index 0000000..1b56511 --- /dev/null +++ b/internal/day_14/in.go @@ -0,0 +1,11 @@ +package day_14 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_15/in.go b/internal/day_15/in.go new file mode 100644 index 0000000..de6f3a3 --- /dev/null +++ b/internal/day_15/in.go @@ -0,0 +1,11 @@ +package day_15 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_16/in.go b/internal/day_16/in.go new file mode 100644 index 0000000..b4d376e --- /dev/null +++ b/internal/day_16/in.go @@ -0,0 +1,11 @@ +package day_16 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_17/in.go b/internal/day_17/in.go new file mode 100644 index 0000000..edc5354 --- /dev/null +++ b/internal/day_17/in.go @@ -0,0 +1,11 @@ +package day_17 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_18/in.go b/internal/day_18/in.go new file mode 100644 index 0000000..223a2c5 --- /dev/null +++ b/internal/day_18/in.go @@ -0,0 +1,11 @@ +package day_18 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_19/in.go b/internal/day_19/in.go new file mode 100644 index 0000000..6e3005c --- /dev/null +++ b/internal/day_19/in.go @@ -0,0 +1,11 @@ +package day_19 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_20/in.go b/internal/day_20/in.go new file mode 100644 index 0000000..e53c4e0 --- /dev/null +++ b/internal/day_20/in.go @@ -0,0 +1,11 @@ +package day_20 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_21/in.go b/internal/day_21/in.go new file mode 100644 index 0000000..d0df887 --- /dev/null +++ b/internal/day_21/in.go @@ -0,0 +1,11 @@ +package day_21 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_22/in.go b/internal/day_22/in.go new file mode 100644 index 0000000..ca4d599 --- /dev/null +++ b/internal/day_22/in.go @@ -0,0 +1,11 @@ +package day_22 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_23/in.go b/internal/day_23/in.go new file mode 100644 index 0000000..adf7000 --- /dev/null +++ b/internal/day_23/in.go @@ -0,0 +1,11 @@ +package day_23 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_24/in.go b/internal/day_24/in.go new file mode 100644 index 0000000..080004f --- /dev/null +++ b/internal/day_24/in.go @@ -0,0 +1,11 @@ +package day_24 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/internal/day_25/in.go b/internal/day_25/in.go new file mode 100644 index 0000000..350218b --- /dev/null +++ b/internal/day_25/in.go @@ -0,0 +1,11 @@ +package day_25 + +type Day struct{} + +func (d *Day) Part1(in string) string { + return "" +} + +func (d *Day) Part2(in string) string { + return "" +} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go new file mode 100644 index 0000000..6fd18dd --- /dev/null +++ b/pkg/utils/utils.go @@ -0,0 +1,83 @@ +package utils + +import ( + "fmt" + "io" + "net/http" + "os" + "os/exec" + "strconv" + "strings" + "time" +) + +// Copies the given string to the clipboard. +// The tool 'xclip needs to be installed' +func CopyToClipboard(text string) { + command := fmt.Sprintf("echo '%s' | xclip -selection clipboard", strings.ReplaceAll(text, "'", "''")) + cmd := exec.Command("bash", "-c", command) + + if err := cmd.Start(); err != nil { + PrintError("Error while executing command: %s", err) + } + + fmt.Print(text) +} + +// Get's the input data for the task +func GetInputData(year int, day int) string { + // Check if the ressource was already requested + fileLocation := fmt.Sprintf("./inputData/%d/day_%02d", year, day) + cachedInput, err := os.ReadFile(fileLocation) + if err == nil { + return string(cachedInput) + } + + // Make a request to get the input from advent of code and save it in a file + url := fmt.Sprintf("https://adventofcode.com/%d/day/%d/input", year, day) + + // Read cookie session vaue + session, err := os.ReadFile("./session.txt") + if err != nil { + PrintError("Failed to read cookie session file: %s", err) + } + + client := http.Client{Timeout: 10 * time.Second} + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + PrintError("%s", err) + } + req.AddCookie(&http.Cookie{Name: "session", Value: string(session)}) + + // Execute the query + res, err := client.Do(req) + if err != nil { + PrintError("Failed to execute request: %s", err) + } + defer res.Body.Close() + + if res.StatusCode != 200 { + PrintError("Incorrect status code: %d", res.StatusCode) + } + inputData, _ := io.ReadAll(res.Body) + err = os.WriteFile(fileLocation, inputData, 0644) + if err != nil { + PrintError("Failed to write input data to file: %s", err) + } + + return string(inputData) +} + +func PrintError(format string, a ...any) { + fmt.Printf(format, a...) + os.Exit(-1) +} + +func ToInt(val string) int { + value, err := strconv.Atoi(val) + if err != nil { + PrintError("%s", err) + } + + return value +} diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..8dcf710 --- /dev/null +++ b/run.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +nodemon --quiet -e go,html,yaml --ignore web/app/ --signal SIGTERM --exec 'go run ./cmd/adventOfCode '$1' '$2' || exit 1' \ No newline at end of file