diff --git a/.gitignore b/.gitignore index d3beee5..1e6192a 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ _testmain.go *.test *.prof +othertests diff --git a/day02/day02 b/day02/day02 new file mode 100755 index 0000000..bb842a9 Binary files /dev/null and b/day02/day02 differ diff --git a/day02/input b/day02/input new file mode 100644 index 0000000..fc78349 --- /dev/null +++ b/day02/input @@ -0,0 +1,5 @@ +DULUDRDDDRLUDURUUULRRRURDRDULRUDDUDRULUDDUDRLDULRRLRDRUDUUULUUDLRURDUDDDDRDLLLLULRDLDRDLRLULRUURDDUULUDLRURRDDRDDRDDLDRDLLUURDRUULRRURURRDLRLLLUDULULULULUDRLLRUDUURLDRLRLRDRRDRLLLDURRDULDURDDRLURRDURLRRRLDLLLDRUUURLRDLDLLLLRDURRLDLULRLDDLDLURLRRDDRUDDUULRURRUDLRDLDUURDDDDRLRURUDULUDLRRLLLLLRDRURLLDLDULUUDLUDDDRLLDRRUDLLURRUUDDRRLLRRLDDDURLDRDRLURRRRDRRRDDUDULULDURRUUURRRDULUUUDDRULDRLLRDLDURLURRLLRUUUULRDURLLDDRLLDLRLRULUUDRURUDLLURUDDRDURLRDRRRDURLDDRDRLRLLURULUUULUDDDULDLRDDDRDLLRRLDRDULLUUUDLDDLDDDLLLLLLLDUDURURDURDRUURRRDDRDUDLULDURDUDURDDDRULDURURURRLURLURLUURLULDLLRUULURDDRLRDDLRDLRRR +LUURLRUDRRUDLLDLUDDURULURLUUDUUDDRLUULRDUDDUULDUUDRURDDRRDRLULLRDRDLRLLUURRUULRLDRULUDLDUUDDDRDDLRDLULDRLDUULDLRDLLLDLDLRDUULUDURRULLRLDUDRLLLULUUUULUUDUUURRRDULLUURUDRRLDURRUULDRDULDUDRDUUULUUDDRLUDRLDLDRUUURDLDUDRUDUURLLRRLRLLRRLDULDDULUDUUURULDDUDUDRURRDLULRUDDURDLDLLRRRLDRLULLLRUULDUDLUUDURRLLLRLUDURRDDLDRDDDLURDLDRRUDUDLUDULULRUUUDLUURLLRLDDLURULDURDLRRDDDDURLDDLLDDULLLRLDLDULDUUDDRLDUURDDLDLUUDULRRLRLUURURUURLRLURUURLDRUURLLRDDUUUDULUDDDRDRLDRDRRLRLDULLRRUDLURULULRDRURURLULDUDLRURLRDDRULDDLRD +LUDRULUULRRDDDDRRDUURUDDRLDDLDRDURRURULRDLDLDUUDRRDUUDUDLLLRRLDUDDRLDDLRRLRDRLUDLULUDDUUDULDUUULUDLDDURLDURUDLDRUUDRLRRLDLDDULDUUDDLDDLLURDRLRUURDDRUDDUDLDRRLRUDRUULRRRLRULULURDLRRURDRLRULDDDRDUULLURUUUURUDDLRRRRRDURLULDLUULUDRRUDUDRRDDRURDURLRLUDDLDLRRULUDLDDRLDDLDDDLLLLRDLLUULDDLULDLDRDDUDLURUDLDLDDRRUUDDDLRLLLDRRDDDUURDUDURUURRDRLLDUDLDUULLDLDLLUULLRRULDLDRURLDULDRUURDURRURDLRDLLLDRRUDRUUDRURLUDDRURLDURRDLUUDLUUDULLLDDDDRRDLLLDLURULDDRDLUUURRDRRUUDDUL +DUUULDUDDDURLLULDDLLUDURLLLURULULURUURDRURLRULLLLDRDDULRRDRRLLLRDDDUULLRRURRULLDDURRRLRDDLULDULLDUDLURRDLDDLURDLRLLDRURLLRLLRRRDRRRURURUUDDLLDDLDDDLRLURUUUULRDLUDDDURLLDDRLDRRLLUDUUULRLLDRRRLRUUDLDUULRLUDRULLLLDUDLLUUDDRUURLURUDRDDDLRURUDRLULLULUUDLDURDULRRDRLDURUULRDRRRDRDRRLRLRDDUULLRDLDURDDDULURRLULDDURDURDDUDURDLLUUULUDULRDDLDRDRUDLLUURDLRDURURULURULLDRLLRRULDLULULDLULRURLRRLUDLLLRLUDLURLULDULDRLLLDLDDDDRDRLRRLRDULUUDULDDLDURDLLLDDDDLLUURRDURLDLUDDLULRUUUDDRRLDLLLRDLLDRRRDDLULLURDDRRRRLDLRLLLRL +LULLRRDURRLDUUDRRURLURURRRLRDRUULUULURLLURRDRULRDURDDDDUULLLLDUULDLULURDRLDLULULDRLLDLLRLRULURUDRUUDULRULLLUDRULUDRLLUDLDRRDRUUURURLRDURDRLRDDDURLURRDLRUUUDUURULULDLUULRDLRRRDRDRLLLDLRRDRLLDDULDRUDRRLULLRDLDUDDULRDDLULRURULRLLLULDLLLLRDLDRURUDUURURLDRLUULLDUDULUDDDULUDLRUDDUDLULLUULUUURULURRULRDDURDDLURLRRDRDLDULRLRDRRRULRDDDRLLDDDDRRRRDRDLULUURDURULDLRDULDUDLDURUDLUDLUDDDUDURDURDDURLLRUDUURRRUDRRRRULLLLDDDLUULLUULRRRULDLURDLULRULDRLR diff --git a/day02/main.go b/day02/main.go new file mode 100644 index 0000000..dd71eac --- /dev/null +++ b/day02/main.go @@ -0,0 +1,111 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +func main() { + input := stdinToStringSlice() + var press []rune + keypad := initKeypad("diamond") + pos := '5' + for _, i := range input { + for _, j := range i { + pos = moveFinger(j, pos, keypad) + } + press = append(press, pos) + } + fmt.Println("Code: ", string(press)) +} + +func moveFinger(dir rune, start rune, keypad map[string]rune) rune { + // Find the starting button + var startX, startY int + for k, v := range keypad { + if v == start { + // Found it + strCoords := strings.Split(k, ";") + startY = atoi(strCoords[0]) + startX = atoi(strCoords[1]) + } + } + switch dir { + case 'U': + newY := startY - 1 + if keypad[itoa(newY)+";"+itoa(startX)] != 0 { + return keypad[itoa(newY)+";"+itoa(startX)] + } + case 'R': + newX := startX + 1 + if keypad[itoa(startY)+";"+itoa(newX)] != 0 { + return keypad[itoa(startY)+";"+itoa(newX)] + } + case 'D': + newY := startY + 1 + if keypad[itoa(newY)+";"+itoa(startX)] != 0 { + return keypad[itoa(newY)+";"+itoa(startX)] + } + case 'L': + newX := startX - 1 + if keypad[itoa(startY)+";"+itoa(newX)] != 0 { + return keypad[itoa(startY)+";"+itoa(newX)] + } + } + return start +} + +func initKeypad(tp string) map[string]rune { + ret := make(map[string]rune) + switch tp { + case "diamond": + ret["0;2"] = '1' + ret["1;1"] = '2' + ret["1;2"] = '3' + ret["1;3"] = '4' + ret["2;0"] = '5' + ret["2;1"] = '6' + ret["2;2"] = '7' + ret["2;3"] = '8' + ret["2;4"] = '9' + ret["3;1"] = 'A' + ret["3;2"] = 'B' + ret["3;3"] = 'C' + ret["4;2"] = 'D' + case "square": + currKey := 1 + for i := 0; i < 3; i++ { + for j := 0; j < 3; j++ { + ret[itoa(i)+";"+itoa(j)] = rune(currKey) + currKey++ + } + } + } + return ret +} + +func itoa(i int) string { + return strconv.Itoa(i) +} + +func atoi(i string) int { + var ret int + var err error + if ret, err = strconv.Atoi(i); err != nil { + log.Fatal("Invalid Atoi") + } + return ret +} + +func stdinToStringSlice() []string { + var input []string + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + input = append(input, scanner.Text()) + } + return input +} diff --git a/day02/problem b/day02/problem new file mode 100644 index 0000000..de1d487 --- /dev/null +++ b/day02/problem @@ -0,0 +1,113 @@ + Advent of Code + + • [About] + • [AoC++] + • [Events] + • [Settings] + • [Log Out] + + br0xen (AoC++) 4* + +    2016 + + • [Calendar] + • [Leaderboard] + • [Stats] + • [Sponsors] + +--- Day 2: Bathroom Security --- + + 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? + + Your puzzle answer was 98575. + +--- Part Two --- + + 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? + + Your puzzle answer was CD8D4. + + Both parts of this puzzle are complete! They provide two gold stars: ** + + At this point, you should return to your advent calendar and try another puzzle. + + If you still want to see it, you can get your puzzle input. + + You can also [Shareon Twitter Google+ Reddit] this puzzle. + +References + + Visible links + . http://adventofcode.com/ + . http://adventofcode.com/2016/about + . http://adventofcode.com/2016/support + . http://adventofcode.com/2016/events + . http://adventofcode.com/2016/settings + . http://adventofcode.com/2016/auth/logout + . http://adventofcode.com/2016 + . http://adventofcode.com/2016 + . http://adventofcode.com/2016/leaderboard + . http://adventofcode.com/2016/stats + . http://adventofcode.com/2016/sponsors + . http://adventofcode.com/2016/sponsors + . http://adventofcode.com/2016 + . http://adventofcode.com/2016/day/2/input + . https://twitter.com/intent/tweet?text=I%27ve+completed+%22Bathroom+Security%22+%2D+Day+2+%2D+Advent+of+Code+2016&url=http%3A%2F%2Fadventofcode%2Ecom%2F2016%2Fday%2F2&related=ericwastl&hashtags=AdventOfCode + . https://plus.google.com/share?url=http%3A%2F%2Fadventofcode%2Ecom%2F2016%2Fday%2F2 + . http://www.reddit.com/submit?url=http%3A%2F%2Fadventofcode%2Ecom%2F2016%2Fday%2F2&title=I%27ve+completed+%22Bathroom+Security%22+%2D+Day+2+%2D+Advent+of+Code+2016