Skip to content

Instantly share code, notes, and snippets.

@solson
Forked from anonymous/playground.rs
Created December 24, 2017 05:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save solson/9a772ea5724f5338f70769e02690e9d1 to your computer and use it in GitHub Desktop.
Save solson/9a772ea5724f5338f70769e02690e9d1 to your computer and use it in GitHub Desktop.
Rust code shared from the playground
// 25x25
const INPUT: &str = "\
#.....##.####.#.#########
.###..#..#..####.##....#.
..#########...###...####.
.##.#.##..#.#..#.#....###
...##....###..#.#..#.###.
###..#...######.####.#.#.
#..###..###..###.###.##..
.#.#.###.#.#...####..#...
##........##.####..##...#
.#.##..#.#....##.##.##..#
###......#..##.####.###.#
....#..###..#######.#...#
#####.....#.##.#..#..####
.#.###.#.###..##.#..####.
..#..##.###...#######....
.#.##.#.#.#.#...###.#.#..
##.###.#.#.###.#......#..
###..##.#...#....#..####.
.#.#.....#..#....##..#..#
#####.#.##..#...##..#....
##..#.#.#.####.#.##...##.
..#..#.#.####...#........
###.###.##.#..#.##.....#.
.##..##.##...#..#..#.#..#
#...####.#.##...#..#.#.##\
";
// 3x3
const _INPUT: &str = "\
..#
#..
...\
";
const INPUT_SIZE: usize = 25;
const SIZE: usize = 999;
const ITERATIONS: usize = 10_000_000;
#[derive(Clone, Copy, Debug)]
enum State {
Clean,
Weakened,
Infected,
Flagged,
}
use self::State::*;
fn main() {
let mut grid = Box::new([[Clean; SIZE]; SIZE]);
let center_offset = (SIZE - INPUT_SIZE) / 2;
for (i, line) in INPUT.split('\n').enumerate() {
for (j, c) in line.chars().enumerate() {
grid[center_offset + i][center_offset + j] = if c == '#' {
Infected
} else {
Clean
};
}
}
let mut pos = (0, 0);
let mut dir = (-1, 0);
let mut infect_count = 0;
for _ in 0..ITERATIONS {
let center = ((SIZE - 1) / 2) as isize;
let i = (center + pos.0) as usize;
let j = (center + pos.1) as usize;
grid[i][j] = match grid[i][j] {
Infected => {
dir = match dir {
(1, 0) => (0, -1),
(-1, 0) => (0, 1),
(0, 1) => (1, 0),
(0, -1) => (-1, 0),
_ => unreachable!(),
};
Flagged
}
Clean => {
dir = match dir {
(0, -1) => (1, 0),
(0, 1) => (-1, 0),
(1, 0) => (0, 1),
(-1, 0) => (0, -1),
_ => unreachable!(),
};
Weakened
}
Weakened => {
infect_count += 1;
Infected
}
Flagged => {
dir = (-dir.0, -dir.1);
Clean
}
};
pos.0 += dir.0;
pos.1 += dir.1;
}
println!("{}", infect_count);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment