diff --git a/TODO.md b/TODO.md index 674afad..7878da6 100644 --- a/TODO.md +++ b/TODO.md @@ -4,6 +4,7 @@ - [ ] The session can be fetched from the website? Similar CLI use a webhook to fetch the session. - [ ] Support more than GoLang (e.g. TS) - [ ] Using OpenFaaS or any other Function as a Service to make the CLI work with + - [ ] Find other options (function buildpacks). Build a AOC buildpack the same way func cli uses for knative functions? - [ ] Write a Public website that can be deploy on GitHub Pages. ## Init @@ -26,4 +27,10 @@ - [ ] Get Real input and run the challenge +## ANother sections we might need to add here + - Templates for each language + - Buildpacks for each language + - Webpage + - Good Documentation +How much can I push the idea of not running this locally? For example, you want to code in Rust but you want to run it in a container. diff --git a/adrs/ux_get_puzzle_information.md b/adrs/ux_get_puzzle_information.md new file mode 100644 index 0000000..7577d94 --- /dev/null +++ b/adrs/ux_get_puzzle_information.md @@ -0,0 +1,68 @@ +# How to work with Puzzles + +With a functional programing model we are going to help people working with Advent of Code problems. + +## Init + +What questions should we ask? +- Name or default +- Language runtime from list of supported languages +- version of the supported language +- want git? + - if yes, repository in mind? +- + +## Get +The user will write `aoctl puzzle get/sync` with some informaation + + +Information needed: +- Year // if year is not provided it will go over 2015-lastDecemberyear +- Day // if day is not provided it will go over 1-25. If we are between dec 1 and dec 25 and YEAR is current, only do until "TODAY's day" +- Part // if part is not provided it will try to get both parts (if first part is not solved it will only get one + +> Alert the user if bulk of information is going to be created (in order words, if any information is missing and multiple parts are going to be downlaoded request confirmation from user) + +The user should expect a file structure for each year/day + +- A puzzle.yaml file with the current state of the puzzle +- For each part (there are two) there should be a file of the selected language of the project that has a main function where the user will write the business logic +- inputs folder. The user will use this folder for testing or submit purposes. [TODO: not full flesh out yet] +- Test files for each part with the description of the part as comments in the file. +- Readme file that explains how to use each file of this puzzle solver + + +puzzle.yaml +- language this overwrites the root language runtime +- Language version +- depedencies +- Parts + - solver: filename + input: inputname + submitted: bool + +## File Structure + +Example of a aocproject files: + +/ + README.md + .gitignore // the session cookie file should be here + .git/ // initialized git with provided remote or empty + .aoc.yaml // configuration like language, and other preferences + /src + / + / + README.md + puzzle.yaml + part1.go + part1_test.go + part2.go + part2_test.go + /inputs + input.txt + +For language especific things +- Golang: work directory in a go.mod root file that adds every day of every year? +- Golang: Do we need a main runner? // TODO: Think about the main runner. Example we can replace it with Makefiles + diff --git a/examples/golang/2016/01/day1_test.go b/examples/golang/2016/01/day1_test.go new file mode 100644 index 0000000..a9541f5 --- /dev/null +++ b/examples/golang/2016/01/day1_test.go @@ -0,0 +1,91 @@ +package day1 + +import ( + "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + "github.com/dolfolife/aoctl/pkg/puzzle" +) + +type Day1Suite struct { + suite.Suite + SubjectPart1 Day1Part1Solver + SubjectPart2 Day1Part2Solver +} + +func (suite *Day1Suite) SetupTest() { + suite.SubjectPart1 = Day1Part1Solver{} + suite.SubjectPart2 = Day1Part2Solver{} +} + +func (suite *Day1Suite) TestDayOnePart1NoTimeForaTaxicab1() { + suite.SubjectPart1.Puzzle = puzzle.PuzzlePart{ + RawInput: []byte("R2, L3"), + } + actualValues, errs := suite.SubjectPart1.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + + assert.Equal(suite.T(), "5", actualValues) +} + +func (suite *Day1Suite) TestDayOnePart1NoTimeForaTaxicab2() { + suite.SubjectPart1.Puzzle = puzzle.PuzzlePart{ + RawInput: []byte("R2, R2, R2"), + } + actualValues, errs := suite.SubjectPart1.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "2", actualValues) +} + +func (suite *Day1Suite) TestDayOnePart1NoTimeForaTaxicab3() { + suite.SubjectPart1.Puzzle = puzzle.PuzzlePart{ + RawInput: []byte("R5, L5, R5, R3"), + } + actualValues, errs := suite.SubjectPart1.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "12", actualValues) +} + +func (suite *Day1Suite) TestDayOnePart1NoTimeForaTaxicab4() { + suite.SubjectPart1.Puzzle = puzzle.PuzzlePart{ + RawInput: []byte("L2, L2, L2"), + } + actualValues, errs := suite.SubjectPart1.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "2", actualValues) +} + +func (suite *Day1Suite) TestDayOnePart1NoTimeForaTaxicabVisitedTwice() { + suite.SubjectPart1.Puzzle = puzzle.PuzzlePart{ + RawInput: []byte("R8, R4, R4, R8"), + } + actualValues, errs := suite.SubjectPart1.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "8", actualValues) +} + +func (suite *Day1Suite) TestDayOnePart2NoTimeForaTaxicabVisitedTwice() { + suite.SubjectPart2.Puzzle = puzzle.PuzzlePart{ + RawInput: []byte("R8, R4, R4, R8"), + } + actualValues, errs := suite.SubjectPart2.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "4", actualValues) +} + +func TestSuite(t *testing.T) { + suite.Run(t, new(Day1Suite)) +} + diff --git a/examples/golang/2016/01/helpers.go b/examples/golang/2016/01/helpers.go new file mode 100644 index 0000000..1543283 --- /dev/null +++ b/examples/golang/2016/01/helpers.go @@ -0,0 +1,25 @@ +package day1 + +import ( + + . "github.com/dolfolife/aoctl/pkg/math" +) + +func newSegmentPath(orientation rune, p Point, steps float64) Segment { + startingPoint := p + switch orientation { + case 'N': + p.Y += steps + startingPoint.Y += 1 + case 'E': + p.X += steps + startingPoint.X += 1 + case 'S': + p.Y -= steps + startingPoint.Y -= 1 + case 'W': + p.X -= steps + startingPoint.X -= 1 + } + return Segment{A: startingPoint, B: p} +} diff --git a/examples/golang/2016/01/main.go b/examples/golang/2016/01/main.go new file mode 100644 index 0000000..a789626 --- /dev/null +++ b/examples/golang/2016/01/main.go @@ -0,0 +1,36 @@ +package day1 + +import ( + "fmt" + "path/filepath" + "github.com/dolfolife/aoctl/pkg/puzzle" + "github.com/dolfolife/aoctl/pkg/aoc" +) + +func Solve() { + + aocConfig := aoc.GetAoCConfig() + + file := filepath.Join(aocConfig.ProjectPath, "01/puzzle.yaml") + inputfile1 := filepath.Join(aocConfig.ProjectPath, "01/input.txt") + inputfile2 := filepath.Join(aocConfig.ProjectPath, "01/input.txt") + p := puzzle.NewPuzzleFromCache(file, []string{ inputfile1, inputfile2 }) + + part1 := Day1Part1Solver{} + part1.Puzzle = p.Puzzles[0] + answer1, err := part1.Solve() + if err != nil { + fmt.Println(err) + } + fmt.Printf("For the Year %s on the day %s, -- %s\n", p.Metadata.Year, p.Metadata.Day, p.Metadata.Title) + fmt.Printf("Part 1 -- \n Actual Answer: %s and last recorded answer is %s\n", answer1, p.Puzzles[0].Answer) + + part2 := Day1Part2Solver{} + part2.Puzzle = p.Puzzles[1] + answer2, err2 := part2.Solve() + if err2 != nil { + fmt.Println(err2) + } + fmt.Printf("Part 2 -- \n Actual Answer: %s and last recorded answer is %s\n", answer2, p.Puzzles[1].Answer) +} + diff --git a/examples/golang/2016/01/part1.go b/examples/golang/2016/01/part1.go new file mode 100644 index 0000000..383670b --- /dev/null +++ b/examples/golang/2016/01/part1.go @@ -0,0 +1,44 @@ +package day1 + +import ( + "strings" + "strconv" + + . "github.com/dolfolife/aoctl/pkg/math" + "github.com/dolfolife/aoctl/pkg/puzzle" +) + +func part1(input []string) (string, error) { + var orientation = []rune{ 'N', 'E', 'S', 'W' } + posCurrentOrientation := 0 + + var pos = Point{X: 0, Y: 0} + for _, v := range input { + if v[0] == 'R' { + posCurrentOrientation = (posCurrentOrientation + 1) % len(orientation) + } else { + posCurrentOrientation = (posCurrentOrientation - 1) % len(orientation) + } + + if posCurrentOrientation < 0 { + posCurrentOrientation = len(orientation) + posCurrentOrientation + } + steps, _ := strconv.Atoi(v[1:]) + segment := newSegmentPath(orientation[posCurrentOrientation], pos, float64(steps)) + pos = segment.B + } + return CalDistancePoints(Point{X: 0, Y: 0}, pos), nil +} + +type Day1Part1Solver struct { + Puzzle puzzle.PuzzlePart +} + +func (s *Day1Part1Solver) NormalizeInput(input string) []string { + return strings.Split(input, ", ") +} + +func (s *Day1Part1Solver) Solve() (string, error) { + return part1(s.NormalizeInput(string(s.Puzzle.RawInput))) +} + diff --git a/examples/golang/2016/01/part2.go b/examples/golang/2016/01/part2.go new file mode 100644 index 0000000..962b5b7 --- /dev/null +++ b/examples/golang/2016/01/part2.go @@ -0,0 +1,55 @@ +package day1 + +import ( + "strings" + "strconv" + "errors" + + . "github.com/dolfolife/aoctl/pkg/math" + "github.com/dolfolife/aoctl/pkg/puzzle" +) + +func part2(input []string) (string, error) { + var orientation = []rune{ 'N', 'E', 'S', 'W' } + posCurrentOrientation := 0 + + path := make([]Segment, 0) + + var pos = Point{X: 0, Y: 0} + for _, v := range input { + if v[0] == 'R' { + posCurrentOrientation = (posCurrentOrientation + 1) % len(orientation) + } else { + posCurrentOrientation = (posCurrentOrientation - 1) % len(orientation) + } + + if posCurrentOrientation < 0 { + posCurrentOrientation = len(orientation) + posCurrentOrientation + } + steps, _ := strconv.Atoi(v[1:]) + newPath := newSegmentPath(orientation[posCurrentOrientation], pos, float64(steps)) + + for _, segment := range path { + intersect, intersectionPoint := CalIntersectionPoint(segment.A, segment.B, newPath.A, newPath.B) + if intersect { + return CalDistancePoints(Point{X: 0, Y: 0}, intersectionPoint), nil + } + } + path = append(path, newPath) + pos = newPath.B + } + return "", errors.New("No intersection found") +} + +type Day1Part2Solver struct { + Puzzle puzzle.PuzzlePart +} + +func (s *Day1Part2Solver) NormalizeInput(input string) []string { + return strings.Split(input, ", ") +} + +func (s *Day1Part2Solver) Solve() (string, error) { + return part2(s.NormalizeInput(string(s.Puzzle.RawInput))) +} + diff --git a/examples/golang/2016/01/puzzle.yaml b/examples/golang/2016/01/puzzle.yaml new file mode 100644 index 0000000..1356153 --- /dev/null +++ b/examples/golang/2016/01/puzzle.yaml @@ -0,0 +1,34 @@ +--- +metadata: + day: 1 + year: 2016 + title: No Time for a Taxicab +puzzles: + - description: | + Santa's sleigh uses a very high-precision clock to guide its movements, and the clock's oscillator is regulated by stars. Unfortunately, the stars have been stolen... by the Easter Bunny. To save Christmas, Santa needs you to retrieve all fifty stars by December 25th. + + Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one star. Good luck! + + You're airdropped near Easter Bunny Headquarters in a city somewhere. "Near", unfortunately, is as close as you can get - the instructions on the Easter Bunny Recruiting Document the Elves intercepted start here, and nobody had time to work them out further. + + The Document indicates that you should start at the given coordinates (where you just landed) and face North. Then, follow the provided sequence: either turn left (L) or right (R) 90 degrees, then walk forward the given number of blocks, ending at a new intersection. + + There's no time to follow such ridiculous instructions on foot, though, so you take a moment and work out the destination. Given that you can only walk on the street grid of the city, how far is the shortest path to the destination? + + For example: + + Following R2, L3 leaves you 2 blocks East and 3 blocks North, or 5 blocks away. + R2, R2, R2 leaves you 2 blocks due South of your starting position, which is 2 blocks away. + R5, L5, R5, R3 leaves you 12 blocks away. + + How many blocks away is Easter Bunny HQ? + answer: 332 + status: solved + - description: | + Then, you notice the instructions continue on the back of the Recruiting Document. Easter Bunny HQ is actually at the first location you visit twice. + + For example, if your instructions are R8, R4, R4, R8, the first location you visit twice is 4 blocks away, due East. + + How many blocks away is the first location you visit twice? + status: solved + answer: 166 diff --git a/examples/golang/2016/01/puzzle_solver.go b/examples/golang/2016/01/puzzle_solver.go deleted file mode 100644 index dbd344f..0000000 --- a/examples/golang/2016/01/puzzle_solver.go +++ /dev/null @@ -1,96 +0,0 @@ -package day_1 - -import ( - "strings" - "strconv" - "errors" - - "github.com/dolfolife/aoctl/pkg/puzzle" - . "github.com/dolfolife/aoctl/pkg/math" -) - - -func newSegmentPath(orientation rune, p Point, steps float64) Segment { - startingPoint := p - switch orientation { - case 'N': - p.Y += steps - startingPoint.Y += 1 - case 'E': - p.X += steps - startingPoint.X += 1 - case 'S': - p.Y -= steps - startingPoint.Y -= 1 - case 'W': - p.X -= steps - startingPoint.X -= 1 - } - return Segment{A: startingPoint, B: p} -} - -func part1(input []string) (string, error) { - var orientation = []rune{ 'N', 'E', 'S', 'W' } - posCurrentOrientation := 0 - - var pos = Point{X: 0, Y: 0} - for _, v := range input { - if v[0] == 'R' { - posCurrentOrientation = (posCurrentOrientation + 1) % len(orientation) - } else { - posCurrentOrientation = (posCurrentOrientation - 1) % len(orientation) - } - - if posCurrentOrientation < 0 { - posCurrentOrientation = len(orientation) + posCurrentOrientation - } - steps, _ := strconv.Atoi(v[1:]) - segment := newSegmentPath(orientation[posCurrentOrientation], pos, float64(steps)) - pos = segment.B - } - return CalDistancePoints(Point{X: 0, Y: 0}, pos), nil -} - -func part2(input []string) (string, error) { - var orientation = []rune{ 'N', 'E', 'S', 'W' } - posCurrentOrientation := 0 - - path := make([]Segment, 0) - - var pos = Point{X: 0, Y: 0} - for _, v := range input { - if v[0] == 'R' { - posCurrentOrientation = (posCurrentOrientation + 1) % len(orientation) - } else { - posCurrentOrientation = (posCurrentOrientation - 1) % len(orientation) - } - - if posCurrentOrientation < 0 { - posCurrentOrientation = len(orientation) + posCurrentOrientation - } - steps, _ := strconv.Atoi(v[1:]) - newPath := newSegmentPath(orientation[posCurrentOrientation], pos, float64(steps)) - - for _, segment := range path { - intersect, intersectionPoint := CalIntersectionPoint(segment.A, segment.B, newPath.A, newPath.B) - if intersect { - return CalDistancePoints(Point{X: 0, Y: 0}, intersectionPoint), nil - } - } - path = append(path, newPath) - pos = newPath.B - } - return "", errors.New("No intersection found") -} - -func normalize(input string) []string { - return strings.Split(input, ", ") -} - -func Solve(fileInputContent string) puzzle.PuzzleSolution[[]string] { - puzzleSolver := puzzle.NewPuzzleSolver("day_1", normalize, part1, part2) - return puzzle.PuzzleSolution[[]string] { - Part1: puzzleSolver.SolvePart(1, fileInputContent), - Part2: puzzleSolver.SolvePart(2, fileInputContent), - } -} diff --git a/examples/golang/2016/01/puzzle_solver_test.go b/examples/golang/2016/01/puzzle_solver_test.go deleted file mode 100644 index 19fce02..0000000 --- a/examples/golang/2016/01/puzzle_solver_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package day_1 - -import ( - "testing" - "github.com/stretchr/testify/assert" -) - -func TestDayOneNoTimeForaTaxicab1(t *testing.T) { - expectedValues := []string{"5", ""} - actualValues := Solve("R2, L3") - assert.Equal(t, expectedValues[0], actualValues.Part1) -} - -func TestDayOneNoTimeForaTaxicab2(t *testing.T) { - expectedValues := []string{"2", ""} - actualValues := Solve("R2, R2, R2") - assert.Equal(t, expectedValues[0], actualValues.Part1) -} - -func TestDayOneNoTimeForaTaxicab3(t *testing.T) { - expectedValues := []string{"12", ""} - actualValues := Solve("R5, L5, R5, R3") - assert.Equal(t, expectedValues[0], actualValues.Part1) -} - -func TestDayOneNoTimeForaTaxicab4(t *testing.T) { - expectedValues := []string{"2", ""} - actualValues := Solve("L2, L2, L2") - assert.Equal(t, expectedValues[0], actualValues.Part1) -} - -func TestDayOneNoTimeForaTaxicabVisitedTwice(t *testing.T) { - expectedValues := []string{"8", "4"} - actualValues := Solve("R8, R4, R4, R8") - assert.Equal(t, expectedValues[0], actualValues.Part1) - assert.Equal(t, expectedValues[1], actualValues.Part2) -} diff --git a/examples/golang/2016/02/main.go b/examples/golang/2016/02/main.go new file mode 100644 index 0000000..c5e9790 --- /dev/null +++ b/examples/golang/2016/02/main.go @@ -0,0 +1,35 @@ +package day2 + +import ( + "fmt" + "path/filepath" + "github.com/dolfolife/aoctl/pkg/puzzle" + "github.com/dolfolife/aoctl/pkg/aoc" +) + +func Solve() { + + aocConfig := aoc.GetAoCConfig() + + file := filepath.Join(aocConfig.ProjectPath, "02/puzzle.yaml") + inputfile1 := filepath.Join(aocConfig.ProjectPath, "02/input.txt") + inputfile2 := filepath.Join(aocConfig.ProjectPath, "02/input.txt") + p := puzzle.NewPuzzleFromCache(file, []string{inputfile1, inputfile2}) + + part1 := Day2Part1Solver{} + part1.Puzzle = p.Puzzles[0] + answer1, err := part1.Solve() + if err != nil { + fmt.Println(err) + } + fmt.Printf("For the Year %s on the day %s, -- %s\n", p.Metadata.Year, p.Metadata.Day, p.Metadata.Title) + fmt.Printf("Part 1 -- \n Actual Answer: %s and last recorded answer is %s\n", answer1, p.Puzzles[0].Answer) + + part2 := Day2Part2Solver{} + part2.Puzzle = p.Puzzles[1] + answer2, err2 := part2.Solve() + if err2 != nil { + fmt.Println(err2) + } + fmt.Printf("Part 2 -- \n Actual Answer: %s and last recorded answer is %s\n", answer2, p.Puzzles[1].Answer) +} diff --git a/examples/golang/2016/02/puzzle.yaml b/examples/golang/2016/02/puzzle.yaml new file mode 100644 index 0000000..6c62850 --- /dev/null +++ b/examples/golang/2016/02/puzzle.yaml @@ -0,0 +1,58 @@ +--- +metadata: + day: 2 + year: 2016 + title: Bathroom Security +puzzles: + - description: | + You arrive at Easter Bunny Headquarters under cover of darkness. However, you left in such a rush that you forgot to use the bathroom! Fancy office buildings like this one usually have keypad locks on their bathrooms, so you search the front desk for the code. + + "In order to improve security," the document you find says, "bathroom codes will no longer be written down. Instead, please memorize and follow the procedure below to access the bathrooms." + + The document goes on to explain that each button to be pressed can be found by starting on the previous button and moving to adjacent buttons on the keypad: U moves up, D moves down, L moves left, and R moves right. Each line of instructions corresponds to one button, starting at the previous button (or, for the first line, the "5" button); press whatever button you're on at the end of each line. If a move doesn't lead to a button, ignore it. + + You can't hold it much longer, so you decide to figure out the code as you walk to the bathroom. You picture a keypad like this: + + 1 2 3 + 4 5 6 + 7 8 9 + + Suppose your instructions are: + + ULL + RRDDD + LURDL + UUUUD + + You start at "5" and move up (to "2"), left (to "1"), and left (you can't, and stay on "1"), so the first button is 1. + Starting from the previous button ("1"), you move right twice (to "3") and then down three times (stopping at "9" after two moves and ignoring the third), ending up with 9. + Continuing from "9", you move left, up, right, down, and left, ending with 8. + Finally, you move up four times (stopping at "2"), then down once, ending with 5. + + So, in this example, the bathroom code is 1985. + + Your puzzle input is the instructions from the document you found at the front desk. What is the bathroom code? + answer: 78293 + status: solved + - description: | + You finally arrive at the bathroom (it's a several minute walk from the lobby so visitors can behold the many fancy conference rooms and water coolers on this floor) and go to punch in the code. Much to your bladder's dismay, the keypad is not at all like you imagined it. Instead, you are confronted with the result of hundreds of man-hours of bathroom-keypad-design meetings: + + 1 + 2 3 4 + 5 6 7 8 9 + A B C + D + + You still start at "5" and stop when you're at an edge, but given the same instructions as above, the outcome is very different: + + You start at "5" and don't move at all (up and left are both edges), ending at 5. + Continuing from "5", you move right twice and down three times (through "6", "7", "B", "D", "D"), ending at D. + Then, from "D", you move five more times (through "D", "B", "C", "C", "B"), ending at B. + Finally, after five more moves, you end at 3. + + So, given the actual keypad layout, the code would be 5DB3. + + Using the same instructions in your puzzle input, what is the correct bathroom code? + status: solved + answer: AC8C8 + diff --git a/examples/golang/2016/02/puzzle_solver.go b/examples/golang/2016/02/puzzle_solver.go index 217ebba..0e23a37 100644 --- a/examples/golang/2016/02/puzzle_solver.go +++ b/examples/golang/2016/02/puzzle_solver.go @@ -1,4 +1,4 @@ -package _day02 +package day2 import ( "strings" @@ -75,19 +75,26 @@ func solvePart2(commands []string) (string, error) { return strings.Join(code, ""), nil } -func normalizeInput(input string) []string { +type Day2Part1Solver struct { + Puzzle puzzle.PuzzlePart +} + +func (s *Day2Part1Solver) NormalizeInput(input string) []string { return strings.Split(input, "\n") } -func GetPuzzleSolver() puzzle.Puzzle[[]string] { - return puzzle.NewPuzzleSolver("day02", normalizeInput, solvePart1, solvePart2) +func (s *Day2Part1Solver) Solve() (string, error) { + return solvePart1(s.NormalizeInput(string(s.Puzzle.RawInput))) } -func Solve(fileInputContent string) puzzle.PuzzleSolution[[]string] { +type Day2Part2Solver struct { + Puzzle puzzle.PuzzlePart +} - puzzleSolver := GetPuzzleSolver() - return puzzle.PuzzleSolution[[]string]{ - Part1: puzzleSolver.SolvePart(1, fileInputContent), - Part2: puzzleSolver.SolvePart(2, fileInputContent), - } +func (s *Day2Part2Solver) NormalizeInput(input string) []string { + return strings.Split(input, "\n") +} + +func (s *Day2Part2Solver) Solve() (string, error) { + return solvePart2(s.NormalizeInput(string(s.Puzzle.RawInput))) } diff --git a/examples/golang/2016/02/puzzle_solver_test.go b/examples/golang/2016/02/puzzle_solver_test.go index f637ac6..f9fa1d5 100644 --- a/examples/golang/2016/02/puzzle_solver_test.go +++ b/examples/golang/2016/02/puzzle_solver_test.go @@ -1,24 +1,52 @@ -package _day02 +package day2 import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" ) -func TestBathroomSecurityPart1(t *testing.T) { - subject := GetPuzzleSolver() +type Day2Suite struct { + suite.Suite + SubjectPart1 Day2Part1Solver + SubjectPart2 Day2Part2Solver +} + +func (suite *Day2Suite) SetupTest() { + suite.SubjectPart1 = Day2Part1Solver{} + suite.SubjectPart2 = Day2Part2Solver{} +} + +func (suite *Day2Suite) TestBathroomSecurityPart1() { input := `ULL RRDDD LURDL UUUUD` - assert.Equal(t, "1985", subject.SolvePart(1, input)) + + suite.SubjectPart1.Puzzle.RawInput = []byte(input) + actualValues, errs := suite.SubjectPart1.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + + assert.Equal(suite.T(), "1985", actualValues) + } -func TestBathroomSecurityPart2(t *testing.T) { - subject := GetPuzzleSolver() +func (suite *Day2Suite) TestBathroomSecurityPart2() { input := `ULL RRDDD LURDL UUUUD` - assert.Equal(t, "5DB3", subject.SolvePart(2, input)) + suite.SubjectPart2.Puzzle.RawInput = []byte(input) + actualValues, errs := suite.SubjectPart2.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "5DB3", actualValues) } + +func TestSuite(t *testing.T) { + suite.Run(t, new(Day2Suite)) +} + diff --git a/examples/golang/2016/03/main.go b/examples/golang/2016/03/main.go new file mode 100644 index 0000000..98a1580 --- /dev/null +++ b/examples/golang/2016/03/main.go @@ -0,0 +1,35 @@ +package day3 + +import ( + "fmt" + "path/filepath" + "github.com/dolfolife/aoctl/pkg/puzzle" + "github.com/dolfolife/aoctl/pkg/aoc" +) + +func Solve() { + + aocConfig := aoc.GetAoCConfig() + + file := filepath.Join(aocConfig.ProjectPath, "03/puzzle.yaml") + inputfile1 := filepath.Join(aocConfig.ProjectPath, "03/input.txt") + inputfile2 := filepath.Join(aocConfig.ProjectPath, "03/input.txt") + p := puzzle.NewPuzzleFromCache(file, []string{inputfile1, inputfile2}) + part1 := Day3Part1Solver{} + part1.Puzzle = p.Puzzles[0] + answer1, err := part1.Solve() + if err != nil { + fmt.Println(err) + } + fmt.Printf("For the Year %s on the day %s, -- %s\n", p.Metadata.Year, p.Metadata.Day, p.Metadata.Title) + fmt.Printf("Part 1 -- \n Actual Answer: %s and last recorded answer is %s\n", answer1, p.Puzzles[0].Answer) + + part2 := Day3Part2Solver{} + part2.Puzzle = p.Puzzles[1] + answer2, err2 := part2.Solve() + if err2 != nil { + fmt.Println(err2) + } + fmt.Printf("Part 2 -- \n Actual Answer: %s and last recorded answer is %s\n", answer2, p.Puzzles[1].Answer) +} + diff --git a/examples/golang/2016/03/puzzle.yaml b/examples/golang/2016/03/puzzle.yaml new file mode 100644 index 0000000..0dc32b2 --- /dev/null +++ b/examples/golang/2016/03/puzzle.yaml @@ -0,0 +1,33 @@ +--- +metadata: + day: 3 + year: 2016 + title: Squares With Three Sides +puzzles: + - description: | + Now that you can think clearly, you move deeper into the labyrinth of hallways and office furniture that makes up this part of Easter Bunny HQ. This must be a graphic design department; the walls are covered in specifications for triangles. + + Or are they? + + The design document gives the side lengths of each triangle it describes, but... 5 10 25? Some of these aren't triangles. You can't help but mark the impossible ones. + + In a valid triangle, the sum of any two sides must be larger than the remaining side. For example, the "triangle" given above is impossible, because 5 + 10 is not larger than 25. + + In your puzzle input, how many of the listed triangles are possible? + answer: 869 + status: solved + - description: | + Now that you've helpfully marked up their design documents, it occurs to you that triangles are specified in groups of three vertically. Each set of three numbers in a column specifies a triangle. Rows are unrelated. + + For example, given the following specification, numbers with the same hundreds digit would be part of the same triangle: + + 101 301 501 + 102 302 502 + 103 303 503 + 201 401 601 + 202 402 602 + 203 403 603 + + In your puzzle input, and instead reading by columns, how many of the listed triangles are possible? + status: solved + answer: 1544 diff --git a/examples/golang/2016/03/puzzle_solver.go b/examples/golang/2016/03/puzzle_solver.go index 1eddbcc..1aa6440 100644 --- a/examples/golang/2016/03/puzzle_solver.go +++ b/examples/golang/2016/03/puzzle_solver.go @@ -1,4 +1,4 @@ -package _day03 +package day3 import ( "fmt" @@ -33,7 +33,11 @@ func solvePart2(input [][]int) (string, error) { return fmt.Sprint(validTriangles), nil } -func normalizeInput(input string) [][]int { +type Day3Part1Solver struct { + Puzzle puzzle.PuzzlePart +} + +func (s *Day3Part1Solver) NormalizeInput(input string) [][]int { result := make([][]int, 0) lines := strings.Split(input, "\n") for _, triangleSizes := range lines { @@ -50,15 +54,31 @@ func normalizeInput(input string) [][]int { return result } -func GetPuzzleSolver() puzzle.Puzzle[[][]int] { - return puzzle.NewPuzzleSolver("day03", normalizeInput, solvePart1, solvePart2) +func (s *Day3Part1Solver) Solve() (string, error) { + return solvePart1(s.NormalizeInput(string(s.Puzzle.RawInput))) } -func Solve(input string) puzzle.PuzzleSolution[[][]int] { - puzzleSolver := GetPuzzleSolver() +type Day3Part2Solver struct { + Puzzle puzzle.PuzzlePart +} - return puzzle.PuzzleSolution[[][]int]{ - Part1: puzzleSolver.SolvePart(1, input), - Part2: puzzleSolver.SolvePart(2, input), +func (s *Day3Part2Solver) NormalizeInput(input string) [][]int { + result := make([][]int, 0) + lines := strings.Split(input, "\n") + for _, triangleSizes := range lines { + rawValues := strings.Split(triangleSizes, " ") + line := make([]int, 0) + for _, value := range rawValues { + v, _ := strconv.Atoi(value) + if v > 0 { + line = append(line, v) + } + } + result = append(result, line) } + return result +} + +func (s *Day3Part2Solver) Solve() (string, error) { + return solvePart2(s.NormalizeInput(string(s.Puzzle.RawInput))) } diff --git a/examples/golang/2016/03/puzzle_solver_test.go b/examples/golang/2016/03/puzzle_solver_test.go index 290a2e1..0959b34 100644 --- a/examples/golang/2016/03/puzzle_solver_test.go +++ b/examples/golang/2016/03/puzzle_solver_test.go @@ -1,34 +1,49 @@ -package _day03 +package day3 import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" ) -func TestSquaresWithThreeSidesPart1(t *testing.T) { - - subject := GetPuzzleSolver() +func (suite *Day3Suite) TestSquaresWithThreeSidesPart1_1() { input := `5 10 25` - assert.Equal(t, "0", subject.SolvePart(1, input)) + suite.SubjectPart1.Puzzle.RawInput = []byte(input) + actualValues, errs := suite.SubjectPart1.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "0", actualValues) +} - input = `5 10 25 +func (suite *Day3Suite) TestSquaresWithThreeSidesPart1_2() { + input := `5 10 25 1 1 1 5 10 25` - assert.Equal(t, "1", subject.SolvePart(1, input)) + suite.SubjectPart1.Puzzle.RawInput = []byte(input) + actualValues, errs := suite.SubjectPart1.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "1", actualValues) } -func TestSquaresWithThreeSidesPart2(t *testing.T) { - - subject := GetPuzzleSolver() - +func (suite *Day3Suite) TestSquaresWithThreeSidesPart2_1() { input := `1 10 25 1 1 1 1 10 25` - assert.Equal(t, "3", subject.SolvePart(2, input)) - - input = `1 10 25 + suite.SubjectPart2.Puzzle.RawInput = []byte(input) + actualValues, errs := suite.SubjectPart2.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "3", actualValues) +} + +func (suite *Day3Suite) TestSquaresWithThreeSidesPart2_2() { + input := `1 10 25 1 1 1 1 10 25 1 1 1 @@ -37,5 +52,26 @@ func TestSquaresWithThreeSidesPart2(t *testing.T) { 1 1 1 10 100 10 1 1 1` - assert.Equal(t, "6", subject.SolvePart(2, input)) + suite.SubjectPart2.Puzzle.RawInput = []byte(input) + actualValues, errs := suite.SubjectPart2.Solve() + if errs != nil { + suite.T().Errorf("Unexpected error: %s\n", errs) + } + assert.Equal(suite.T(), "6", actualValues) } + +type Day3Suite struct { + suite.Suite + SubjectPart1 Day3Part1Solver + SubjectPart2 Day3Part2Solver +} + +func (suite *Day3Suite) SetupTest() { + suite.SubjectPart1 = Day3Part1Solver{} + suite.SubjectPart2 = Day3Part2Solver{} +} + +func TestSuite(t *testing.T) { + suite.Run(t, new(Day3Suite)) +} + diff --git a/examples/golang/2016/04/README.md b/examples/golang/2016/04/README.md new file mode 100644 index 0000000..221e3df --- /dev/null +++ b/examples/golang/2016/04/README.md @@ -0,0 +1,17 @@ +--- Day 4: Security Through Obscurity --- + +Finally, you come across an information kiosk with a list of rooms. Of course, the list is encrypted and full of decoy data, but the instructions to decode the list are barely hidden nearby. Better remove the decoy data first. + +Each room consists of an encrypted name (lowercase letters separated by dashes) followed by a dash, a sector ID, and a checksum in square brackets. + +A room is real (not a decoy) if the checksum is the five most common letters in the encrypted name, in order, with ties broken by alphabetization. For example: + + aaaaa-bbb-z-y-x-123[abxyz] is a real room because the most common letters are a (5), b (3), and then a tie between x, y, and z, which are listed alphabetically. + a-b-c-d-e-f-g-h-987[abcde] is a real room because although the letters are all tied (1 of each), the first five are listed alphabetically. + not-a-real-room-404[oarel] is a real room. + totally-real-room-200[decoy] is not. + +Of the real rooms from the list above, the sum of their sector IDs is 1514. + +What is the sum of the sector IDs of the real rooms? + diff --git a/examples/golang/2016/04/input.txt b/examples/golang/2016/04/input.txt new file mode 100644 index 0000000..8859648 --- /dev/null +++ b/examples/golang/2016/04/input.txt @@ -0,0 +1,980 @@ +bkwzkqsxq-tovvilokx-nozvyiwoxd-172[fstek] +wifilzof-wbiwifuny-yhachyylcha-526[qrazx] +jvyyvzpcl-jhukf-shivyhavyf-487[zhtsi] +kwvacumz-ozilm-kivlg-kwvbiqvumvb-694[gknyw] +mvhkvbdib-kmjezxodgz-mvwwdo-omvdidib-837[dmvbi] +nzydfxpc-rclop-qwzhpc-lnbftdtetzy-171[cptzd] +vhehkyne-unggr-inkvatlbgz-813[gnehk] +tcorcikpi-hnqygt-octmgvkpi-570[nzewo] +xmtjbzidx-wvnfzo-jkzmvodjin-447[uyzlp] +willimcpy-mwupyhayl-bohn-mufym-734[stjoc] +sbejpbdujwf-cvooz-xpsltipq-961[azfnd] +jchipqat-qphzti-rjhidbtg-htgkxrt-271[thigj] +npmhcargjc-zsllw-pcqcypaf-158[mzwnx] +luxciuwncpy-jfumncw-alumm-qilembij-318[mucil] +bxaxipgn-vgpst-rpcsn-rdpixcv-htgkxrth-427[ywazt] +zekvierkzferc-tyftfcrkv-ivtvzmzex-295[evzfk] +enzcntvat-qlr-hfre-grfgvat-143[rtaef] +mvkccspson-bkllsd-nofovyzwoxd-224[oscdk] +enzcntvat-zvyvgnel-tenqr-pnaql-pbngvat-ratvarrevat-429[zymbs] +nwzekwypera-xwogap-pnwejejc-992[lkiwn] +ajmrxjlcren-ajkkrc-lxwcjrwvnwc-667[ezynd] +bxaxipgn-vgpst-hrpktcvtg-wjci-advxhixrh-661[lytku] +owshgfarwv-vqw-kzahhafy-190[ahwfv] +jqwpihizlwca-moo-twoqabqka-512[ncdyv] +apwmeclga-pyzzgr-rcaflmjmew-886[amceg] +tyepcyletzylw-ojp-wzrtdetnd-951[mxqsy] +dlhwvupglk-kfl-hjxbpzpapvu-773[nrotd] +fab-eqodqf-dmnnuf-bgdotmeuzs-612[dchyk] +qjopwxha-bhksan-skngodkl-940[kahno] +lsyrkjkbnyec-dyz-combod-cmkfoxqob-rexd-bomosfsxq-718[lktzs] +zixppfcfba-bdd-jxohbqfkd-939[sqtor] +vxupkizork-kmm-ktmotkkxotm-852[dsqjh] +excdklvo-mkxni-mykdsxq-nozkbdwoxd-952[zspmc] +bnqqnrhud-eknvdq-sqzhmhmf-391[qhndm] +gzefmnxq-otaoaxmfq-ogefayqd-eqdhuoq-716[zinwb] +qzoggwtwsr-qobrm-ghcfous-428[goqrs] +gpbepvxcv-ltpedcxots-qphzti-steadnbtci-193[ignjy] +hvbizodx-nxvqzibzm-cpio-hvmfzodib-265[hixfe] +wkqxodsm-lexxi-kxkvicsc-926[xkcis] +bknsykmdsfo-myxcewob-qbkno-oqq-zebmrkcsxq-380[utqrz] +lejkrscv-wcfnvi-kirzezex-711[ecikr] +htwwtxnaj-idj-btwpxmtu-255[itgmd] +zsxyfgqj-jll-ijufwyrjsy-931[wrpgt] +iuxxuyobk-yigbktmkx-natz-gtgreyoy-384[ygktx] +qjopwxha-xqjju-zalhkuiajp-628[esmxk] +lxaaxbren-ljwmh-anbnjalq-745[stjqy] +gokzyxsjon-zvkcdsm-qbkcc-dbksxsxq-380[tsyqk] +qzoggwtwsr-qobrm-qcohwbu-rsdofhasbh-168[obhqr] +pelbtravp-pnaql-fgbentr-325[pabel] +xzwrmkbqtm-akidmvomz-pcvb-mvoqvmmzqvo-122[mvoqz] +sbnqbhjoh-ezf-fohjoffsjoh-233[xskyb] +jyddc-yrwxefpi-fewoix-hiwmkr-412[pdekg] +fab-eqodqf-rxaiqd-xmnadmfadk-690[sicjl] +xcitgcpixdcpa-rpcsn-htgkxrth-427[stznv] +rflsjynh-rnqnyfwd-lwfij-jll-xytwflj-229[lfjnw] +zotts-wlsiayhcw-vumeyn-fuvilunils-500[ilsun] +odiih-yujbcrl-pajbb-dbna-cnbcrwp-147[bcadi] +udskkaxawv-tmffq-klgjsyw-996[tmnfc] +emixwvqhml-kpwkwtibm-wxmzibqwva-278[zomvn] +dfcxsqhwzs-dzoghwq-ufogg-zcuwghwqg-116[kmijn] +dwbcjkun-ouxfna-mnbrpw-745[nbuwa] +jchipqat-rwdrdapit-pcpanhxh-973[hglvu] +fkqbokxqflkxi-avb-zlkqxfkjbkq-861[wdnor] +wbhsfbohwcboz-foppwh-qighcasf-gsfjwqs-480[fhswb] +dzczkrip-xiruv-szfyrqriuflj-treup-kvtyefcfxp-451[rfipu] +fmsledevhsyw-fyrrc-eguymwmxmsr-698[yzoxu] +udskkaxawv-jsttal-wfyafwwjafy-840[nlkda] +sno-rdbqds-idkkxadzm-sqzhmhmf-287[lngzc] +crwwv-yxphbq-rpbo-qbpqfkd-341[bpqrw] +odiih-mhn-anjlzdrbrcrxw-563[xadcy] +jyddc-ikk-wlmttmrk-698[lmstk] +buzahisl-wshzapj-nyhzz-klzpnu-149[pjxor] +odkasqzuo-eomhqzsqd-tgzf-ymzmsqyqzf-560[frqmp] +gokzyxsjon-bkllsd-yzobkdsyxc-874[nbtmv] +excdklvo-pvygob-bocokbmr-952[tyzxa] +jvsvymbs-jovjvshal-aljouvsvnf-253[zgtdm] +hafgnoyr-qlr-erfrnepu-637[refna] +pelbtravp-sybjre-fnyrf-299[tjoim] +fodvvlilhg-gbh-vwrudjh-621[hvdgl] +kgjgrypw-epybc-bwc-bcnjmwkclr-678[smijy] +myxcewob-qbkno-mrymyvkdo-dbksxsxq-458[bkmox] +joufsobujpobm-fhh-dpoubjonfou-311[uvksy] +rflsjynh-ojqqdgjfs-ijajqturjsy-697[jqsfr] +vetllbybxw-vtgwr-kxtvjnblbmbhg-709[athym] +ajvyjprwp-ajmrxjlcren-kdwwh-lxwcjrwvnwc-433[qsaxt] +zbytomdsvo-mkxni-mykdsxq-myxdksxwoxd-952[xdmko] +esyfwlau-bwddqtwsf-suimakalagf-684[stvip] +jef-iushuj-fhezusjybu-fbqijys-whqii-huiuqhsx-582[uhijs] +tpspahyf-nyhkl-jovjvshal-bzly-alzapun-565[sdprn] +apwmeclga-hcjjwzcyl-umpiqfmn-132[shfrg] +kwtwznct-jcvvg-lmxizbumvb-148[vbcmt] +rmn-qcapcr-aylbw-umpiqfmn-366[juftv] +sorozgxe-mxgjk-hgyqkz-yzuxgmk-748[xuvst] +bkwzkqsxq-wsvsdkbi-qbkno-mkxni-mykdsxq-yzobkdsyxc-822[ksbqx] +ryexqpqhteki-vbemuh-skijecuh-iuhlysu-842[tszmj] +ikhcxvmbex-wrx-wxlbzg-501[zhqis] +lsyrkjkbnyec-mrymyvkdo-nozvyiwoxd-978[enkfi] +wdjcvuvmyjpn-mvhkvbdib-agjrzm-nojmvbz-395[tcxne] +uwtojhynqj-gfxpjy-fhvznxnynts-567[kqpvs] +iqmbazulqp-pkq-dqoquhuzs-534[ntpuq] +gntmfefwitzx-ojqqdgjfs-ijajqturjsy-385[jfqtg] +sebehvkb-fhezusjybu-zubboruqd-husuylydw-972[ytsim] +nzcczdtgp-nsznzwlep-hzcvdsza-405[yotgu] +joufsobujpobm-fhh-ufdiopmphz-675[tsymn] +cxy-bnlanc-snuuhknjw-anbnjalq-823[nabcj] +shoewudys-rkddo-huiuqhsx-374[dhsuo] +vagreangvbany-rtt-jbexfubc-403[ynepo] +aoubshwq-dzoghwq-ufogg-aobousasbh-714[oabgh] +njmjubsz-hsbef-dipdpmbuf-qvsdibtjoh-805[bdjsf] +zovldbkfz-gbiivybxk-lmboxqflkp-653[nyajo] +yknnkoera-xwogap-hkceopeyo-628[ybmzc] +nij-mywlyn-wbiwifuny-guleyncha-396[nyiwl] +ocipgvke-ecpfa-eqcvkpi-vgejpqnqia-258[jsiqz] +encuukhkgf-hnqygt-vgejpqnqia-882[dxzer] +odiih-ljwmh-anbnjalq-927[ahijl] +fkqbokxqflkxi-zxkav-ixyloxqlov-861[nxgja] +udskkaxawv-xmrrq-uzgugdslw-sfsdqkak-216[msfyx] +owshgfarwv-bwddqtwsf-kzahhafy-216[wafhd] +oaxadrgx-dmnnuf-ruzmzouzs-794[uqhse] +ziuxioqvo-akidmvomz-pcvb-zmikycqaqbqwv-616[iqvmo] +bqvvu-xqjju-opknwca-550[yzhum] +xgjougizobk-lruckx-gtgreyoy-670[nbfmk] +bxaxipgn-vgpst-uadltg-bpgztixcv-323[gptxa] +vcibutulxiom-jfumncw-alumm-nluchcha-448[ucmla] +irgyyolokj-xghhoz-uvkxgzouty-930[ogyhk] +kyelcrga-aylbw-amyrgle-umpiqfmn-782[almye] +jsvagsulanw-xdgowj-kzahhafy-138[dblcm] +ixccb-fkrfrodwh-uhdftxlvlwlrq-881[mblzw] +chnylhuncihuf-mwupyhayl-bohn-guleyncha-422[hnuyc] +irdgrxzex-treup-tfrkzex-uvgrikdvek-165[sjbnk] +xzwrmkbqtm-akidmvomz-pcvb-zmikycqaqbqwv-434[sanut] +ykhknbqh-zua-iwjwcaiajp-524[kjlio] +jlidywncfy-mwupyhayl-bohn-uwkocmcncih-916[cyhnw] +nuatmlmdpage-omzpk-eqdhuoqe-326[ljtsm] +xmrrq-kusnwfywj-zmfl-suimakalagf-684[afmkl] +foadouwbu-qvcqczohs-rsgwub-116[oubcq] +etyyx-bgnbnkzsd-kzanqzsnqx-391[pnmlv] +pinovwgz-wvnfzo-hvmfzodib-291[ovzfi] +qekrixmg-gsrwyqiv-kvehi-fewoix-ywiv-xiwxmrk-828[iwxek] +jqwpihizlwca-xtiabqk-oziaa-kcabwumz-amzdqkm-928[aizkm] +qekrixmg-jpsaiv-stivexmsrw-672[etmsq] +excdklvo-gokzyxsjon-mrymyvkdo-bomosfsxq-562[okmsx] +qczcftiz-pibbm-aobousasbh-532[zynvo] +wbhsfbohwcboz-suu-gsfjwqsg-506[bdhxv] +lxwbdvna-pajmn-ajkkrc-anlnrerwp-563[anrjk] +lsyrkjkbnyec-pvygob-cobfsmoc-900[uyrgf] +cqwdujys-sxesebqju-ixyffydw-374[nyjvi] +odiih-ouxfna-anlnrerwp-433[naior] +rzvkjiduzy-xviyt-xjvodib-vxlpdndodji-993[aousd] +ltpedcxots-qphzti-rjhidbtg-htgkxrt-453[rjlkn] +krxqjijamxdb-kdwwh-fxatbqxy-823[wctav] +froruixo-edvnhw-vwrudjh-829[rdhou] +jvyyvzpcl-jhukf-aljouvsvnf-201[uwkic] +nij-mywlyn-vumeyn-zchuhwcha-266[hnycm] +ydjuhdqjyedqb-zubboruqd-tufbeocudj-244[vmkln] +qlm-pbzobq-mixpqfz-doxpp-mrozexpfkd-575[zswni] +qvbmzvibqwvit-moo-tijwzibwzg-330[ibvwz] +pbeebfvir-fpniratre-uhag-freivprf-949[gvxlm] +wfummczcyx-jfumncw-alumm-uwkocmcncih-890[vturj] +dwbcjkun-npp-cajrwrwp-355[kstqo] +dpssptjwf-cbtlfu-vtfs-uftujoh-441[ftsuj] +vrurcjah-pajmn-npp-anbnjalq-303[tozvd] +wfruflnsl-ojqqdgjfs-xfqjx-775[fjqls] +pbafhzre-tenqr-qlr-qrirybczrag-897[yszub] +sehheiylu-rkddo-udwyduuhydw-322[qbyad] +upq-tfdsfu-cbtlfu-nbobhfnfou-103[vpxyh] +ajvyjprwp-npp-dbna-cnbcrwp-901[stevo] +bkzrrhehdc-bzmcx-bnzshmf-qdrdzqbg-833[msuya] +amlqskcp-epybc-aylbw-rcaflmjmew-730[arbyn] +wbhsfbohwcboz-dzoghwq-ufogg-gozsg-272[gobhw] +ksodcbwnsr-dfcxsqhwzs-gqojsbusf-vibh-obozmgwg-194[rwimn] +mfklstdw-usfvq-hmjuzskafy-424[ulgym] +wfruflnsl-ojqqdgjfs-qfgtwfytwd-177[xbofz] +sedikcuh-whqtu-isqludwuh-xkdj-jhqydydw-218[dhuqw] +ltpedcxots-raphhxuxts-qphzti-advxhixrh-765[jahpi] +zgmfyxypbmsq-djmucp-rcaflmjmew-548[aeoiv] +qspkfdujmf-ezf-nbobhfnfou-207[lnkrt] +fbebmtkr-zktwx-pxtihgbsxw-ietlmbv-zktll-kxlxtkva-943[hajmb] +apwmeclga-hcjjwzcyl-bctcjmnkclr-548[yxnzl] +rflsjynh-kqtbjw-btwpxmtu-177[tbjwf] +kfg-jvtivk-treup-uvgcfpdvek-373[vkefg] +upq-tfdsfu-kfmmzcfbo-nbobhfnfou-285[vsglz] +chnylhuncihuf-mwupyhayl-bohn-xypyfijgyhn-266[pwahm] +apwmeclga-zyqicr-dglylagle-886[lagce] +jlidywncfy-xsy-qilembij-188[uxjts] +jqwpihizlwca-lgm-lmaqov-954[laimq] +qcffcgwjs-foppwh-gozsg-246[fgcop] +bqxnfdmhb-rbzudmfdq-gtms-cdrhfm-287[dmbfh] +gifavtkzcv-wcfnvi-rthlzjzkzfe-763[tmniq] +uqtqbizg-ozilm-kivlg-kwibqvo-tijwzibwzg-720[qndzg] +sxdobxkdsyxkv-mkxni-bomosfsxq-848[zyubw] +qfmcusbwq-foppwh-kcfygvcd-662[cfpqw] +sehheiylu-fbqijys-whqii-skijecuh-iuhlysu-660[kdjyq] +sedikcuh-whqtu-uww-bqrehqjeho-660[dtawl] +veqtekmrk-wgezirkiv-lyrx-eguymwmxmsr-464[emrkg] +lqwhuqdwlrqdo-exqqb-uhdftxlvlwlrq-231[ydznk] +sno-rdbqds-bzmcx-otqbgzrhmf-183[gomah] +ujqgywfau-jsttal-hmjuzskafy-476[lghae] +yrwxefpi-jpsaiv-gsrxemrqirx-100[yazxo] +udglrdfwlyh-exqqb-sxufkdvlqj-569[dlqfu] +ugjjgkanw-uzgugdslw-esjcwlafy-736[rnxjs] +pdjqhwlf-sodvwlf-judvv-orjlvwlfv-673[vldfj] +xekdwvwnzkqo-fahhuxawj-ajcejaanejc-524[ajewc] +pwcvonofrcig-pibbm-fsqswjwbu-766[myazu] +tcrjjzwzvu-wcfnvi-glityrjzex-893[bkuyx] +lugjuacha-wbiwifuny-omyl-nymncha-448[mosph] +ckgvutofkj-inuiurgzk-jkvgxzsktz-228[kguzi] +ydjuhdqjyedqb-sqdto-ijehqwu-868[ozqsj] +sxdobxkdsyxkv-zvkcdsm-qbkcc-myxdksxwoxd-640[xdksc] +odkasqzuo-dmnnuf-dqmocgueufuaz-482[wfbke] +wpuvcdng-tcddkv-wugt-vguvkpi-414[hayjs] +lqwhuqdwlrqdo-edvnhw-uhfhlylqj-439[bjzye] +wpuvcdng-dwppa-ceswkukvkqp-674[mxnkj] +qzlozfhmf-bkzrrhehdc-okzrshb-fqzrr-zbpthrhshnm-365[hrzbf] +raphhxuxts-rpcsn-rdpixcv-rjhidbtg-htgkxrt-635[yozvr] +tfejldvi-xiruv-gcrjkzt-xirjj-tljkfdvi-jvimztv-321[veyxs] +ryexqpqhteki-sxesebqju-iqbui-868[qebar] +eqpuwogt-itcfg-hnqygt-tgegkxkpi-648[ywzjl] +uzfqdzmfuazmx-pkq-bgdotmeuzs-482[zmudf] +sbnqbhjoh-cbtlfu-bdrvjtjujpo-441[taquv] +gokzyxsjon-bkwzkqsxq-lexxi-bomosfsxq-354[xoskq] +oazegyqd-sdmpq-iqmbazulqp-dmnnuf-geqd-fqefuzs-456[qdefm] +dwbcjkun-ljwmh-lxjcrwp-anbnjalq-875[hoynm] +udskkaxawv-eadalsjq-yjsvw-xdgowj-klgjsyw-216[cnwyi] +surmhfwloh-exqqb-sxufkdvlqj-439[tspmq] +ksodcbwnsr-foppwh-zcuwghwqg-402[vopuk] +zsxyfgqj-hmthtqfyj-fhvznxnynts-697[fhnty] +yflexwxoalrp-yxphbq-bkdfkbbofkd-653[jzvpm] +ltpedcxots-tvv-rdcipxcbtci-557[ctdip] +slqryzjc-djmucp-qyjcq-756[cjqyd] +rgndvtcxr-qphzti-bpcpvtbtci-817[tcpbi] +ftzgxmbv-fbebmtkr-zktwx-vtgwr-vhtmbgz-lmhktzx-371[wzxvl] +htqtwkzq-hfsid-yjhmstqtld-463[rxszy] +rwcnawjcrxwju-yujbcrl-pajbb-mnenuxyvnwc-979[gkutb] +gokzyxsjon-tovvilokx-kmaescsdsyx-562[dwlah] +iutyaskx-mxgjk-lruckx-iayzuskx-ykxboik-826[kxiuy] +vhglnfxk-zktwx-yehpxk-hixktmbhgl-891[diznt] +sedikcuh-whqtu-kdijqrbu-sqdto-seqjydw-iuhlysui-790[lksjh] +jyfvnlupj-zjhclunly-obua-vwlyhapvuz-617[pirsw] +iuruxlar-sgmtkzoi-hgyqkz-zkinturume-670[qatsn] +wkqxodsm-mrymyvkdo-mecdywob-cobfsmo-250[hgarm] +odiih-kjbtnc-nwprwnnarwp-381[qpodn] +kfg-jvtivk-tyftfcrkv-kirzezex-373[srcvd] +gcfcnuls-aluxy-zotts-wuhxs-omyl-nymncha-552[clnsu] +xmtjbzidx-zbb-xpnojhzm-nzmqdxz-421[mnkio] +qjopwxha-acc-iwngapejc-160[jimst] +emixwvqhml-kivlg-kwibqvo-aitma-564[qspyb] +nvrgfezqvu-avccpsvre-cfxzjkztj-529[lmnsh] +emixwvqhml-ktiaaqnqml-xtiabqk-oziaa-ikycqaqbqwv-746[ozadu] +zhdsrqlchg-hjj-orjlvwlfv-751[hjlrv] +cybyjqho-whqtu-uww-qsgkyiyjyed-478[szxuo] +clxalrtyr-nsznzwlep-wzrtdetnd-405[lnrtz] +sgmtkzoi-yigbktmkx-natz-rghuxgzuxe-722[gktxz] +hjgbwuladw-tskcwl-sfsdqkak-502[txdsw] +yrwxefpi-hci-vigimzmrk-646[hdmzy] +hqcfqwydw-hqrryj-jusxdebewo-946[qwdeh] +wsvsdkbi-qbkno-cmkfoxqob-rexd-yzobkdsyxc-276[wptxs] +qfmcusbwq-qvcqczohs-zcuwghwqg-870[mnybx] +clxalrtyr-nsznzwlep-cpdplcns-743[rtycz] +fbebmtkr-zktwx-ktuubm-ybgtgvbgz-553[osmdy] +jvuzbtly-nyhkl-yhtwhnpun-jovjvshal-ylzlhyjo-773[hlyjn] +slqryzjc-aylbw-pcacgtgle-782[nxkri] +tfcfiwlc-wcfnvi-wzeretzex-971[smobe] +jef-iushuj-uww-qsgkyiyjyed-556[xzrwq] +crwwv-yxphbq-xkxivpfp-653[pxvwb] +hqcfqwydw-zubboruqd-husuylydw-244[lqeho] +oxmeeuruqp-qss-eqdhuoqe-534[equos] +qxdwpopgsdjh-rgndvtcxr-gpqqxi-gthtpgrw-687[gpdqr] +mybbycsfo-mrymyvkdo-bocokbmr-692[pymza] +myvybpev-oqq-yzobkdsyxc-250[sxytw] +fnjyxwrinm-kdwwh-uxprbcrlb-329[natqu] +aietsrmdih-nippcfier-gsrxemrqirx-958[iremp] +xmrrq-tmffq-vwhdgqewfl-138[fqmrw] +oqnidbshkd-bzmcx-sdbgmnknfx-599[nzdyx] +eqttqukxg-ecpfa-eqcvkpi-ewuvqogt-ugtxkeg-128[mytkp] +nchhg-ntwemz-amzdqkma-252[kmbop] +bjfutsneji-jll-zxjw-yjxynsl-775[ndbsw] +ktwbhtvmbox-lvtoxgzxk-angm-mxvaghehzr-319[ijqxb] +kyelcrga-afmamjyrc-pcqcypaf-210[acyfm] +myxcewob-qbkno-mkxni-oxqsxoobsxq-484[oxbqk] +esyfwlau-vqw-kzahhafy-788[jikae] +oqnidbshkd-eknvdq-btrsnldq-rdquhbd-391[njzml] +qjopwxha-bhksan-opknwca-888[ahkno] +udskkaxawv-jsttal-vwhdgqewfl-190[hqmnt] +excdklvo-lexxi-crszzsxq-458[uavnl] +frqvxphu-judgh-fdqgb-frdwlqj-wudlqlqj-179[bimaq] +iuruxlar-kmm-ykxboiky-852[tijpz] +tyepcyletzylw-mldvpe-lylwjdtd-509[lydet] +frqvxphu-judgh-gbh-whfkqrorjb-101[mhbes] +xqvwdeoh-edvnhw-zrunvkrs-699[zmudw] +irdgrxzex-treup-fgvirkzfej-893[fbsyn] +cxy-bnlanc-ljwmh-orwjwlrwp-771[ngpmz] +eqpuwogt-itcfg-gii-ucngu-388[hzgae] +ikhcxvmbex-cxeeruxtg-wxlbzg-553[mvnfs] +mrxivrexmsrep-fyrrc-asvowlst-854[codsq] +npmhcargjc-aylbw-qcptgacq-366[ditsg] +ftzgxmbv-ietlmbv-zktll-phkdlahi-241[ltbhi] +hqcfqwydw-tou-bewyijysi-270[hnvux] +emixwvqhml-kivlg-abwziom-590[imlvw] +pejji-nio-mecdywob-cobfsmo-926[wrjmp] +bknsykmdsfo-oqq-dbksxsxq-640[naysz] +gifavtkzcv-vxx-tfekrzedvek-789[cnwtp] +kmjezxodgz-diozmivodjivg-agjrzm-xjiovdihzio-915[yqktj] +shoewudys-vbemuh-qsgkyiyjyed-946[nqsjd] +htqtwkzq-ojqqdgjfs-rfwpjynsl-749[hryqo] +rmn-qcapcr-zyqicr-pcacgtgle-340[znstw] +bnqqnrhud-bzmcx-bnmszhmldms-729[yfetv] +surmhfwloh-gbh-rshudwlrqv-725[dsaym] +jchipqat-tvv-itrwcdadvn-505[povhu] +zgmfyxypbmsq-njyqrga-epyqq-rcaflmjmew-340[mqyae] +froruixo-exqqb-pdunhwlqj-283[nmuqd] +lnkfaypeha-xwogap-odellejc-784[ytrsz] +jlidywncfy-xsy-fuvilunils-864[ilyfn] +joufsobujpobm-dipdpmbuf-sftfbsdi-545[rwjnm] +tvsnigxmpi-gerhc-gsexmrk-eguymwmxmsr-932[pivem] +tfejldvi-xiruv-srjbvk-ivjvrity-815[vijrt] +zuv-ykixkz-yigbktmkx-natz-zkinturume-410[kzitu] +enzcntvat-pubpbyngr-qrcyblzrag-117[oywbs] +wsvsdkbi-qbkno-lkcuod-nofovyzwoxd-744[xnuqc] +wbhsfbohwcboz-foppwh-aobousasbh-246[nfsml] +uiovmbqk-jcvvg-abwziom-720[nbqaz] +etaqigpke-fag-fgrnqaogpv-674[gaefp] +ejpanjwpekjwh-nwxxep-hkceopeyo-238[bmscu] +qjopwxha-bhksan-wjwhuoeo-940[xenwh] +etyyx-bzmcx-bnzshmf-qdzbpthrhshnm-729[hbmzn] +uqtqbizg-ozilm-lgm-abwziom-356[tspmz] +excdklvo-mybbycsfo-tovvilokx-psxkxmsxq-874[axwon] +mvydjvxodqz-xviyt-xjvodib-pnzm-oznodib-187[nflym] +ixccb-zhdsrqlchg-edvnhw-xvhu-whvwlqj-465[hcvwd] +qspkfdujmf-votubcmf-tdbwfohfs-ivou-bdrvjtjujpo-181[esuzg] +fkqbokxqflkxi-qlm-pbzobq-bdd-jxohbqfkd-601[dcgym] +mtzslklcozfd-prr-nfdezxpc-dpcgtnp-301[tmnrk] +xekdwvwnzkqo-lhwopey-cnwoo-wymqeoepekj-290[rzsnk] +fubrjhqlf-sodvwlf-judvv-pdqdjhphqw-725[dfhjq] +shoewudys-zubboruqd-skijecuh-iuhlysu-608[ushbd] +zlkprjbo-doxab-zxkav-rpbo-qbpqfkd-679[bkopa] +nzcczdtgp-mldvpe-opawzjxpye-587[tkbms] +apuut-nxvqzibzm-cpio-yzkvmohzio-655[rsozd] +rgllk-ngzzk-ymdwqfuzs-300[yhzxu] +cvabijtm-jcvvg-uiviomumvb-538[ixajz] +oazegyqd-sdmpq-otaoaxmfq-pqbmdfyqzf-248[qadfm] +rtqlgevkng-fag-nqikuvkeu-960[nqdom] +bnknqetk-cxd-cdrhfm-183[mfpwa] +ohmnuvfy-wuhxs-wiuncha-lyuwkocmcncih-552[chunw] +hqtyeqsjylu-jef-iushuj-tou-fkhsxqiydw-296[isfmy] +kwtwznct-kwvacumz-ozilm-jiasmb-uiviomumvb-746[qmjyz] +qfmcusbwq-foppwh-twbobqwbu-298[bwqfo] +ykhknbqh-xqjju-owhao-472[hjtck] +dszphfojd-tdbwfohfs-ivou-mbcpsbupsz-103[sbdfo] +lahxpnwrl-ljwmh-nwprwnnarwp-641[srtpm] +ckgvutofkj-lruckx-jkvruesktz-878[zjlyk] +dyz-combod-zvkcdsm-qbkcc-nocsqx-926[yvute] +ktwbhtvmbox-wrx-nlxk-mxlmbgz-345[lsuwt] +nwilwcejc-nwxxep-zalhkuiajp-186[bznxr] +uzfqdzmfuazmx-otaoaxmfq-bgdotmeuzs-846[mzafo] +oxmeeuruqp-omzpk-oamfuzs-oazfmuzyqzf-352[ypdzg] +zhdsrqlchg-fdqgb-ghsduwphqw-361[hdgqs] +nchhg-jiasmb-amzdqkma-278[qklti] +tfiifjzmv-upv-wzeretzex-295[itvos] +eqttqukxg-ecpfa-ujkrrkpi-830[kepqr] +clotzlnetgp-mldvpe-nzyeltyxpye-145[xfpsy] +mbiyqoxsm-myvybpev-mkxni-mykdsxq-yzobkdsyxc-900[ymxbk] +plolwdub-judgh-vfdyhqjhu-kxqw-vhuylfhv-621[zqwmy] +atyzghrk-vxupkizork-jek-giwaoyozout-228[abrmv] +zotts-xsy-mufym-162[mstyf] +vhehkyne-ktuubm-mktbgbgz-293[qmytr] +kwvacumz-ozilm-zijjqb-ivitgaqa-616[fkoxt] +yaxsnlcrun-ajvyjprwp-snuuhknjw-anlnrerwp-771[zpyld] +raphhxuxts-bpvctixr-eaphixr-vgphh-bpcpvtbtci-115[phtxb] +nuatmlmdpage-odkasqzuo-qss-dqmocgueufuaz-768[umnqw] +yknnkoera-lhwopey-cnwoo-nawymqeoepekj-680[eonkw] +pybgmyargtc-aylbw-qyjcq-886[buzfp] +gzefmnxq-ngzzk-iadwetab-638[zaegn] +sbnqbhjoh-kfmmzcfbo-usbjojoh-129[acdkb] +lxaaxbren-lujbbrornm-ljwmh-lxjcrwp-mnyjacvnwc-355[yzsuk] +nchhg-lgm-nqvivkqvo-200[dystz] +plolwdub-judgh-udeelw-rshudwlrqv-335[sihdt] +wlsiayhcw-vumeyn-lymyulwb-292[zbrux] +ytu-xjhwjy-hfsid-htfynsl-qtlnxynhx-411[adxmu] +wkqxodsm-tovvilokx-ckvoc-822[uhgov] +chnylhuncihuf-vumeyn-nluchcha-500[rcbmn] +tfiifjzmv-lejkrscv-tyftfcrkv-jyzggzex-243[fjtvz] +eqpuwogt-itcfg-tcddkv-tgugctej-310[pyemh] +iuruxlar-xgsvgmotm-pkrrehkgt-xkykgxin-956[btwqp] +shoewudys-sxesebqju-qdqboiyi-894[seqbd] +zlkprjbo-doxab-gbiivybxk-pxibp-861[azyjx] +ckgvutofkj-inuiurgzk-lotgtiotm-982[qszly] +thnulapj-jshzzpmplk-jhukf-vwlyhapvuz-747[hpjlu] +pybgmyargtc-hcjjwzcyl-qcptgacq-782[bxsuc] +xgsvgmotm-vrgyzoi-mxgyy-iutzgotsktz-150[gtmoy] +laffe-yigbktmkx-natz-jkyomt-696[ktafm] +zvyvgnel-tenqr-pubpbyngr-znexrgvat-507[wfjhu] +pelbtravp-pnaql-znantrzrag-403[cbyja] +jqwpihizlwca-akidmvomz-pcvb-apqxxqvo-850[oxymv] +cvabijtm-ntwemz-twoqabqka-954[atbmq] +zixppfcfba-avb-zlkqxfkjbkq-809[zlmjc] +sebehvkb-zubboruqd-tufqhjcudj-556[budeh] +lqwhuqdwlrqdo-fdqgb-ghvljq-621[qdlgh] +qlm-pbzobq-crwwv-zxkav-zlxqfkd-rpbo-qbpqfkd-731[ciyxw] +pwcvonofrcig-gqojsbusf-vibh-qighcasf-gsfjwqs-740[csebm] +mvydjvxodqz-kmjezxodgz-kgvnodx-bmvnn-yzqzgjkhzio-239[zdovg] +kzgwomvqk-xtiabqk-oziaa-tijwzibwzg-564[menyj] +ksodcbwnsr-xszzmpsob-kcfygvcd-454[mbaod] +ejpanjwpekjwh-xwogap-hwxknwpknu-472[wpjkn] +mvydjvxodqz-hvbizodx-wpiit-hvivbzhzio-967[ivzdh] +mvydjvxodqz-mvwwdo-nzmqdxzn-681[jryzk] +enqvbnpgvir-rtt-freivprf-871[lgqrc] +hvbizodx-wpiit-kpmxcvndib-291[dyjmn] +molgbzqfib-mixpqfz-doxpp-xkxivpfp-965[pxfib] +fbebmtkr-zktwx-cxeeruxtg-nlxk-mxlmbgz-137[dckut] +luxciuwncpy-luvvcn-mbcjjcha-500[qsvzt] +apwmeclga-hcjjwzcyl-qyjcq-704[cjalq] +wpuvcdng-eqttqukxg-uecxgpigt-jwpv-cpcnauku-830[ucgpt] +iehepwnu-cnwza-fahhuxawj-pnwejejc-940[ewahj] +pbybeshy-pbeebfvir-pnaql-pbngvat-freivprf-715[uyzwp] +htsxzrjw-lwfij-ojqqdgjfs-zxjw-yjxynsl-957[iyonc] +sxdobxkdsyxkv-wsvsdkbi-qbkno-zvkcdsm-qbkcc-bomosfsxq-536[mbyan] +fruurvlyh-fkrfrodwh-uhdftxlvlwlrq-335[rflhu] +froruixo-hjj-orjlvwlfv-387[uyawn] +myvybpev-lexxi-vklybkdybi-978[ybvei] +chnylhuncihuf-vohhs-xymcah-240[yxnmh] +tagzsrsjvgmk-vqw-vwhsjlewfl-606[svwgj] +zbytomdsvo-lexxi-domrxyvyqi-250[oxydi] +qfkkj-clmmte-opgpwzaxpye-821[pekma] +lgh-kwujwl-udskkaxawv-jsttal-hmjuzskafy-320[axyrm] +irdgrxzex-nvrgfezqvu-avccpsvre-cfxzjkztj-191[sclzh] +mhi-lxvkxm-xzz-etuhktmhkr-319[rcomn] +lhkhszqx-fqzcd-dff-sdbgmnknfx-391[ugevx] +apwmeclga-aylbw-ylyjwqgq-314[izfye] +yflexwxoalrp-zlkprjbo-doxab-ciltbo-qbzeklildv-341[byclp] +cvabijtm-kwzzwaqdm-ntwemz-abwziom-252[rdmvn] +qfkkj-upwwjmply-epnsyzwzrj-899[okhgz] +jxdkbqfz-avb-zlkqxfkjbkq-861[wptxb] +gpsxdprixkt-qphzti-hwxeexcv-947[krgwe] +nij-mywlyn-wuhxs-wiuncha-lymyulwb-968[wylnu] +sbnqbhjoh-kfmmzcfbo-ufdiopmphz-987[bfhmo] +guahyncw-jfumncw-alumm-xyjfisgyhn-500[htamn] +ytu-xjhwjy-jll-ijxnls-879[duthg] +lgh-kwujwl-usfvq-ugslafy-esfsywewfl-944[ilszy] +tvsnigxmpi-tpewxmg-kveww-xiglrspskc-152[gipsw] +joufsobujpobm-cbtlfu-dvtupnfs-tfswjdf-129[fubjo] +rwcnawjcrxwju-bljenwpna-qdwc-mnyuxhvnwc-225[wncja] +qzchnzbshud-okzrshb-fqzrr-rzkdr-989[rzhbd] +qzoggwtwsr-pogysh-rsjszcdasbh-896[sghor] +gzefmnxq-dmnnuf-xmnadmfadk-326[tvuiw] +qzoggwtwsr-pibbm-zopcfohcfm-792[jsmfu] +mvydjvxodqz-xviyt-xjvodib-hvivbzhzio-369[iceny] +wkqxodsm-lkcuod-cdybkqo-224[dkocq] +veqtekmrk-ikk-wxsveki-542[keivm] +zlkprjbo-doxab-yxphbq-pqloxdb-419[ckdtm] +buzahisl-ibuuf-klzpnu-721[stjnm] +hwdtljsnh-kqtbjw-ijajqturjsy-515[plnqy] +luxciuwncpy-jfumncw-alumm-lyuwkocmcncih-474[lqpco] +tinnm-ibghopzs-rms-aobousasbh-506[sboah] +pbeebfvir-rtt-ratvarrevat-403[tdokj] +dmybmsuzs-pkq-efadmsq-300[msdqa] +ujqgywfau-tmffq-dgyaklauk-970[yxmid] +ovbunmneqbhf-enoovg-hfre-grfgvat-481[efgno] +hqfxxnknji-kzeed-uqfxynh-lwfxx-wjhjnansl-957[nxfhj] +plolwdub-judgh-edvnhw-pdqdjhphqw-985[dsxhg] +nwlddtqtpo-awldetn-rcldd-nfdezxpc-dpcgtnp-353[dnptc] +bwx-amkzmb-xzwrmkbqtm-ntwemz-amzdqkma-668[swmnl] +bqxnfdmhb-qzaahs-rdquhbdr-443[bdhqa] +egdytrixat-ide-htrgti-uadltg-steadnbtci-297[zampy] +gsrwyqiv-kvehi-gerhc-gsexmrk-erepcwmw-880[bkwts] +nsyjwsfyntsfq-gfxpjy-jslnsjjwnsl-749[lvzus] +dfcxsqhwzs-pibbm-gvwddwbu-246[dqbem] +mtzslklcozfd-ojp-fdpc-epdetyr-613[dpcef] +gbc-frperg-ohaal-erfrnepu-351[reafg] +gvaaz-cbtlfu-efqbsunfou-311[dvnmz] +ugdgjxmd-tskcwl-umklgewj-kwjnauw-892[wgjku] +iruzfrtkzmv-avccpsvre-nfibjyfg-243[jzoyc] +shoewudys-hqrryj-bqrehqjeho-296[heqrj] +hwdtljsnh-kqtbjw-htsyfnsrjsy-827[dntpc] +zilqwikbqdm-kivlg-uiviomumvb-902[imvbk] +rsvxltspi-sfnigx-wxsveki-984[sixve] +surmhfwloh-gbh-xvhu-whvwlqj-387[hwluv] +ubhatstkwhnl-yehpxk-wxlbzg-137[raqjb] +oknkvcta-itcfg-uecxgpigt-jwpv-ocpcigogpv-596[cgpio] +amjmpdsj-djmucp-nspafyqgle-470[ztpqn] +zixppfcfba-avb-abpfdk-471[abfpc] +owshgfarwv-jsttal-vwkayf-944[smcyx] +vjpwncrl-ljwmh-lxjcrwp-lxwcjrwvnwc-589[irbxq] +qvbmzvibqwvit-ziuxioqvo-lgm-amzdqkma-928[hgfln] +lxuxaodu-kjbtnc-jwjuhbrb-147[bjuxa] +etaqigpke-fag-yqtmujqr-440[qaegt] +zekvierkzferc-irdgrxzex-jtrmvexvi-ylek-rthlzjzkzfe-633[gkyzp] +mfklstdw-hdsklau-yjskk-kwjnauwk-762[vnfzg] +pkl-oaynap-fahhuxawj-oanreyao-706[mdfpn] +hwdtljsnh-hmthtqfyj-rfsfljrjsy-359[sxziu] +fab-eqodqf-ngzzk-bgdotmeuzs-144[kxags] +tagzsrsjvgmk-tskcwl-vwhsjlewfl-424[ejuah] +kzgwomvqk-jiasmb-uizsmbqvo-590[mbiko] +qjopwxha-xqjju-oanreyao-758[ubmon] +hvbizodx-xmtjbzidx-nxvqzibzm-cpio-yzkgjthzio-889[rmyqo] +iuruxlar-kmm-jkvruesktz-644[kruma] +ujqgywfau-jsttal-vwhdgqewfl-710[hbdlx] +jlidywncfy-wuhxs-wiuncha-yhachyylcha-630[hycaw] +lugjuacha-wlsiayhcw-dyffsvyuh-uhufsmcm-890[juefh] +hjgbwuladw-xdgowj-hmjuzskafy-398[wqigl] +yuxufmdk-sdmpq-pkq-etubbuzs-456[wldkg] +vcibutulxiom-dyffsvyuh-qilembij-110[jdnmz] +nzwzcqfw-clmmte-dpcgtnpd-509[cdmnp] +aczupnetwp-nlyoj-nzletyr-zapcletzyd-665[zelnp] +htsxzrjw-lwfij-wfintfhynaj-kqtbjw-knsfshnsl-983[kytzm] +enqvbnpgvir-onfxrg-qrirybczrag-611[rgnbi] +molgbzqfib-ciltbo-xkxivpfp-159[biflo] +plolwdub-judgh-fkrfrodwh-ghyhorsphqw-517[hdorw] +gzefmnxq-omzpk-oazfmuzyqzf-872[zkycu] +qjopwxha-lhwopey-cnwoo-naoawnyd-186[cvyno] +jyfvnlupj-ipvohghykvbz-jovjvshal-ylzlhyjo-435[xlenk] +ajmrxjlcren-kjbtnc-jwjuhbrb-329[klcuz] +wdjcvuvmyjpn-ezggtwzvi-jkzmvodjin-603[gmveh] +muqfedyput-fbqijys-whqii-bqrehqjeho-192[vdlge] +ktfitzbgz-xzz-ftgtzxfxgm-605[izfql] +bknsykmdsfo-oqq-wkbuodsxq-458[stifb] +slqryzjc-hcjjwzcyl-yaosgqgrgml-314[qymir] +gpewwmjmih-veffmx-xvemrmrk-126[itcvu] +rdadguja-gpqqxi-ldgzhwde-297[hnvso] +lxaaxbren-mhn-cnlqwxuxph-251[xvjuz] +xst-wigvix-fewoix-gsrxemrqirx-698[xireg] +iehepwnu-cnwza-zua-wymqeoepekj-108[sdnmj] +oknkvcta-itcfg-rncuvke-itcuu-hkpcpekpi-908[pgfbe] +enqvbnpgvir-ohaal-hfre-grfgvat-351[hsgdf] +ixccb-iorzhu-hqjlqhhulqj-647[hqcij] +apuut-agjrzm-jkzmvodjin-915[jamuz] +hqcfqwydw-rqiauj-ijehqwu-530[qwhij] +vhehkyne-ktwbhtvmbox-lvtoxgzxk-angm-kxvxbobgz-683[tsurp] +gntmfefwitzx-idj-knsfshnsl-723[fnsit] +ajvyjprwp-bljenwpna-qdwc-ujkxajcxah-563[yskxv] +joufsobujpobm-dboez-dpbujoh-mbcpsbupsz-259[bopuj] +xlrypetn-prr-nzyeltyxpye-847[yeprl] +zuv-ykixkz-xgsvgmotm-lruckx-jkvgxzsktz-696[ijlfz] +jqwpihizlwca-moo-lmxtwgumvb-798[nkzsr] +jsvagsulanw-kusnwfywj-zmfl-klgjsyw-736[ectrq] +ykhknbqh-nwxxep-nawymqeoepekj-758[cfvdy] +kzeed-gfxpjy-tujwfyntsx-385[aunmy] +slqryzjc-qaytclecp-fslr-dglylagle-184[lcyae] +laffe-vrgyzoi-mxgyy-iutzgotsktz-410[gtyzf] +gpbepvxcv-hrpktcvtg-wjci-stktadebtci-141[zoqhx] +yaxsnlcrun-lqxlxujcn-mnyuxhvnwc-641[nxclu] +tagzsrsjvgmk-kusnwfywj-zmfl-dstgjslgjq-294[gayon] +kwzzwaqdm-zijjqb-xczkpiaqvo-902[mkgjt] +mfklstdw-usfvq-ugslafy-xafsfuafy-684[fsaul] +zvyvgnel-tenqr-ovbunmneqbhf-sybjre-fgbentr-117[shfce] +emixwvqhml-akidmvomz-pcvb-amzdqkma-720[relbk] +rdggdhxkt-eaphixr-vgphh-hwxeexcv-973[xozyv] +bqvvu-zua-iwngapejc-992[nmdax] +bjfutsneji-kqtbjw-wjxjfwhm-203[irjmx] +bdavqofuxq-nmewqf-abqdmfuaze-976[vgzhc] +vdzonmhydc-okzrshb-fqzrr-rzkdr-313[rzdhk] +sawlkjevaz-oywrajcan-dqjp-wjwhuoeo-836[ajwoe] +fruurvlyh-gbh-sxufkdvlqj-413[kftmo] +fruurvlyh-sodvwlf-judvv-ghsorbphqw-569[tadzk] +sbejpbdujwf-tdbwfohfs-ivou-dpoubjonfou-103[rbqio] +oxmeeuruqp-otaoaxmfq-xasuefuoe-222[ozipy] +rdggdhxkt-qphzti-ejgrwphxcv-921[tusrb] +dkqjcbctfqwu-fag-yqtmujqr-882[kzvuf] +gzefmnxq-dmnnuf-mzmxkeue-248[menfu] +kgjgrypw-epybc-aylbw-kylyeckclr-314[mlvhs] +bwx-amkzmb-akidmvomz-pcvb-abwziom-148[nmtyw] +ckgvutofkj-sorozgxe-mxgjk-xghhoz-xkykgxin-670[gkxoh] +zhdsrqlchg-fkrfrodwh-ghsorbphqw-803[cjybd] +hvbizodx-wvnfzo-adivixdib-603[xwstz] +tvsnigxmpi-gerhc-hitpscqirx-204[icghp] +jrncbavmrq-cynfgvp-tenff-npdhvfvgvba-741[ybszn] +mbiyqoxsm-pvygob-psxkxmsxq-952[mjfnc] +gsrwyqiv-kvehi-veffmx-gywxsqiv-wivzmgi-282[bdrgj] +clxalrtyr-xtwtelcj-rclop-awldetn-rcldd-cpdplcns-847[lcdrt] +ahngzyzqcntr-bzmcx-sdbgmnknfx-287[fmyqt] +zgmfyxypbmsq-aylbw-amyrgle-bctcjmnkclr-340[mybcl] +fydelmwp-prr-nzyeltyxpye-717[gfjxa] +rnqnyfwd-lwfij-rflsjynh-wfggny-xfqjx-931[fnjwy] +zilqwikbqdm-xtiabqk-oziaa-twoqabqka-278[ftonr] +bjfutsneji-gzssd-uzwhmfxnsl-827[sfjnu] +ojk-nzxmzo-pinovwgz-agjrzm-jkzmvodjin-733[zjomn] +ygcrqpkbgf-dcumgv-fgukip-570[vmhxn] +dzczkrip-xiruv-srjbvk-jyzggzex-945[uzneh] +bkzrrhehdc-bzmcx-lzmzfdldms-287[eclvd] +ziuxioqvo-kpwkwtibm-lmxizbumvb-564[txsru] +kzgwomvqk-lgm-lmxizbumvb-122[mbgkl] +htsxzrjw-lwfij-idj-xjwanhjx-463[obdze] +gntmfefwitzx-kqtbjw-wjxjfwhm-749[qzutv] +htsxzrjw-lwfij-jll-tujwfyntsx-671[xugan] +ymszqfuo-rxaiqd-etubbuzs-118[ubqsz] +vdzonmhydc-azrjds-lzqjdshmf-989[dzhjm] +dyz-combod-bkllsd-oxqsxoobsxq-354[nrmkx] +pyknyegle-afmamjyrc-yaosgqgrgml-626[zdlfg] +oxmeeuruqp-vqxxknqmz-oazfmuzyqzf-352[rnsyt] +qjopwxha-xqjju-pnwejejc-654[jepqw] +wifilzof-jfumncw-alumm-xypyfijgyhn-604[fjerw] +vagreangvbany-enoovg-fuvccvat-533[gncot] +avw-zljyla-zjhclunly-obua-thuhnltlua-669[wathd] +ynssr-lvtoxgzxk-angm-mxvaghehzr-345[vopnm] +cvabijtm-uqtqbizg-ozilm-xtiabqk-oziaa-lmdmtwxumvb-928[imabt] +frqvxphu-judgh-sodvwlf-judvv-pdqdjhphqw-751[azovy] +qmpmxevc-kvehi-jyddc-fyrrc-qerekiqirx-282[ygmhv] +fodvvlilhg-udeelw-pdunhwlqj-153[sndmo] +gpsxdprixkt-ytaanqtpc-gthtpgrw-765[tpgar] +cvabijtm-kpwkwtibm-bmkpvwtwog-174[wbkmt] +vetllbybxw-yehpxk-wxlbzg-891[yekxl] +nzwzcqfw-nlyoj-dezclrp-275[zclnw] +qmpmxevc-kvehi-glsgspexi-gsrxemrqirx-828[exgim] +xtwtelcj-rclop-dnlgpyrpc-sfye-hzcvdsza-873[xmpon] +jrncbavmrq-pnaql-jbexfubc-793[bacjn] +ohmnuvfy-yaa-lymyulwb-266[yalmu] +nzwzcqfw-aczupnetwp-awldetn-rcldd-pyrtyppctyr-613[pctwd] +vqr-ugetgv-uecxgpigt-jwpv-rwtejcukpi-752[geptu] +tfcfiwlc-lejkrscv-upv-rthlzjzkzfe-607[tcfns] +hwdtljsnh-uqfxynh-lwfxx-knsfshnsl-229[xtngb] +iuruxlar-igtje-iayzuskx-ykxboik-930[kmghr] +xjgjmapg-ezggtwzvi-hvivbzhzio-421[gzivh] +gpbepvxcv-hrpktcvtg-wjci-hwxeexcv-349[xswrp] +tcorcikpi-eqttqukxg-gii-hkpcpekpi-622[ruxyk] +ygcrqpkbgf-ejqeqncvg-ucngu-440[gcqen] +etyyx-dff-qdbdhuhmf-729[wskto] +tfiifjzmv-upv-vexzevvizex-399[veizf] +houngfgxjuay-sorozgxe-mxgjk-jek-aykx-zkyzotm-566[aimhd] +hcd-gsqfsh-dzoghwq-ufogg-aobousasbh-714[ynfie] +foadouwbu-qobrm-qcohwbu-zopcfohcfm-792[obcfu] +ynukcajey-oywrajcan-dqjp-wjwhuoeo-680[jaowy] +rflsjynh-jll-rfsfljrjsy-489[jlfrs] +vkrhzxgbv-pxtihgbsxw-yehpxk-mktbgbgz-917[igtvy] +hjgbwuladw-tskcwl-dgyaklauk-294[aklwd] +cvabijtm-jcvvg-zmikycqaqbqwv-772[vcqab] +odiih-yujbcrl-pajbb-vjwjpnvnwc-849[jbcin] +tinnm-tzcksf-igsf-hsghwbu-220[bnamt] +pbeebfvir-wryylorna-jbexfubc-637[egouk] +xmtjbzidx-xviyt-yzqzgjkhzio-265[vxsry] +avw-zljyla-zjhclunly-obua-klwhyatlua-201[sjayl] +dfcxsqhwzs-qvcqczohs-fsgsofqv-246[dosrp] +rzvkjiduzy-xviyt-xjvodib-kpmxcvndib-291[cwzla] +gcfcnuls-aluxy-mwupyhayl-bohn-wihnuchgyhn-968[hnuyc] +dyz-combod-lsyrkjkbnyec-bkllsd-domrxyvyqi-328[vtxzd] +fruurvlyh-mhoobehdq-dftxlvlwlrq-907[jlves] +mrxivrexmsrep-gerhc-gsexmrk-tyvglewmrk-152[wzuly] +votubcmf-gmpxfs-pqfsbujpot-883[fpbmo] +bljenwpna-qdwc-anbnjalq-329[lcwmy] +xekdwvwnzkqo-ydkykhwpa-wjwhuoeo-550[toavy] +yhkpvhjapcl-yhiipa-jbzavtly-zlycpjl-201[lpyah] +xjinphzm-bmvyz-wvnfzo-nzmqdxzn-681[ykfxe] +pbeebfvir-rtt-ybtvfgvpf-507[bftve] +gvcskirmg-ikk-hizipstqirx-750[iyquj] +yhwooebeaz-lhwopey-cnwoo-oanreyao-108[tmuag] +wlqqp-jtrmvexvi-ylek-nfibjyfg-581[tnrhf] +tfiifjzmv-avccpsvre-jyzggzex-477[mvnjr] +xjmmjndqz-zbb-yzndbi-811[bzdjm] +qjopwxha-xwogap-nayaerejc-160[isjqz] +qzlozfhmf-azrjds-knfhrshbr-573[dfmys] +vhglnfxk-zktwx-vetllbybxw-vtgwr-vhtmbgz-ybgtgvbgz-761[gbtvl] +etaqigpke-ecpfa-eqcvkpi-cpcnauku-336[eyxtb] +lqwhuqdwlrqdo-fdqgb-frdwlqj-zrunvkrs-933[tvijl] +gvcskirmg-tvsnigxmpi-gerhc-gsexmrk-wlmttmrk-828[szawg] +irdgrxzex-kfg-jvtivk-wcfnvi-jyzggzex-269[givxz] +cqwdujys-sqdto-iqbui-270[siyeh] +bnqqnrhud-bgnbnkzsd-trdq-sdrshmf-807[dnbqr] +rgndvtcxr-hrpktcvtg-wjci-prfjxhxixdc-193[yjsht] +qekrixmg-hci-xvemrmrk-282[mreik] +xcitgcpixdcpa-snt-apqdgpidgn-349[mfywv] +wkqxodsm-pvygob-wkbuodsxq-978[ysamp] +aoubshwq-qvcqczohs-kcfygvcd-558[ytvls] +tyepcyletzylw-qwzhpc-opalcexpye-301[gamdn] +tfcfiwlc-treup-uvjzxe-607[nrthm] +ubhatstkwhnl-lvtoxgzxk-angm-inkvatlbgz-865[tagkl] +wihmogyl-aluxy-yaa-qilembij-890[emvct] +bxaxipgn-vgpst-ltpedcxots-gpqqxi-hidgpvt-245[pgtxi] +jfifqxov-doxab-mixpqfz-doxpp-obpbxoze-107[ghpyi] +gvaaz-dpssptjwf-sbccju-fohjoffsjoh-675[pfzwa] +gzefmnxq-eomhqzsqd-tgzf-efadmsq-378[qefmz] +emixwvqhml-kivlg-zmkmqdqvo-876[dcfin] +fodvvlilhg-fdqgb-frqwdlqphqw-725[qdflg] +laffe-pkrrehkgt-rumoyzoiy-670[dyjut] +egdytrixat-qphzti-tcvxcttgxcv-245[tcxgi] +htqtwkzq-wfintfhynaj-xhfajsljw-mzsy-jslnsjjwnsl-645[eynzi] +vrurcjah-pajmn-npp-mnyuxhvnwc-563[npach] +ejpanjwpekjwh-acc-klanwpekjo-576[jaekp] +kwvacumz-ozilm-kpwkwtibm-uizsmbqvo-876[mikwz] +hjgbwuladw-xdgowj-esfsywewfl-866[byzdm] +pbybeshy-wryylorna-npdhvfvgvba-351[stmxy] +qjopwxha-ywjzu-hkceopeyo-654[tysoa] +lhkhszqx-fqzcd-dff-vnqjrgno-417[fqdhn] +rgllk-otaoaxmfq-fdmuzuzs-768[vkqac] +ohmnuvfy-xsy-omyl-nymncha-214[hmtfs] +enzcntvat-cynfgvp-tenff-nanylfvf-455[cuimh] +sedikcuh-whqtu-sehheiylu-tou-bqrehqjeho-868[ydaux] +tyepcyletzylw-ojp-opalcexpye-145[wciks] +udpsdjlqj-hjj-frqwdlqphqw-309[gbpcz] +eqpuwogt-itcfg-lgnnadgcp-vtckpkpi-388[gpcti] +rkpqxyib-pzxsbkdbo-erkq-zrpqljbo-pbosfzb-133[bpkoq] +kdijqrbu-sxesebqju-tufqhjcudj-114[tdbva] +gsvvswmzi-wgezirkiv-lyrx-irkmriivmrk-412[twsrk] +ucynmlgxcb-qaytclecp-fslr-amlryglkclr-704[lcrya] +xst-wigvix-veffmx-wxsveki-100[ocvmr] +surmhfwloh-vfdyhqjhu-kxqw-frqwdlqphqw-829[hqwfd] +xmrrq-usfvq-esfsywewfl-528[alidm] +zhdsrqlchg-lqwhuqdwlrqdo-sodvwlf-judvv-ghsorbphqw-777[rtnmj] +egdytrixat-xcitgcpixdcpa-rwdrdapit-uxcpcrxcv-245[cdabn] +yrwxefpi-ikk-gywxsqiv-wivzmgi-152[iwgkv] +qcffcgwjs-foppwh-obozmgwg-558[zotsu] +veqtekmrk-gerhc-gsexmrk-hitpscqirx-568[nczdq] +gzefmnxq-pkq-pqbmdfyqzf-794[jxrmh] +eadalsjq-yjsvw-usfvq-ugslafy-ugflsafewfl-632[fsalu] +esyfwlau-usfvq-ugslafy-vwhdgqewfl-684[flsuw] +ktfitzbgz-fbebmtkr-zktwx-utldxm-wxlbzg-683[afwhg] +wihmogyl-aluxy-vohhs-uwkocmcncih-292[wzryd] +bkzrrhehdc-idkkxadzm-lzmzfdldms-677[oxwvn] +clxalrtyr-qwzhpc-lnbftdtetzy-249[zryvn] +rgllk-fab-eqodqf-vqxxknqmz-pqbxakyqzf-222[qfkxa] +xjinphzm-bmvyz-xviyt-mzxzdqdib-603[xnhfs] +htsxzrjw-lwfij-hmthtqfyj-wjfhvznxnynts-385[zreuy] +myvybpev-gokzyxsjon-oqq-nozvyiwoxd-692[iyzuj] +hcd-gsqfsh-pogysh-gvwddwbu-480[mysuk] +hcd-gsqfsh-foppwh-rsgwub-428[kvtfs] +frqvxphu-judgh-exqqb-uhvhdufk-621[wtgmn] +vhglnfxk-zktwx-vahvhetmx-vhgmtbgfxgm-345[hnamj] +tagzsrsjvgmk-usfvq-ugslafy-ugflsafewfl-892[yckbv] +joufsobujpobm-gmpxfs-vtfs-uftujoh-233[foujs] +zsxyfgqj-ojqqdgjfs-zxjw-yjxynsl-593[jqsxy] +bnknqetk-atmmx-qdzbpthrhshnm-131[ecnmt] +hmsdqmzshnmzk-dff-sqzhmhmf-859[dnxcz] +hqtyeqsjylu-tou-udwyduuhydw-348[uydhq] +ktiaaqnqml-kpwkwtibm-zmikycqaqbqwv-772[tlrsg] +nzydfxpc-rclop-mtzslklcozfd-mfyyj-nfdezxpc-dpcgtnp-951[cpdfz] +ckgvutofkj-hatte-gtgreyoy-644[tgeko] +iwcjapey-zua-paydjkhkcu-628[hntmg] +bnknqetk-okzrshb-fqzrr-trdq-sdrshmf-729[tuzoy] +qmpmxevc-kvehi-yrwxefpi-glsgspexi-wlmttmrk-828[hsyvf] +amjmpdsj-njyqrga-epyqq-qcptgacq-106[bhysd] +dwbcjkun-ljwmh-mnyuxhvnwc-641[wuyrz] +gspsvjyp-jpsaiv-hiwmkr-854[zthel] +gsrwyqiv-kvehi-gerhc-stivexmsrw-750[whgse] +xjgjmapg-wpiit-ozxcijgjbt-889[ytsop] +xgjougizobk-kmm-rghuxgzuxe-280[cwrty] +zovldbkfz-oxjmxdfkd-oxyyfq-ixyloxqlov-653[snkwb] +qczcftiz-qvcqczohs-gsfjwqsg-142[cqszf] +krxqjijamxdb-mhn-ldbcxvna-bnaerln-771[ravbt] +pybgmyargtc-bwc-bcqgel-860[bcgya] +wyvqljapsl-jovjvshal-shivyhavyf-773[vahjl] +pbafhzre-tenqr-onfxrg-bcrengvbaf-221[zyaro] +glrcplyrgmlyj-bwc-pcqcypaf-132[clpyg] +dpmpsgvm-dboez-dpbujoh-tfswjdft-545[bdmzf] +dkqjcbctfqwu-rncuvke-itcuu-cpcnauku-700[cuknq] +ajmrxjlcren-yujbcrl-pajbb-anbnjalq-459[yslvg] +oazegyqd-sdmpq-bxmefuo-sdmee-fqotzaxask-586[vfmnu] +ugdgjxmd-jsttal-ksdwk-632[hfjix] +aietsrmdih-gvcskirmg-tpewxmg-kveww-vigimzmrk-412[kfcim] +drxevkzt-jtrmvexvi-ylek-uvgcfpdvek-685[vekdr] +excdklvo-bkllsd-nozvyiwoxd-250[dlokv] +uwtojhynqj-hfsid-wjxjfwhm-281[fqsmx] +plolwdub-judgh-udeelw-uhfhlylqj-205[ludhe] +oqnidbshkd-dff-zmzkxrhr-729[cvlkx] +bknsykmdsfo-tovvilokx-bomosfsxq-328[boqly] +dpotvnfs-hsbef-qspkfdujmf-cvooz-tijqqjoh-961[zmnyi] +gspsvjyp-fyrrc-gsrxemrqirx-490[rsgpx] +gifavtkzcv-szfyrqriuflj-wcfnvi-uvmvcfgdvek-139[zadfj] +gsrwyqiv-kvehi-wgezirkiv-lyrx-wxsveki-490[alpzb] +ykhknbqh-ydkykhwpa-zalhkuiajp-862[khayp] +dmybmsuzs-yuxufmdk-sdmpq-bxmefuo-sdmee-fqotzaxask-586[nwikx] +nwzekwypera-bhksan-nayaerejc-940[xnmta] +wrs-vhfuhw-hjj-zrunvkrs-283[hrjsu] +ajyqqgdgcb-pyzzgr-amlryglkclr-782[lozts] +ohmnuvfy-jfumncw-alumm-womnigyl-mylpcwy-110[mqrgd] +foadouwbu-suu-obozmgwg-792[hgkuj] +wdjcvuvmyjpn-ytz-yzkgjthzio-109[jyztv] +ucynmlgxcb-pyzzgr-qfgnngle-210[iftry] +ymszqfuo-omzpk-oamfuzs-pqhqxabyqzf-872[qzfmo] +clotzlnetgp-ojp-opawzjxpye-769[pnhtz] +mhi-lxvkxm-yehpxk-ftgtzxfxgm-657[etajx] +surmhfwloh-fkrfrodwh-uhfhlylqj-699[rkslj] +iruzfrtkzmv-tyftfcrkv-kirzezex-841[emztq] +bdavqofuxq-nmewqf-ogefayqd-eqdhuoq-352[jpmyv] +bdavqofuxq-otaoaxmfq-xasuefuoe-326[aofqu] +gpsxdprixkt-tvv-ldgzhwde-219[dgptv] +pbeebfvir-rtt-bcrengvbaf-897[enlaq] +jchipqat-gpqqxi-bpgztixcv-375[cnqyt] +glrcplyrgmlyj-qaytclecp-fslr-pcqcypaf-574[clpyr] +pejji-oqq-vyqscdsmc-640[qcjsd] +houngfgxjuay-yigbktmkx-natz-xkykgxin-774[mszcw] +ltpedcxots-jchipqat-gpqqxi-bpcpvtbtci-219[isgfv] +gifavtkzcv-tyftfcrkv-drerxvdvek-659[vbdyz] +vjpwncrl-mhn-orwjwlrwp-641[wrjln] +vjpwncrl-ouxfna-bcxajpn-511[ydzfw] +rzvkjiduzy-xviyt-xjvodib-adivixdib-187[idvxb] +tinnm-suu-twbobqwbu-272[datjf] +apuut-xviyt-vxlpdndodji-941[zrtso] +jxdkbqfz-zixppfcfba-mixpqfz-doxpp-jxohbqfkd-705[fpxbd] +zilqwikbqdm-lgm-kwvbiqvumvb-876[bqpme] +jyddc-wgezirkiv-lyrx-wxsveki-256[sjntv] +ahngzyzqcntr-qzaahs-zbpthrhshnm-963[fzvai] +ksodcbwnsr-qfmcusbwq-suu-qighcasf-gsfjwqs-350[wyezk] +atyzghrk-igtje-iugzotm-jkyomt-462[ksuli] +dwbcjkun-ajmrxjlcren-yujbcrl-pajbb-nwprwnnarwp-563[tjsqg] +aoubshwq-dzoghwq-ufogg-aofyshwbu-896[hwcmz] +apwmeclga-npmhcargjc-njyqrga-epyqq-rpyglgle-340[dgtsc] +apwmeclga-aylbw-amyrgle-dglylagle-210[iumzy] +ydjuhdqjyedqb-rkddo-sedjqydcudj-738[ycbmx] +iuxxuyobk-xgjougizobk-pkrrehkgt-sgtgmksktz-644[pzsmw] +bnmrtldq-fqzcd-bgnbnkzsd-vnqjrgno-521[nbdqg] +wfruflnsl-gzssd-wjhjnansl-177[wtmsg] +yhwooebeaz-ywjzu-klanwpekjo-680[eowaj] +pynffvsvrq-cynfgvp-tenff-ernpdhvfvgvba-663[vbduy] +zilqwikbqdm-ntwemz-uizsmbqvo-356[yhenq] +jvsvymbs-zjhclunly-obua-jvuahputlua-721[uajlv] +fhezusjybu-rqiauj-tufbeocudj-400[ecamb] +ftzgxmbv-wrx-xgzbgxxkbgz-293[xgbzf] +chnylhuncihuf-xsy-xypyfijgyhn-578[jigcy] +vhkkhlbox-pxtihgbsxw-cxeeruxtg-wxlbzg-111[hsuty] +foadouwbu-tzcksf-gozsg-246[ofgsu] +xzwrmkbqtm-moo-nqvivkqvo-434[moqvk] +gvaaz-cvooz-dpoubjonfou-415[mcnzb] +pbafhzre-tenqr-enoovg-grpuabybtl-169[bktjl] +uwtojhynqj-gzssd-ywfnsnsl-723[phguv] +dlhwvupglk-zjhclunly-obua-klwhyatlua-227[luahk] +vhkkhlbox-vhehkyne-vahvhetmx-ybgtgvbgz-215[hvbeg] +qlm-pbzobq-gbiivybxk-lmboxqflkp-809[blqik] +forwcoqhwjs-qvcqczohs-ghcfous-792[mtuqn] +eqpuwogt-itcfg-dwppa-fgrnqaogpv-570[gpafo] +lxuxaodu-bljenwpna-qdwc-jwjuhbrb-121[rbqfd] +ykhknbqh-xqjju-oanreyao-680[ahjkn] +ugfkmewj-yjsvw-hdsklau-yjskk-kzahhafy-918[kahjs] +gbc-frperg-fpniratre-uhag-fnyrf-897[dskta] +myxcewob-qbkno-lexxi-wkxkqowoxd-770[spdoc] +cqwdujys-fbqijys-whqii-huiuqhsx-998[uhebs] +ckgvutofkj-igtje-iugzotm-rghuxgzuxe-774[gutei] +excdklvo-lexxi-psxkxmsxq-302[ypsmx] +mbiyqoxsm-dyz-combod-mkxni-mykdsxq-zebmrkcsxq-692[fnhpz] +zlkprjbo-doxab-gbiivybxk-xkxivpfp-809[ydtxn] +wdjcvuvmyjpn-ezggtwzvi-hvmfzodib-603[vzdgi] +njmjubsz-hsbef-fhh-bobmztjt-649[mxkjw] +wsvsdkbi-qbkno-oqq-ecob-docdsxq-796[rglok] +htsxzrjw-lwfij-gfxpjy-fsfqdxnx-307[uyteb] +wpuvcdng-ejqeqncvg-yqtmujqr-882[svamn] +tagzsrsjvgmk-hdsklau-yjskk-ugflsafewfl-606[tysrn] +kwtwznct-akidmvomz-pcvb-zmamizkp-200[skpom] +dpmpsgvm-dboez-dpbujoh-fohjoffsjoh-311[fknst] +rnqnyfwd-lwfij-hmthtqfyj-xytwflj-567[gzkol] +zntargvp-pnaql-hfre-grfgvat-923[yijbm] +dzczkrip-xiruv-treup-tfrkzex-drerxvdvek-347[vrmsu] +ajyqqgdgcb-afmamjyrc-sqcp-rcqrgle-522[cqagr] +pelbtravp-ohaal-erprvivat-715[jnbmz] +irdgrxzex-sleep-ivrthlzjzkzfe-113[bmsnw] +eqpuwogt-itcfg-tcddkv-fgxgnqrogpv-804[gtcdf] +cvabijtm-moo-ivitgaqa-226[darfu] +ytu-xjhwjy-xhfajsljw-mzsy-zxjw-yjxynsl-281[wzjeb] +fkqbokxqflkxi-yxphbq-obxznrfpfqflk-809[dcasb] +gokzyxsjon-sxdobxkdsyxkv-mkxni-ecob-docdsxq-276[zypso] +ibghopzs-suu-kcfygvcd-402[cgsub] +tfiifjzmv-srjbvk-uvjzxe-581[sovtj] +gntmfefwitzx-gfxpjy-xmnuunsl-619[fnxgm] +lgh-kwujwl-bwddqtwsf-vwhsjlewfl-788[tlejf] +hjgbwuladw-wyy-ghwjslagfk-164[wgahj] +nzwzcqfw-ojp-qtylyntyr-431[ynqtw] +sbejpbdujwf-sbccju-vtfs-uftujoh-909[kujit] +vhkkhlbox-wrx-ftkdxmbgz-241[uwzex] +lahxpnwrl-bljenwpna-qdwc-cajrwrwp-381[yjzno] +lugjuacha-jfumncw-alumm-jolwbumcha-838[uamcj] +gvcskirmg-glsgspexi-jmrergmrk-828[smeyi] +thnulapj-ihzrla-thyrlapun-955[ahlnp] +sno-rdbqds-bzmcx-btrsnldq-rdquhbd-937[dbqrs] +vdzonmhydc-eknvdq-dmfhmddqhmf-781[dmhfn] +iehepwnu-cnwza-xqjju-ykjpwejiajp-368[jepwa] +dfcxsqhwzs-dzoghwq-ufogg-cdsfohwcbg-974[gcdfh] +sbqiiyvyut-tou-jhqydydw-608[okbzs] +htsxzrjw-lwfij-gzssd-uzwhmfxnsl-801[nmtjq] +hvbizodx-rzvkjiduzy-xviyt-yzqzgjkhzio-213[zivyd] +ajmrxjlcren-ljwmh-lxjcrwp-bqryyrwp-745[kheat] +vkppo-shoewudys-tou-udwyduuhydw-556[udowy] +dpotvnfs-hsbef-dmbttjgjfe-gmpxfs-nbslfujoh-363[qapli] +glrcplyrgmlyj-djmucp-qrmpyec-158[clmpr] +emixwvqhml-xtiabqk-oziaa-wxmzibqwva-642[rkpba] +qczcftiz-dzoghwq-ufogg-aofyshwbu-298[lmcuy] +cvabijtm-zilqwikbqdm-akidmvomz-pcvb-nqvivkqvo-746[ynxzo] +pkl-oaynap-acc-wjwhuoeo-134[jxlai] +xjmmjndqz-kgvnodx-bmvnn-rjmfncjk-291[njmdk] +ejpanjwpekjwh-nwxxep-nayaerejc-550[lisvd] +htwwtxnaj-htsxzrjw-lwfij-hfsid-htfynsl-wjfhvznxnynts-541[hntwf] +mbiyqoxsm-mkxni-mykdsxq-crszzsxq-770[zhowm] +rmn-qcapcr-ucynmlgxcb-cee-pcqcypaf-886[cpaem] +rtqlgevkng-ejqeqncvg-fgxgnqrogpv-466[zktns] +fydelmwp-mfyyj-nfdezxpc-dpcgtnp-769[anfej] +yuxufmdk-sdmpq-otaoaxmfq-pqbxakyqzf-742[ohxti] +vxupkizork-igtje-xkgiwaoyozout-592[bmwjf] +veqtekmrk-tvsnigxmpi-gerhc-gsexmrk-gywxsqiv-wivzmgi-802[dglps] +nsyjwsfyntsfq-uqfxynh-lwfxx-ijuqtdrjsy-931[ymnhu] +gifavtkzcv-avccpsvre-fgvirkzfej-841[ypigz] +krxqjijamxdb-kdwwh-mnyjacvnwc-641[krnma] +dszphfojd-ezf-sftfbsdi-805[fdszb] +xmrrq-tmffq-lwuzfgdgyq-372[fqgmr] +tagzsrsjvgmk-xdgowj-vwhsjlewfl-788[gjswl] +lsyrkjkbnyec-mkxni-nofovyzwoxd-614[knoyx] +dwbcjkun-mhn-bjunb-173[mykra] +vhehkyne-vtgwr-nlxk-mxlmbgz-319[eghkl] +bkzrrhehdc-bnqqnrhud-bzmcx-bnzshmf-otqbgzrhmf-677[xaszn] +oxmeeuruqp-bxmefuo-sdmee-abqdmfuaze-248[udtec] +jlidywncfy-mwupyhayl-bohn-uhufsmcm-500[yhmuc] +xjmmjndqz-zbb-mzvxlpdndodji-239[djmzb] +yuxufmdk-sdmpq-omzpk-qzsuzqqduzs-534[ofrpg] +tfejldvi-xiruv-vxx-uvgrikdvek-659[cnesm] +yaxsnlcrun-ajkkrc-anbnjalq-979[nmivs] +tvsnigxmpi-ikk-wivzmgiw-880[agunv] +mrxivrexmsrep-tpewxmg-kveww-viwievgl-698[evwim] +nglmtuex-yehpxk-labiibgz-241[begil] +zuv-ykixkz-ixeumktoi-igtje-iugzotm-aykx-zkyzotm-670[pjybl] +forwcoqhwjs-dzoghwq-ufogg-difqvogwbu-272[xkwoz] +ajyqqgdgcb-qaytclecp-fslr-bcqgel-886[mkvsi] +myxcewob-qbkno-mkxni-mykdsxq-wkbuodsxq-770[zmijb] +uwtojhynqj-kqtbjw-yjhmstqtld-333[jtqhw] +wsvsdkbi-qbkno-lkcuod-dbksxsxq-406[biaoe] +gpbepvxcv-rpcsn-rdpixcv-advxhixrh-895[dcwgp] +muqfedyput-isqludwuh-xkdj-mehaixef-712[betdq] +ckgvutofkj-inuiurgzk-xkgiwaoyozout-956[sazyo] +wfruflnsl-uqfxynh-lwfxx-btwpxmtu-541[fxluw] +qfmcusbwq-rms-igsf-hsghwbu-246[sbfgh] +ynukcajey-nwxxep-qoan-paopejc-602[htmbv] +ujqgywfau-uzgugdslw-jwkwsjuz-138[newms] +yflexwxoalrp-zxkav-cfkxkzfkd-705[ctnsy] +vjpwncrl-lqxlxujcn-mnyuxhvnwc-953[nawmz] +willimcpy-wuhxs-lyuwkocmcncih-786[cilwh] +mtzslklcozfd-clmmte-cpnptgtyr-119[tjkgv] +xlrypetn-awldetn-rcldd-cplnbftdtetzy-795[tdlen] +vkppo-rqiauj-huqsgkyiyjyed-452[yijkp] +vxupkizork-lruckx-jkbkruvsktz-124[eumyz] +diozmivodjivg-agjrzm-nzmqdxzn-915[otpfl] +owshgfarwv-hdsklau-yjskk-klgjsyw-918[qcjim] +zuv-ykixkz-igtje-iugzotm-zkinturume-202[plvqf] +zlilocri-oxyyfq-bkdfkbbofkd-835[bswmn] +ziuxioqvo-lgm-amzdqkma-798[maioq] +xqvwdeoh-sodvwlf-judvv-ghyhorsphqw-517[hvdow] +ovbunmneqbhf-enqvbnpgvir-onfxrg-qrfvta-507[nvbfq] +gbc-frperg-pnaql-genvavat-351[pmzkq] +eadalsjq-yjsvw-jsttal-suimakalagf-580[zjghy] +rdadguja-rpcsn-rdpixcv-apqdgpidgn-245[dpagr] +tbxmlkfwba-pzxsbkdbo-erkq-abpfdk-523[vifrq] +ocipgvke-uecxgpigt-jwpv-ugtxkegu-544[abfsh] +ovbunmneqbhf-zvyvgnel-tenqr-wryylorna-ybtvfgvpf-481[hxymg] +pinovwgz-xjinphzm-bmvyz-agjrzm-ozxcijgjbt-681[cqlnu] +tinnm-qobrm-ghcfous-220[hyczt] +iuruxlar-yigbktmkx-natz-ykxboiky-748[kixya] +bkzrrhehdc-bzmcx-bnzshmf-cdrhfm-209[hbcmr] +gpsxdprixkt-tvv-uxcpcrxcv-973[xcpvr] +forwcoqhwjs-rms-hfowbwbu-974[stzrm] +zovldbkfz-fkqbokxqflkxi-mixpqfz-doxpp-cfkxkzfkd-705[tsmfo] +vetllbybxw-lvtoxgzxk-angm-ftgtzxfxgm-371[sbemy] +hwbba-ejqeqncvg-tgugctej-232[iyrqv] +vqr-ugetgv-lgnnadgcp-wugt-vguvkpi-596[gvunp] +xgvnndadzy-wpiit-yzndbi-343[rawyd] +jxdkbqfz-oxyyfq-qbzeklildv-107[qbdfk] +wlsiayhcw-luvvcn-mufym-656[jbvne] +surmhfwloh-fdqgb-ghvljq-621[ymnve] +mvkccspson-bkllsd-vklybkdybi-432[yscux] +dszphfojd-sbccju-dvtupnfs-tfswjdf-129[itbfs] +lsyrkjkbnyec-lexxi-crszzsxq-978[sxcek] +qlm-pbzobq-mixpqfz-doxpp-zlkqxfkjbkq-211[satyb] +bknsykmdsfo-nio-kmaescsdsyx-744[tspif] +bpvctixr-rpcsn-rjhidbtg-htgkxrt-713[rtbcg] +sebehvkb-rqiauj-udwyduuhydw-140[udbeh] +zhdsrqlchg-fdqgb-hqjlqhhulqj-387[zptrs] +qxdwpopgsdjh-rpcsn-sthxvc-635[nbixj] +pualyuhapvuhs-msvdly-klzpnu-721[ulpah] +sbqiiyvyut-shoewudys-isqludwuh-xkdj-jhqydydw-894[dysuh] +wsvsdkbi-qbkno-lexxi-dbksxsxq-614[onzwh] +ydjuhdqjyedqb-rqiauj-efuhqjyedi-894[ocdpe] +kwzzwaqdm-ntwemz-wxmzibqwva-434[nwzml] +qspkfdujmf-fhh-nbobhfnfou-571[zpyau] +bxaxipgn-vgpst-tvv-detgpixdch-583[xwiac] +qfmcusbwq-dfcxsqhwzs-xszzmpsob-fsqswjwbu-402[lstrx] +dpmpsgvm-dboez-sfdfjwjoh-337[dfjmo] +dzoghwq-ufogg-fsgsofqv-636[gfoqs] +nzwzcqfw-dnlgpyrpc-sfye-qtylyntyr-509[milhd] +xgsvgmotm-pkrrehkgt-vaxingyotm-176[jubcm] +xgsvgmotm-jek-cuxqynuv-644[soxwn] +cxy-bnlanc-lahxpnwrl-kdwwh-fxatbqxy-485[zamhj] +irgyyolokj-inuiurgzk-sgtgmksktz-982[vzkrq] +xgvnndadzy-xcjxjgvoz-xjiovdihzio-733[ozhyu] +gvcskirmg-nippcfier-xiglrspskc-334[bastq] +zlilocri-gbiivybxk-obxznrfpfqflk-367[ntyda] +pyknyegle-pyzzgr-pcqcypaf-886[nxvzy] +zhdsrqlchg-gbh-frqwdlqphqw-361[nqzts] +kyelcrga-cee-yaosgqgrgml-808[izdqr] +hplazytkpo-prr-cpnptgtyr-379[prtya] diff --git a/examples/golang/2016/04/puzzle.yaml b/examples/golang/2016/04/puzzle.yaml new file mode 100644 index 0000000..cecac7f --- /dev/null +++ b/examples/golang/2016/04/puzzle.yaml @@ -0,0 +1,26 @@ +--- +medatadata: + day: 4 + year: 2016 + title: Security Through Obscurity +puzzles: + - description: | + Finally, you come across an information kiosk with a list of rooms. Of course, the list is encrypted and full of decoy data, but the instructions to decode the list are barely hidden nearby. Better remove the decoy data first. + + Each room consists of an encrypted name (lowercase letters separated by dashes) followed by a dash, a sector ID, and a checksum in square brackets. + + A room is real (not a decoy) if the checksum is the five most common letters in the encrypted name, in order, with ties broken by alphabetization. For example: + + aaaaa-bbb-z-y-x-123[abxyz] is a real room because the most common letters are a (5), b (3), and then a tie between x, y, and z, which are listed alphabetically. + a-b-c-d-e-f-g-h-987[abcde] is a real room because although the letters are all tied (1 of each), the first five are listed alphabetically. + not-a-real-room-404[oarel] is a real room. + totally-real-room-200[decoy] is not. + + Of the real rooms from the list above, the sum of their sector IDs is 1514. + + What is the sum of the sector IDs of the real rooms? + answer: null + status: unsolved + - description: null + status: unreachable + answer: null diff --git a/examples/golang/2016/04/puzzle_solver.go b/examples/golang/2016/04/puzzle_solver.go new file mode 100644 index 0000000..de65c1a --- /dev/null +++ b/examples/golang/2016/04/puzzle_solver.go @@ -0,0 +1,13 @@ +package day4 + +func solvePart1(input []string) (string, error) { + return "part1", nil +} + +func solvePart2(input []string) (string, error) { + return "part2", nil +} + +func normalizeInput(input string) []string { + return []string{} +} diff --git a/examples/golang/2016/go.mod b/examples/golang/2016/go.mod index 5064056..3323365 100644 --- a/examples/golang/2016/go.mod +++ b/examples/golang/2016/go.mod @@ -10,6 +10,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/net v0.13.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/examples/golang/2016/go.sum b/examples/golang/2016/go.sum index fa4b6e6..d44c510 100644 --- a/examples/golang/2016/go.sum +++ b/examples/golang/2016/go.sum @@ -4,6 +4,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb 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= +golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= 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= diff --git a/examples/golang/2016/main.go b/examples/golang/2016/main.go index c6de77f..8ccc970 100644 --- a/examples/golang/2016/main.go +++ b/examples/golang/2016/main.go @@ -1,55 +1,13 @@ package main import ( - "os" - "fmt" - - day_1 "github.com/dolfolife/aoctl/examples/golang/2016/01" - day_2 "github.com/dolfolife/aoctl/examples/golang/2016/02" - day_3 "github.com/dolfolife/aoctl/examples/golang/2016/03" + day1 "github.com/dolfolife/aoctl/examples/golang/2016/01" + day2 "github.com/dolfolife/aoctl/examples/golang/2016/02" + day3 "github.com/dolfolife/aoctl/examples/golang/2016/03" ) -func RunDay1() { - input, err := os.ReadFile("./01/input.txt") - if err != nil { - os.Exit(1) - } - - // We need to delete the last rune of the input since it is a newline - answers := day_1.Solve(string(input[:len(input)-1])) - - fmt.Printf("Part 1: %s\n", answers.Part1) - fmt.Printf("Part 2: %s\n", answers.Part2) -} - -func RunDay2() { - input, err := os.ReadFile("./02/input.txt") - if err != nil { - os.Exit(1) - } - - // We need to delete the last rune of the input since it is a newline - answers := day_2.Solve(string(input[:len(input)-1])) - - fmt.Printf("Part 1: %s\n", answers.Part1) - fmt.Printf("Part 2: %s\n", answers.Part2) -} - -func RunDay3() { - input, err := os.ReadFile("./03/input.txt") - if err != nil { - os.Exit(1) - } - - // We need to delete the last rune of the input since it is a newline - answers := day_3.Solve(string(input[:len(input)-1])) - - fmt.Printf("Part 1: %s\n", answers.Part1) - fmt.Printf("Part 2: %s\n", answers.Part2) -} - func main() { - RunDay1() - RunDay2() - RunDay3() + day1.Solve() + day2.Solve() + day3.Solve() } diff --git a/go.mod b/go.mod index e6f9bfb..9b7a47d 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/stretchr/testify v1.8.4 go.hein.dev/go-version v0.1.0 golang.org/x/net v0.13.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -15,6 +16,5 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect gopkg.in/yaml.v2 v2.2.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect sigs.k8s.io/yaml v1.1.0 // indirect ) diff --git a/pkg/aoc/aoc.go b/pkg/aoc/aoc.go index c6543ce..907e25f 100644 --- a/pkg/aoc/aoc.go +++ b/pkg/aoc/aoc.go @@ -1,16 +1,22 @@ package aoc import ( - "log" - "os" - "path/filepath" - "net/url" + "log" + "net/url" + "os" + "path/filepath" + "github.com/dolfolife/aoctl/pkg/puzzle" ) -type Puzzle struct { - Puzzle1 func(string) string - Puzzle2 func(string) string +type AoCConfig struct { + ProjectPath string +} + +func GetAoCConfig() AoCConfig { + return AoCConfig{ + ProjectPath: os.Getenv("PWD"), + } } func InitializeProject(path string) error { @@ -73,14 +79,26 @@ session= } -func GetPuzzles(day string, year string, cookie string) []string { - url, err := url.JoinPath("https://adventofcode.com/", year, "/day/", day) +func GetPuzzles(day string, year string, cookie string) []puzzle.Puzzle { + puzzleURL, err := url.JoinPath("https://adventofcode.com/", year, "/day/", day) if err != nil { log.Fatalf("Error creating url: %s", err) } - body := getBodyFromUrl(url, cookie) + body := getBodyFromUrl(puzzleURL, cookie) + + inputURL, err := url.JoinPath(puzzleURL, "/input") + + if err != nil { + log.Fatalf("Error creating url: %s", err) + } + + rawInput := getBodyFromUrl(inputURL, cookie) - return getPuzzleParts(body) + response, err := ParsePuzzles(day, year, body, rawInput) + if err != nil { + log.Fatalf("Error parsing puzzles: %s", err) + } + return response } diff --git a/pkg/aoc/html_utils.go b/pkg/aoc/html_utils.go index b4ff61f..0204b28 100644 --- a/pkg/aoc/html_utils.go +++ b/pkg/aoc/html_utils.go @@ -1,37 +1,38 @@ package aoc import ( - "bytes" - "log" - "strings" + "bytes" + "log" + "strings" - "golang.org/x/net/html" + "github.com/dolfolife/aoctl/pkg/puzzle" + "golang.org/x/net/html" ) -func getPuzzleParts(body []byte) []string { - node, err := html.Parse(bytes.NewReader(body)) +func ParsePuzzles(day string, year string, responseBody []byte, input []byte) ([]puzzle.Puzzle, error) { + node, err := html.Parse(bytes.NewReader(responseBody)) if err != nil { log.Fatalf("Error parsing the body: %s", err) } - puzzlePartsHTMLNodes := findRootNodesPuzzlePart(node) + puzzlePartsHTMLNodes := findRootNodesPuzzle(node) - var parts []string + var parts []puzzle.Puzzle for _, node := range puzzlePartsHTMLNodes { - parts = append(parts, parsePuzzleHTML(node)) + parts = append(parts, puzzle.NewPuzzleFromHTML(day, year, parsePuzzleHTML(node), input)) } - return parts + return parts, nil } -func findRootNodesPuzzlePart(node *html.Node) []*html.Node { +func findRootNodesPuzzle(node *html.Node) []*html.Node { var nodes []*html.Node for child := node.FirstChild; child != nil; child = child.NextSibling { if child.Type == html.ElementNode && child.Data == "article" && hasAttr(child.Attr, "day-desc") { nodes = append(nodes, child) } - nodes = append(nodes, findRootNodesPuzzlePart(child)...) + nodes = append(nodes, findRootNodesPuzzle(child)...) } return nodes diff --git a/pkg/puzzle/puzzle.go b/pkg/puzzle/puzzle.go index 3849c5c..004b49d 100644 --- a/pkg/puzzle/puzzle.go +++ b/pkg/puzzle/puzzle.go @@ -1,49 +1,83 @@ package puzzle -import ( - "fmt" +import( + "gopkg.in/yaml.v3" + "log" + "os" ) -type Puzzle[T any] struct { - part1 func(T) (string, error) - part2 func(T) (string, error) - normalizeInput func(string) T +type PuzzleStatus string + +const ( + Unsolved PuzzleStatus = "UNSOLVED" + Solved PuzzleStatus = "SOLVED" + Unreachable PuzzleStatus = "UNREACHABLE" +) + +type PuzzleMetadata struct { + Day string `yaml:"day,omitempty"` + Title string `yaml:"title,omitempty"` + Year string `yaml:"year,omitempty"` } -func (p Puzzle[T]) SolvePart(part int,input string) string { - var result string - var err error +type PuzzlePart struct { + Answer string `yaml:"answer,omitempty"` + Description string `yaml:"description,omitempty"` + Status PuzzleStatus `yaml:"status,omitempty"` + + RawInput []byte +} + +type Puzzle struct { + Metadata PuzzleMetadata `yaml:"metadata"` + Puzzles []PuzzlePart `yaml:"puzzles"` +} - if part == 1 { - result, err = p.part1(p.normalizeInput(input)) - } else { - result, err = p.part2(p.normalizeInput(input)) +func NewPuzzleFromHTML(day string, year string, htmlString string, input []byte) Puzzle { + return Puzzle{ + Metadata: PuzzleMetadata{ + Day: day, + Year: year, + Title: getTitleFromBody(htmlString), + }, + Puzzles: []PuzzlePart{}, } +} +func NewPuzzleFromCache(filepath string, inputFilepath []string) Puzzle { + var puzzle Puzzle + yamlFile, err := os.ReadFile(filepath) if err != nil { - fmt.Printf("there was an error on part %d: %s \n", part, err) - fmt.Printf("...skipping part %d...\n", part) - return "" + log.Printf("Error trying to read the YAML file err = #%v ", err) } - - return result + err = yaml.Unmarshal(yamlFile, &puzzle) + if err != nil { + log.Fatalf("Unmarshal: %v", err) + } + + for i, inputFile := range inputFilepath { + rawInput, err := os.ReadFile(inputFile) + if err != nil { + log.Printf("Error trying to read the input for Puzzle Part %d err #%v ", i, err) + } + // we need to delete the last byte of the input because it is a newline or EOF + rawInput = rawInput[:len(rawInput)-1] + puzzle.Puzzles[i].RawInput = rawInput + } + return puzzle } -func (p Puzzle[T]) NormalizeInput(input string) T { - return p.normalizeInput(input) +func getTitleFromBody(body string) string { + return "Title of the Puzzle Part" } -func NewPuzzleSolver[T any](name string, normalizeInput func(string) T, part1 func(T) (string, error), part2 func(T) (string, error)) Puzzle[T] { - return Puzzle[T] { - part1: part1, - part2: part2, - normalizeInput: normalizeInput, - } +type PuzzleSolver[T any] struct { + Puzzle Puzzle + NormalizeInput func(string) T + Solve func() Response } -type PuzzleSolution[T any] struct { - Part1 string - Part2 string - +type Response struct { + Value string Error error } diff --git a/pkg/puzzle/puzzle_part.go b/pkg/puzzle/puzzle_part.go new file mode 100644 index 0000000..07c8813 --- /dev/null +++ b/pkg/puzzle/puzzle_part.go @@ -0,0 +1,3 @@ +package puzzle + +