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