aboutsummaryrefslogtreecommitdiff
path: root/2022/22/a.rs
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-07-08 17:10:53 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-07-08 17:10:53 +0200
commitdbb5a4e5711fba371fbb011356bcd8a28cc963e4 (patch)
tree75bb0574d4553eea96b45e2171d3849eee45a3ef /2022/22/a.rs
parent2641a35d5473beb6889b299b54de294fbf782b1f (diff)
downloadaoc-dbb5a4e5711fba371fbb011356bcd8a28cc963e4.tar.gz
aoc-dbb5a4e5711fba371fbb011356bcd8a28cc963e4.zip
Day 22 2022
Diffstat (limited to '')
-rw-r--r--2022/22/a.rs81
1 files changed, 81 insertions, 0 deletions
diff --git a/2022/22/a.rs b/2022/22/a.rs
new file mode 100644
index 0000000..40f9c44
--- /dev/null
+++ b/2022/22/a.rs
@@ -0,0 +1,81 @@
1use std::cmp::max;
2mod common;
3use common::*;
4
5#[derive(Copy, Clone, Debug)]
6pub struct Position {
7 pub i: usize,
8 pub j: usize,
9 pub d: Direction
10}
11
12pub struct Map {
13 pub tiles: Vec<Vec<Tile>>
14}
15
16type StepFn = fn(&Map, Position) -> Position;
17
18impl Map {
19 pub fn from_stdin() -> Map {
20 let mut maxlen = 0;
21 let mut tiles = vec![];
22 let mut line = String::new();
23 while std::io::stdin().read_line(&mut line).unwrap() > 1 {
24 let v = line[0..line.len()-1].as_bytes().iter()
25 .map(|b| Tile::from_byte(*b)).collect::<Vec<_>>();
26 maxlen = max(maxlen, v.len());
27 tiles.push(v);
28 line.clear();
29 }
30 for v in &mut tiles {
31 while v.len() < maxlen { v.push(Tile::Skip); }
32 }
33 Map { tiles }
34 }
35
36 pub fn start_position(&self) -> Position {
37 let first_valid = self.tiles[0].iter()
38 .position(|t| *t == Tile::Walk).unwrap();
39 Position { i: 0, j: first_valid, d: Direction::Right }
40 }
41
42 pub fn walk(&self, pos: Position, n: usize, step: StepFn) -> Position {
43 let mut p = pos;
44 for _ in 0..n { p = step(self, p); }
45 p
46 }
47}
48
49fn step(map: &Map, position: Position) -> Position {
50 let imax = map.tiles.len();
51 let jmax = map.tiles[0].len();
52 let s = position.d.step();
53 let mut p = position;
54 loop {
55 let inext = ((s.0 + imax as i64) as usize + p.i) % imax;
56 let jnext = ((s.1 + jmax as i64) as usize + p.j) % jmax;
57 p = Position { i: inext, j: jnext, d: p.d };
58 match map.tiles[p.i][p.j] {
59 Tile::Walk => return p,
60 Tile::Wall => return position,
61 Tile::Skip => ()
62 }
63 }
64}
65
66fn password(p: Position) -> usize {
67 1000 * (p.i+1) + 4 * (p.j+1) + p.d.value()
68}
69
70fn main() {
71 let map = Map::from_stdin();
72 let (turns, steps) = read_instruction_line_from_stdin();
73 let mut position = map.start_position();
74
75 for i in 0..turns.len() {
76 position = map.walk(position, steps[i], step);
77 position.d = position.d.turn(turns[i]);
78 }
79 position = map.walk(position, steps[steps.len()-1], step);
80 println!("{}", password(position));
81}

Generated with cgit - Back to sebastiano.tronto.net