From a2aa8a353f614416249d37b2f78ce0fb401a26cb Mon Sep 17 00:00:00 2001 From: kageru Date: Wed, 16 Dec 2020 16:12:41 +0100 Subject: [PATCH] Add helper --- 2020/src/bin/day15.rs | 4 +++- 2020/src/bin/day16.rs | 18 ++++-------------- 2020/src/common.rs | 5 +++++ 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/2020/src/bin/day15.rs b/2020/src/bin/day15.rs index 2a13c50..f1265c4 100644 --- a/2020/src/bin/day15.rs +++ b/2020/src/bin/day15.rs @@ -1,6 +1,7 @@ #![feature(test)] extern crate test; use std::collections::HashMap; +use aoc2020::common::*; type Parsed = Vec; @@ -8,8 +9,9 @@ fn read_input() -> String { String::from("15,12,0,14,3,1") } +#[inline] fn parse_input(raw: &str) -> Parsed { - raw.split(',').filter_map(|x| x.parse().ok()).collect() + parse_nums(raw) } #[rustfmt::skip] diff --git a/2020/src/bin/day16.rs b/2020/src/bin/day16.rs index f0135ba..d081609 100644 --- a/2020/src/bin/day16.rs +++ b/2020/src/bin/day16.rs @@ -45,23 +45,13 @@ fn parse_input(raw: &str) -> Parsed { let (rules, my_ticket, nearby) = raw.split("\n\n").next_tuple().unwrap(); Parsed { rules: rules.lines().map_into().collect(), - my_ticket: my_ticket - .split_once('\n') - .unwrap() - .1 - .split(',') - .map(|n| n.parse().unwrap()) - .collect(), - nearby_tickets: nearby - .lines() - .skip(1) - .map(|l| l.split(',').map(|n| n.parse().unwrap()).collect()) - .collect(), + my_ticket: parse_nums(my_ticket.split_once('\n').unwrap().1), + nearby_tickets: nearby.lines().skip(1).map(parse_nums).collect(), } } -// Could be optimized by folding the ranges first to only have one lower and one upper (or even -// just a single one if they’re continuous), but meh. +// Could be optimized by merging overlapping ranges into one before checking all the tickets. +// … or so I thought until I tried, benchmarked, and saw that that takes twice as long. fn part1(parsed: &Parsed) -> usize { parsed .nearby_tickets diff --git a/2020/src/common.rs b/2020/src/common.rs index 9d64604..9f77058 100644 --- a/2020/src/common.rs +++ b/2020/src/common.rs @@ -9,3 +9,8 @@ pub fn read_file(day: usize) -> String { ) .unwrap() } + +#[inline] +pub fn parse_nums(l: &str) -> Vec { + l.split(',').filter_map(|n| n.parse().ok()).collect() +}