Advent of Code 2020 day03

23966 단어 Rustadventofcodetech
https://adventofcode.com/2020/day/3

part1


..##.......
#...#...#..
.#....#..#.
..#.#...#.#
.#...##..#.
..#.##.....
.#.#.#....#
.#........#
#.##...#...
#...##....#
.#..#...#.#
에서 보듯이 .#에 표시된 맵(그 중에서 가로로 똑같은 도안이 무한히 이어지고 있음)에서 왼쪽 위를 기점으로 일정한 방향을 따라 내려갈 때 몇 번#의 충돌이 발생한다.
part1은 오른쪽3, 아래로1로 전진하면 몇 번 부딪힌다.
파라세#를 입력할 때만true 처리하고 forloop으로 간단하게 볼 수 있습니다.가로로 똑같은 패턴이 지속되기 때문에 width의mod를 자주 보면 초과된 상황을 고려할 수 있다.
impl Solution {
    fn new(inputs: Vec<String>) -> Self {
        Self {
            grid: inputs
                .iter()
                .map(|row| row.chars().map(|c| c == '#').collect())
                .collect(),
        }
    }
    fn solve_1(&self) -> usize {
        let width = self.grid[0].len();
        (0..self.grid.len())
            .filter(|&i| self.grid[i][(i * 3) % width])
            .count()
    }
}

part2


파트1에서는'오른쪽3, 아래쪽1'의 상황만 고려하면 되지만 다른 전진 방식을 진행할 때도 계산이 필요하다.따라서 각 방향에서 계수를 준비하는 방법으로 각 횟수를 계산하고 곱한다.
    fn solve_2(&self) -> usize {
        [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)]
            .iter()
            .map(|&(right, down)| self.count(right, down))
            .product()
    }
    fn count(&self, right: usize, down: usize) -> usize {
        let width = self.grid[0].len();
        (0..self.grid.len() / down)
            .filter(|&i| self.grid[i * down][(i * right) % width])
            .count()
    }

code


use std::io::{BufRead, BufReader};

struct Solution {
    grid: Vec<Vec<bool>>,
}

impl Solution {
    fn new(inputs: Vec<String>) -> Self {
        Self {
            grid: inputs
                .iter()
                .map(|row| row.chars().map(|c| c == '#').collect())
                .collect(),
        }
    }
    fn solve_1(&self) -> usize {
        self.count(3, 1)
    }
    fn solve_2(&self) -> usize {
        [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)]
            .iter()
            .map(|&(right, down)| self.count(right, down))
            .product()
    }
    fn count(&self, right: usize, down: usize) -> usize {
        let width = self.grid[0].len();
        (0..self.grid.len() / down)
            .filter(|&i| self.grid[i * down][(i * right) % width])
            .count()
    }
}

fn main() {
    let inputs: Vec<String> = BufReader::new(std::io::stdin().lock())
        .lines()
        .filter_map(|line| line.ok())
        .collect();
    let solution = Solution::new(inputs);
    println!("{}", solution.solve_1());
    println!("{}", solution.solve_2());
}

좋은 웹페이지 즐겨찾기