- commit
- 0059a0cdb37790a7ada1ca72fa8c81e314f32966
- parent
- 4ee99ef41cc784c0a73d2ac997e5871e2b6dd84d
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2022-12-22 13:42
wip
Diffstat
| M | 2022/22/solution.rs | 194 | +++++++++++++++++-------------------------------------------- |
1 files changed, 52 insertions, 142 deletions
diff --git a/2022/22/solution.rs b/2022/22/solution.rs
@@ -108,140 +108,50 @@ fn part1(map: &Vec<Vec<Tile>>, path: &Vec<(usize, bool)>) -> usize {
108 108 return 1000 * (y + 1) + 4 * (x + 1) + dir;
109 109 }
110 110
111 -1 fn wrap2(x: usize, y: usize, dir: usize) -> (usize, usize, usize) {
112 -1 // hardcoded cube topology
-1 111 fn wrap2(map: &Vec<Vec<Tile>>, x0: usize, y0: usize, dir: usize) -> (usize, usize, usize) {
-1 112 println!("{},{}:{}", x0, y0, dir);
-1 113 return wrap(map, x0, y0, dir).unwrap();
-1 114 }
-1 115
-1 116 fn wrap(map: &Vec<Vec<Tile>>, x0: usize, y0: usize, dir: usize) -> Option<(usize, usize, usize)> {
113 117 let k = 50;
114 118
115 -1 let dx = x % k;
116 -1 let dy = y % k;
-1 119 for yk in 0..4 {
-1 120 let y = yk * k;
-1 121 let dy = yk as i8 - (y0 / k) as i8;
-1 122
-1 123 for xk in 0..4 {
-1 124 let x = xk * k;
-1 125 let dx = xk as i8 - (x0 / k) as i8;
-1 126
-1 127 if y < map.len() && x < map[y].len() && map[y][x] != Tile::Out {
-1 128 let dt = if dir == 0 && dx == 1 {
-1 129 Some((dy + 4) as usize)
-1 130 } else if dir == 1 && dy == 1 {
-1 131 Some((dx + 4) as usize)
-1 132 } else if dir == 2 && dx == -1 {
-1 133 Some((dy + 4) as usize)
-1 134 } else if dir == 3 && dy == -1 {
-1 135 Some((dx + 4) as usize)
-1 136 } else {
-1 137 None
-1 138 };
-1 139 match dt {
-1 140 Some(a) => {
-1 141 let dir2 = (dir + a) % 4;
-1 142 return Some(match dir2 {
-1 143 0 => (x
-1 144 });
-1 145 return Some((x, y, (dir + a) % 4));
-1 146 },
-1 147 _ => {},
-1 148 }
-1 149 }
-1 150 }
-1 151 }
-1 152 println!("");
117 153
118 -1 return match (x / k, y / k, dir) {
119 -1 // 1 -> 2
120 -1 (1, 0, 0) => (
121 -1 x + 1, y, dir
122 -1 ),
123 -1 // 1 -> 3
124 -1 (1, 0, 1) => (
125 -1 x, y + 1, dir
126 -1 ),
127 -1 // 1 -> 4
128 -1 (1, 0, 2) => (
129 -1 0 * k,
130 -1 2 * k + (k - 1) - dy,
131 -1 0,
132 -1 ),
133 -1 // 1 -> 6
134 -1 (1, 0, 3) => (
135 -1 0 * k,
136 -1 3 * k + dx,
137 -1 0,
138 -1 ),
139 -1 // 2 -> 5
140 -1 (2, 0, 0) => (
141 -1 1 * k + (k - 1),
142 -1 2 * k + (k - 1) - dy,
143 -1 2,
144 -1 ),
145 -1 // 2 -> 3
146 -1 (2, 0, 1) => (
147 -1 1 * k + (k - 1),
148 -1 1 * k + dx,
149 -1 2,
150 -1 ),
151 -1 // 2 -> 1
152 -1 (2, 0, 2) => (
153 -1 x - 1, y, dir
154 -1 ),
155 -1 // 2 -> 6
156 -1 (2, 0, 3) => (
157 -1 0 * k + dx,
158 -1 3 * k + (k - 1),
159 -1 3,
160 -1 ),
161 -1 // 3 -> 2
162 -1 (1, 1, 0) => (
163 -1 2 * k + dy,
164 -1 0 * k + (k - 1),
165 -1 3,
166 -1 ),
167 -1 // 3 -> 5
168 -1 (1, 1, 1) => (
169 -1 x, y + 1, dir
170 -1 ),
171 -1 // 3 -> 4
172 -1 (1, 1, 2) => (
173 -1 0 * k + dy,
174 -1 2 * k,
175 -1 1,
176 -1 ),
177 -1 // 3 -> 1
178 -1 (1, 1, 3) => (
179 -1 x, y - 1, dir,
180 -1 ),
181 -1 // 4 -> 5
182 -1 (0, 2, 0) => (
183 -1 x + 1, y, dir
184 -1 ),
185 -1 // 4 -> 6
186 -1 (0, 2, 1) => (
187 -1 x, y + 1, dir
188 -1 ),
189 -1 // 4 -> 1
190 -1 (0, 2, 2) => (
191 -1 1 * k,
192 -1 0 * k + (k - 1) - dy,
193 -1 0,
194 -1 ),
195 -1 // 4 -> 3
196 -1 (0, 2, 3) => (
197 -1 1 * k,
198 -1 1 * k + dx,
199 -1 0,
200 -1 ),
201 -1 // 5 -> 2
202 -1 (1, 2, 0) => (
203 -1 2 * k + (k - 1),
204 -1 0 * k + (k - 1) - dy,
205 -1 2,
206 -1 ),
207 -1 // 5 -> 6
208 -1 (1, 2, 1) => (
209 -1 0 * k + (k - 1),
210 -1 3 * k + dx,
211 -1 2,
212 -1 ),
213 -1 // 5 -> 4
214 -1 (1, 2, 2) => (
215 -1 x - 1, y, dir
216 -1 ),
217 -1 // 5 -> 3
218 -1 (1, 2, 3) => (
219 -1 x, y - 1, dir
220 -1 ),
221 -1 // 6 -> 5
222 -1 (0, 3, 0) => (
223 -1 1 * k + dy,
224 -1 2 * k + (k - 1),
225 -1 3,
226 -1 ),
227 -1 // 6 -> 2
228 -1 (0, 3, 1) => (
229 -1 2 * k + dx,
230 -1 0 * k,
231 -1 1,
232 -1 ),
233 -1 // 6 -> 1
234 -1 (0, 3, 2) => (
235 -1 1 * k + dy,
236 -1 0 * k,
237 -1 1,
238 -1 ),
239 -1 // 6 -> 4
240 -1 (0, 3, 3) => (
241 -1 x, y - 1, dir
242 -1 ),
243 -1 _ => unreachable!(),
244 -1 };
-1 154 return None;
245 155 }
246 156
247 157 fn part2(map: &Vec<Vec<Tile>>, path: &Vec<(usize, bool)>) -> usize {
@@ -256,10 +166,10 @@ fn part2(map: &Vec<Vec<Tile>>, path: &Vec<(usize, bool)>) -> usize {
256 166 for (steps, turn) in path.iter() {
257 167 for _ in 0..*steps {
258 168 let (x2, y2, dir2) = match dir {
259 -1 0 => if (x + 1) % 50 == 0 { wrap2(x, y, dir) } else { (x + 1, y, dir) },
260 -1 1 => if (y + 1) % 50 == 0 { wrap2(x, y, dir) } else { (x, y + 1, dir) },
261 -1 2 => if x % 50 == 0 { wrap2(x, y, dir) } else { (x - 1, y, dir) },
262 -1 3 => if y % 50 == 0 { wrap2(x, y, dir) } else { (x, y - 1, dir) },
-1 169 0 => if (x + 1) % 50 == 0 { wrap2(map, x, y, dir) } else { (x + 1, y, dir) },
-1 170 1 => if (y + 1) % 50 == 0 { wrap2(map, x, y, dir) } else { (x, y + 1, dir) },
-1 171 2 => if x % 50 == 0 { wrap2(map, x, y, dir) } else { (x - 1, y, dir) },
-1 172 3 => if y % 50 == 0 { wrap2(map, x, y, dir) } else { (x, y - 1, dir) },
263 173 _ => unreachable!(),
264 174 };
265 175
@@ -286,9 +196,9 @@ fn part2(map: &Vec<Vec<Tile>>, path: &Vec<(usize, bool)>) -> usize {
286 196 return 1000 * (y + 1) + 4 * (x + 1) + dir;
287 197 }
288 198
289 -1 fn test_wrap(x: usize, y: usize, dir: usize) {
290 -1 let (x2, y2, dir2) = wrap2(x, y, dir);
291 -1 let (x3, y3, dir3) = wrap2(x2, y2, (dir2 + 2) % 4);
-1 199 fn test_wrap(map: &Vec<Vec<Tile>>, x: usize, y: usize, dir: usize) {
-1 200 let (x2, y2, dir2) = wrap2(map, x, y, dir);
-1 201 let (x3, y3, dir3) = wrap2(map, x2, y2, (dir2 + 2) % 4);
292 202 let dir4 = (dir3 + 2) % 4;
293 203 assert_eq!((x, y, dir), (x3, y3, dir4));
294 204 }
@@ -300,16 +210,16 @@ fn main() {
300 210 for (x, tile) in row.iter().enumerate() {
301 211 if *tile != Tile::Out {
302 212 if x % 50 == 0 {
303 -1 test_wrap(x, y, 2);
-1 213 test_wrap(&map, x, y, 2);
304 214 }
305 215 if (x + 1) % 50 == 0 {
306 -1 test_wrap(x, y, 0);
-1 216 test_wrap(&map, x, y, 0);
307 217 }
308 218 if y % 50 == 0 {
309 -1 test_wrap(x, y, 3);
-1 219 test_wrap(&map, x, y, 3);
310 220 }
311 221 if (y + 1) % 50 == 0 {
312 -1 test_wrap(x, y, 1);
-1 222 test_wrap(&map, x, y, 1);
313 223 }
314 224 }
315 225 }