Advent of Code 2020 day03
23966 단어 Rustadventofcodetech
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());
}
Reference
이 문제에 관하여(Advent of Code 2020 day03), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sugyan/articles/61eb4fcf82f672텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)