- commit
- 4ee99ef41cc784c0a73d2ac997e5871e2b6dd84d
- parent
- 9d096be059fc0df2a322a48dfc7649a78ac975c1
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2022-12-22 11:01
fixed
Diffstat
M | 2022/22/solution.rs | 113 | ++++++++++++++++++++++++++++++++++++++++++++----------------- |
1 files changed, 82 insertions, 31 deletions
diff --git a/2022/22/solution.rs b/2022/22/solution.rs
@@ -110,108 +110,133 @@ fn part1(map: &Vec<Vec<Tile>>, path: &Vec<(usize, bool)>) -> usize { 110 110 111 111 fn wrap2(x: usize, y: usize, dir: usize) -> (usize, usize, usize) { 112 112 // hardcoded cube topology -1 113 let k = 50; 113 114114 -1 let dx = x % 50;115 -1 let dy = y % 50;-1 115 let dx = x % k; -1 116 let dy = y % k; 116 117117 -1 return match (x / 50, y / 50, dir) {-1 118 return match (x / k, y / k, dir) { -1 119 // 1 -> 2 118 120 (1, 0, 0) => ( 119 121 x + 1, y, dir 120 122 ), -1 123 // 1 -> 3 121 124 (1, 0, 1) => ( 122 125 x, y + 1, dir 123 126 ), -1 127 // 1 -> 4 124 128 (1, 0, 2) => (125 -1 0 * 50,126 -1 (3 * 50 - 1) - dy,-1 129 0 * k, -1 130 2 * k + (k - 1) - dy, 127 131 0, 128 132 ), -1 133 // 1 -> 6 129 134 (1, 0, 3) => (130 -1 0 * 50,131 -1 3 * 50 + dx,-1 135 0 * k, -1 136 3 * k + dx, 132 137 0, 133 138 ), -1 139 // 2 -> 5 134 140 (2, 0, 0) => (135 -1 2 * 50 - 1,136 -1 (3 * 50 - 1) - dy,-1 141 1 * k + (k - 1), -1 142 2 * k + (k - 1) - dy, 137 143 2, 138 144 ), -1 145 // 2 -> 3 139 146 (2, 0, 1) => (140 -1 2 * 50 - 1,141 -1 (2 * 50 - 1) - dx,-1 147 1 * k + (k - 1), -1 148 1 * k + dx, 142 149 2, 143 150 ), -1 151 // 2 -> 1 144 152 (2, 0, 2) => ( 145 153 x - 1, y, dir 146 154 ), -1 155 // 2 -> 6 147 156 (2, 0, 3) => (148 -1 0 * 50 + dx,149 -1 4 * 50 - 1,-1 157 0 * k + dx, -1 158 3 * k + (k - 1), 150 159 3, 151 160 ), -1 161 // 3 -> 2 152 162 (1, 1, 0) => (153 -1 2 * 50 + dy,154 -1 1 * 50 - 1,-1 163 2 * k + dy, -1 164 0 * k + (k - 1), 155 165 3, 156 166 ), -1 167 // 3 -> 5 157 168 (1, 1, 1) => ( 158 169 x, y + 1, dir 159 170 ), -1 171 // 3 -> 4 160 172 (1, 1, 2) => (161 -1 0 * 50 + dy,162 -1 2 * 50,-1 173 0 * k + dy, -1 174 2 * k, 163 175 1, 164 176 ), -1 177 // 3 -> 1 165 178 (1, 1, 3) => ( 166 179 x, y - 1, dir, 167 180 ), -1 181 // 4 -> 5 168 182 (0, 2, 0) => ( 169 183 x + 1, y, dir 170 184 ), -1 185 // 4 -> 6 171 186 (0, 2, 1) => ( 172 187 x, y + 1, dir 173 188 ), -1 189 // 4 -> 1 174 190 (0, 2, 2) => (175 -1 1 * 50,176 -1 (1 * 50 - 1) - dy,-1 191 1 * k, -1 192 0 * k + (k - 1) - dy, 177 193 0, 178 194 ), -1 195 // 4 -> 3 179 196 (0, 2, 3) => (180 -1 1 * 50,181 -1 1 * 50 + dy,-1 197 1 * k, -1 198 1 * k + dx, 182 199 0, 183 200 ), -1 201 // 5 -> 2 184 202 (1, 2, 0) => (185 -1 3 * 50 - 1,186 -1 (1 * 50 - 1) - dy,-1 203 2 * k + (k - 1), -1 204 0 * k + (k - 1) - dy, 187 205 2, 188 206 ), -1 207 // 5 -> 6 189 208 (1, 2, 1) => (190 -1 1 * 50 - 1,191 -1 3 * 50 + dy,-1 209 0 * k + (k - 1), -1 210 3 * k + dx, 192 211 2, 193 212 ), -1 213 // 5 -> 4 194 214 (1, 2, 2) => ( 195 215 x - 1, y, dir 196 216 ), -1 217 // 5 -> 3 197 218 (1, 2, 3) => ( 198 219 x, y - 1, dir 199 220 ), -1 221 // 6 -> 5 200 222 (0, 3, 0) => (201 -1 1 * 50 + dy,202 -1 3 * 50 - 1,-1 223 1 * k + dy, -1 224 2 * k + (k - 1), 203 225 3, 204 226 ), -1 227 // 6 -> 2 205 228 (0, 3, 1) => (206 -1 2 * 50 + dx,207 -1 0 * 50,-1 229 2 * k + dx, -1 230 0 * k, 208 231 1, 209 232 ), -1 233 // 6 -> 1 210 234 (0, 3, 2) => (211 -1 1 * 50 + dx,212 -1 0 * 50,-1 235 1 * k + dy, -1 236 0 * k, 213 237 1, 214 238 ), -1 239 // 6 -> 4 215 240 (0, 3, 3) => ( 216 241 x, y - 1, dir 217 242 ), @@ -261,9 +286,35 @@ fn part2(map: &Vec<Vec<Tile>>, path: &Vec<(usize, bool)>) -> usize { 261 286 return 1000 * (y + 1) + 4 * (x + 1) + dir; 262 287 } 263 288 -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); -1 292 let dir4 = (dir3 + 2) % 4; -1 293 assert_eq!((x, y, dir), (x3, y3, dir4)); -1 294 } -1 295 264 296 fn main() { 265 297 let (map, path) = get_input(); 266 298 -1 299 for (y, row) in map.iter().enumerate() { -1 300 for (x, tile) in row.iter().enumerate() { -1 301 if *tile != Tile::Out { -1 302 if x % 50 == 0 { -1 303 test_wrap(x, y, 2); -1 304 } -1 305 if (x + 1) % 50 == 0 { -1 306 test_wrap(x, y, 0); -1 307 } -1 308 if y % 50 == 0 { -1 309 test_wrap(x, y, 3); -1 310 } -1 311 if (y + 1) % 50 == 0 { -1 312 test_wrap(x, y, 1); -1 313 } -1 314 } -1 315 } -1 316 } -1 317 267 318 println!("part1: {}", part1(&map, &path)); 268 319 println!("part2: {}", part2(&map, &path)); 269 320 }