diff --git a/README.md b/README.md index 59d24c6..b404e0c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,56 @@ # Advent of Code 2021 -The 2021 iteration of Advent of Code. This year I am going to try and accomplish it all on my iPad using GitPod \ No newline at end of file +The 2021 iteration of Advent of Code. This year I am going to try and accomplish it all on my iPad using GitPod + +## Adding a new day + +When starting to solve for a new day run the following command in the root of the repo where `` is the go lang compatible package name (i.e. `four` or `five`) and `` represents the item the day's problem revolves around (i.e. `radar` or `bingo`). + +```sh +./setup.sh +``` + +After generating a new package update [`main.go`](main.go) to include a `` flag in the switch statement on line 28 + +```go + case "": + day = .Init("/input.txt") +``` + +## My Solutions + +### Day 1 + +```sh +$ ./aoc2021 --one +The solution for "one" is: +There were 1715 increases in depth +There were 1739 increases in depth when sampling a window +``` + +### Day 2 + +```sh +$ ./aoc2021 --two +The solution for "two" is: +Horizontal is 1832, depth is 1172, answer is 2147104 +Horizontal is 1832, depth is 1116059, answer is 2044620088 +``` + +### Day 3 + +```sh +$ ./aoc2021 --three +The solution for "three" is: +The power rates are gamma: 1143, epsilon: 2952, for 3374136 total +The oxygen rating is 1909 and CO2 rating is 2322, for a life support rating of 4432698 +``` + +### Day 4 + +```sh +$ ./aoc2021 --four +The solution for "four" is: +The winning score is 668 on call 66. Final score 44088 +The last winning score is 263 on call 90. Final score 23670 +``` diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..6a165d2 --- /dev/null +++ b/setup.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +mkdir $1 + +name=$(echo $1 | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2)) }') +abbr=$(echo $2 | awk '{print substr($0,1,1) }') + +# Create day implementation +echo "package $1 + +type $name struct { + $2 $2 +} + +func Init(filepath string) *$name { + $1 := &$name{ + $2: $2{}, + } + + $1.$2.load(filepath) + return $1 +} + +func (d *$name) Answer() string { + return \"$1 part 1 answer for $2\" +} + +func (d *$name) FollowUp() string { + return \"$1 part 2 answer for $2\" +} +" >> $1/main.go + +# Create file for the day +echo "package $1 +import ( + \"bufio\" + \"os\" +) + +type $2 struct { + input []string +} + +func ($abbr *$2) load(filename string) error { + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + scanner := bufio.NewScanner(file) + for scanner.Scan() { + $abbr.input = append($abbr.input, scanner.Text()) + } + return nil +} +" >> $1/$2.go + +# Create the test file +echo "package $1 + +import \"testing\" + +func Test_read(t *testing.T) { + $abbr := $2{} + if err := $abbr.load(\"test_input.txt\"); err != nil { + t.Log(err) + t.FailNow() + } + + if len($abbr.input) != 1000 { + t.Logf(\"Expected 1000 inputs, found %d\", len($abbr.input)) + t.Fail() + } + +} +" >> $1/$2_test.go + +# Create files for test input +touch $1/test_input.txt +touch $1/input.txt + +# Append Solution to Readme + +echo " +### Day $1 + +\`\`\`sh +$ ./aoc2021 --$1 +The solution for \"$1\" is: +$1 part 1 answer for $2 +$1 part 2 answer for $2 +\`\`\` +" >> README.md \ No newline at end of file