-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday2.cpp
155 lines (121 loc) · 4.8 KB
/
day2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
--- 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 78293.
The first half of this puzzle is complete! It provides one gold star: *
--- 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?
*/
#include <cassert>
#include <complex>
#include <iostream>
#include <vector>
#include "main.h"
const std::vector<std::vector<char>> keypad1{{
{ 0 , 0 , 0 , 0 , 0 },
{ 0 , '1', '2', '3', 0 },
{ 0 , '4', '5', '6', 0 },
{ 0 , '7', '8', '9', 0 },
{ 0 , 0 , 0 , 0 , 0 },
}};
const std::complex<int> keypad1Start( 2, 2 );
const std::vector<std::vector<char>> keypad2{{
{ 0 , 0 , 0 , 0 , 0 , 0, 0 },
{ 0 , 0 , 0 , '1', 0 , 0 , 0 },
{ 0 , 0 , '2', '3', '4', 0 , 0 },
{ 0 , '5', '6', '7', '8', '9', 0 },
{ 0 , 0 , 'A', 'B', 'C', 0 , 0 },
{ 0 , 0 , 0 , 'D', 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 , 0, 0 },
}};
const std::complex<int> keypad2Start( 1, 3 );
constexpr std::complex<int> moveU { 0, -1 };
constexpr std::complex<int> moveD { 0, 1 };
constexpr std::complex<int> moveL { -1, 0 };
constexpr std::complex<int> moveR { 1, 0 };
void unlock( std::istream& is, std::ostream& os,
const std::vector<std::vector<char>>& keypad,
const std::complex<int> start ) {
std::complex<int> current( start );
std::string line;
while( getline( is, line ) ) {
for ( char c : line ) {
std::complex<int> next( current );
switch ( c ) {
case 'U': next += moveU; break;
case 'D': next += moveD; break;
case 'L': next += moveL; break;
case 'R': next += moveR; break;
default: assert( "invalid input" );
}
if ( keypad[next.imag()][next.real()] ) {
current = next;
}
}
os << keypad[current.imag()][current.real()];
}
os << "\n";
}
int mainfunc( std::istream& is, std::ostream& os, Part part ) {
if ( part == Part::PART1 ) {
unlock( is, os, keypad1, keypad1Start );
} else {
unlock( is, os, keypad2, keypad2Start );
}
return 0;
}