From b49672f69c2b6ffaba88afbe9a7757feafc860ed Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Wed, 7 Dec 2016 22:36:09 -0500 Subject: Refactor day 7 --- src/bin/day07.rs | 59 +++++++++++++++++++++----------------------------------- 1 file changed, 22 insertions(+), 37 deletions(-) (limited to 'src/bin') diff --git a/src/bin/day07.rs b/src/bin/day07.rs index b2289f0..305fd8f 100644 --- a/src/bin/day07.rs +++ b/src/bin/day07.rs @@ -1,58 +1,43 @@ use std::io::{self, Read}; use std::str::FromStr; -struct Sequence { - sequence: String, - hypernet: bool, +fn has_abba(s: &str) -> bool { + s.as_bytes() + .windows(4) + .any(|window| { + window[0] == window[3] + && window[1] == window[2] + && window[0] != window[1] + }) } -impl Sequence { - fn has_abba(&self) -> bool { - self.sequence - .as_bytes() - .windows(4) - .any(|window| { - window[0] == window[3] - && window[1] == window[2] - && window[0] != window[1] - }) - } +#[derive(Default)] +struct Ip { + supernet: Vec, + hypernet: Vec, } -struct Ip(Vec); - impl Ip { fn supports_tls(&self) -> bool { - let any_abbas = self.0 - .iter() - .any(Sequence::has_abba); - - let any_hypernet_abbas = self.0 - .iter() - .filter(|sequence| sequence.hypernet) - .any(Sequence::has_abba); - - any_abbas && !any_hypernet_abbas + self.supernet.iter().any(|s| has_abba(s)) + && !self.hypernet.iter().any(|s| has_abba(s)) } } impl FromStr for Ip { type Err = (); fn from_str(s: &str) -> Result { - let mut sequences = Vec::new(); - let mut hypernet = false; + let mut ip = Ip::default(); - for sequence in s.split(|ch| ch == '[' || ch == ']') { - sequences.push( - Sequence { - sequence: sequence.to_owned(), - hypernet: hypernet - } - ); - hypernet = !hypernet; + for (i, seq) in s.split(|ch| ch == '[' || ch == ']').enumerate() { + if i % 2 == 0 { + ip.supernet.push(seq.to_owned()); + } else { + ip.hypernet.push(seq.to_owned()); + } } - Ok(Ip(sequences)) + Ok(ip) } } -- cgit 1.4.1 nk/log/vector.h?id=7966fd9b8e32562196b52abd32f6ba1e15228b81&showmsg=1&follow=1'>Expand)Author 2013-05-13New mailing list.Jason A. Donenfeld 2013-04-30ui-snapshot: do not access $HOMEJason A. Donenfeld 2013-04-27t0001: validate Git -rcN version numbers correctlyJohn Keeping 2013-04-27git: update to 1.8.2.2John Keeping 2013-04-17scan-tree: fix regression in section-from-path=-1John Keeping 2013-04-15t0001: ignore ".dirty" suffix on Git versionJohn Keeping 2013-04-15tests: set TEST_OUTPUT_DIRECTORY to the CGit test directoryJohn Keeping 2013-04-15t0109: test more URLsJohn Keeping 2013-04-10cgitrc.5.txt: Specify when scan-path must be defined before.Jason A. Donenfeld 2013-04-10ui-snapshot.c: Prepend "V" when guessing ref namesLukas Fleischer 2013-04-10t0107: Skip ZIP tests if unzip(1) isn't availableLukas Fleischer 2013-04-10tests/: Do not use `sed -i`Lukas Fleischer 2013-04-10Add branch-sort and repo.branch-sort options.Jason A. Donenfeld 2013-04-10t0109: chain operations with &&John Keeping 2013-04-10cgit.c: Do not restore unset environment variablesLukas Fleischer 2013-04-09t0107: Use `tar -z` for gzip'ed archivesLukas Fleischer