Add 2020/06

This commit is contained in:
kageru 2020-12-06 08:28:13 +01:00
parent 30f3f0d237
commit 107adc4616
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
3 changed files with 2321 additions and 0 deletions

11
2020/06/Cargo.toml Normal file
View File

@ -0,0 +1,11 @@
[package]
name = "day06"
version = "0.1.0"
authors = ["kageru <kageru@encode.moe>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
itertools = "0.9.0"
reduce = "0.1.3"

2211
2020/06/input Normal file

File diff suppressed because it is too large Load Diff

99
2020/06/src/main.rs Normal file
View File

@ -0,0 +1,99 @@
#![feature(test)]
extern crate test;
use std::{
collections::HashSet, ops::{BitAnd, BitOr}
};
fn main() {
let input = parse_input(&read_input());
println!("Part 1: {}", part1(&input));
println!("Part 2: {}", part2(&input));
}
fn read_input() -> String {
std::fs::read_to_string("input").unwrap()
}
fn parse_input(raw: &str) -> Vec<Vec<HashSet<char>>> {
raw.split("\n\n")
.map(|group| group.lines().map(|l| l.chars().collect()).collect())
.collect()
}
fn part1(answers: &[Vec<HashSet<char>>]) -> usize {
answers.iter().map(|v| v.iter().fold(HashSet::new(), |a, b| &a | b).len()).sum()
}
fn part2(answers: &[Vec<HashSet<char>>]) -> usize {
answers.iter().map(|v| v.iter().fold(v[0].clone(), |a, b| &a & b).len()).sum()
}
#[cfg(test)]
mod tests {
use super::*;
use test::black_box;
const TEST_INPUT: &str = "abc
a
b
c
ab
ac
a
a
a
a
b";
const TEST_INPUT_2: &str = "fsl
fsg
fs
fts
sf
a
bdfghjkl
hdcl
cdlh
hdcl
hldc
ldhc";
#[test]
fn part1_test() {
assert_eq!(part1(&parse_input(TEST_INPUT)), 11);
}
fn part2_help(answers: &[Vec<HashSet<char>>]) -> Vec<usize> {
answers.iter().map(|v| v.iter().fold(v[0].clone(), |a, b| &a & b).len()).collect()
}
#[test]
fn part2_test() {
assert_eq!(part2_help(&parse_input(TEST_INPUT_2)), vec![2, 0, 4]);
assert_eq!(part2(&parse_input(TEST_INPUT)), 6);
}
#[bench]
fn bench_input_parsing(b: &mut test::Bencher) {
let s = read_input();
b.iter(|| assert_eq!(parse_input(black_box(&s)).len(), 490))
}
#[bench]
fn bench_part2(b: &mut test::Bencher) {
let i = parse_input(&read_input());
b.iter(|| assert_eq!(part2(black_box(&i)), 3221))
}
#[bench]
fn bench_part1(b: &mut test::Bencher) {
let i = parse_input(&read_input());
b.iter(|| assert_eq!(part1(black_box(&i)), 6735))
}
}