Advent of Code 2020 day02

29643 단어 Rustadventofcodetech
https://adventofcode.com/2020/day/2

part1


1-3 a: abcde
1-3 b: cdefg
2-9 c: ccccccccc
의 형식으로 PARse를 입력하여 조건의 줄 수를 되돌려줍니다.
파트11-3 a에서는'a 출현1회 이상3회 이하'라는 뜻이다.그냥 설치해.
정규 표현을 사용했지만 캡처의 추출 방법이 더 좋은가...
    fn solve_1(&self) -> usize {
        let re: Regex = Regex::new(r"^(\d+)\-(\d+) (.): (.+)$").unwrap();
        self.inputs
            .iter()
            .filter(|&input| {
                if let Some(cap) = re.captures(input) {
                    let min = cap[1].parse::<usize>().unwrap();
                    let max = cap[2].parse::<usize>().unwrap();
                    let chr = cap[3].chars().next().unwrap();
                    let appear = cap[4].chars().filter(|&c| c == chr).count();
                    (min..=max).contains(&appear)
                } else {
                    false
                }
            })
            .count()
    }

part2


해석 변경1-3 a은 "1 두 번째 문자나 제3 문자만 a"임을 의미한다.index는 0-origin이 아닙니다.
그 중 한 가지 조건만 만족하는 곳matches에서 맥로를 사용해 보았다.
    fn solve_2(&self) -> usize {
        let re: Regex = Regex::new(r"^(\d+)\-(\d+) (.): (.+)$").unwrap();
        self.inputs
            .iter()
            .filter(|&input| {
                if let Some(cap) = re.captures(input) {
                    let pos1 = cap[1].parse::<usize>().unwrap();
                    let pos2 = cap[2].parse::<usize>().unwrap();
                    let chr = cap[3].chars().next().unwrap();
                    matches!(
                        (
                            cap[4].chars().nth(pos1 - 1) == Some(chr),
                            cap[4].chars().nth(pos2 - 1) == Some(chr),
                        ),
                        (true, false) | (false, true),
                    )
                } else {
                    false
                }
            })
            .count()
    }

code


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

struct Solution {
    inputs: Vec<String>,
    re: Regex,
}

impl Solution {
    fn new(inputs: Vec<String>) -> Self {
        Self {
            inputs,
            re: Regex::new(r"^(\d+)\-(\d+) (.): (.+)$").unwrap(),
        }
    }
    fn solve_1(&self) -> usize {
        self.inputs
            .iter()
            .filter(|&input| {
                if let Some(cap) = self.re.captures(input) {
                    let min = cap[1].parse::<usize>().unwrap();
                    let max = cap[2].parse::<usize>().unwrap();
                    let chr = cap[3].chars().next().unwrap();
                    let appear = cap[4].chars().filter(|&c| c == chr).count();
                    (min..=max).contains(&appear)
                } else {
                    false
                }
            })
            .count()
    }
    fn solve_2(&self) -> usize {
        self.inputs
            .iter()
            .filter(|&input| {
                if let Some(cap) = self.re.captures(input) {
                    let pos1 = cap[1].parse::<usize>().unwrap();
                    let pos2 = cap[2].parse::<usize>().unwrap();
                    let chr = cap[3].chars().next().unwrap();
                    matches!(
                        (
                            cap[4].chars().nth(pos1 - 1) == Some(chr),
                            cap[4].chars().nth(pos2 - 1) == Some(chr),
                        ),
                        (true, false) | (false, true),
                    )
                } else {
                    false
                }
            })
            .count()
    }
}

좋은 웹페이지 즐겨찾기