Cleanup code and store invalid pages for part 2
This commit is contained in:
@@ -15,13 +15,14 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
&args[0]
|
&args[0]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
let input_file_string = &args[1];
|
let input_file = &args[1];
|
||||||
|
|
||||||
let buffer = BufReader::new(File::open(input_file_string)?);
|
let buffer = BufReader::new(File::open(input_file)?);
|
||||||
|
|
||||||
let mut rules_stage = true;
|
let mut rules_stage = true;
|
||||||
let mut page_rules: HashMap<i64, HashSet<i64>> = HashMap::new();
|
let mut page_rules: HashMap<i64, HashSet<i64>> = HashMap::new();
|
||||||
let mut valid_page_updates: Vec<Vec<i64>> = Vec::new();
|
let mut valid_page_updates: Vec<Vec<i64>> = Vec::new();
|
||||||
|
let mut invalid_page_updates: Vec<Vec<i64>> = Vec::new();
|
||||||
for line in buffer.lines() {
|
for line in buffer.lines() {
|
||||||
let line = line?;
|
let line = line?;
|
||||||
if rules_stage {
|
if rules_stage {
|
||||||
@@ -30,7 +31,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
if line.is_empty() {
|
if line.is_empty() {
|
||||||
// Blank line means end of rules
|
// Blank line means end of rules
|
||||||
rules_stage = false;
|
rules_stage = false;
|
||||||
println!("Page Rules: {:?}", page_rules);
|
// println!("Page Rules: {:?}", page_rules);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let split_line: Vec<&str> = line.split("|").collect();
|
let split_line: Vec<&str> = line.split("|").collect();
|
||||||
@@ -42,8 +43,8 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
let key = split_line[0].parse::<i64>()?;
|
let key = split_line[0].parse::<i64>()?;
|
||||||
let value = split_line[1].parse::<i64>()?;
|
let value = split_line[1].parse::<i64>()?;
|
||||||
match page_rules.get_mut(&key) {
|
match page_rules.get_mut(&key) {
|
||||||
Some(rule) => {
|
Some(rule_set) => {
|
||||||
rule.insert(value);
|
rule_set.insert(value);
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
let mut new_rule_set = HashSet::new();
|
let mut new_rule_set = HashSet::new();
|
||||||
@@ -53,14 +54,14 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Stage 2: check updates
|
// Stage 2: check updates
|
||||||
let update_page_nums: Vec<i64> = line
|
let page_update: Vec<i64> = line
|
||||||
.split(",")
|
.split(",")
|
||||||
.map(|v| v.parse::<_>())
|
.map(|v| v.parse::<_>())
|
||||||
.collect::<Result<_, _>>()?;
|
.collect::<Result<_, _>>()?;
|
||||||
|
|
||||||
let mut prev_pages: HashSet<i64> = HashSet::new();
|
let mut prev_pages: HashSet<i64> = HashSet::new();
|
||||||
let mut is_valid = true;
|
let mut is_valid = true;
|
||||||
for page_num in update_page_nums.iter() {
|
for page_num in page_update.iter() {
|
||||||
if let Some(rule_set) = page_rules.get(page_num) {
|
if let Some(rule_set) = page_rules.get(page_num) {
|
||||||
if !prev_pages.is_disjoint(rule_set) {
|
if !prev_pages.is_disjoint(rule_set) {
|
||||||
is_valid = false;
|
is_valid = false;
|
||||||
@@ -70,7 +71,9 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if is_valid {
|
if is_valid {
|
||||||
valid_page_updates.push(update_page_nums);
|
valid_page_updates.push(page_update);
|
||||||
|
} else {
|
||||||
|
invalid_page_updates.push(page_update);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user