2016/20
This commit is contained in:
68
2016/20/src/main.rs
Normal file
68
2016/20/src/main.rs
Normal file
@@ -0,0 +1,68 @@
|
||||
use std::ops::Range;
|
||||
use std::cmp;
|
||||
use std::io::{self, BufRead};
|
||||
|
||||
|
||||
fn main() {
|
||||
let stdin = io::stdin();
|
||||
|
||||
let input = stdin.lock().lines()
|
||||
.filter_map(|line| line.ok())
|
||||
.map(|line| {
|
||||
let parts = line.split('-')
|
||||
.map(|part| part.parse::<usize>().unwrap())
|
||||
.collect::<Vec<usize>>();
|
||||
|
||||
(parts[0]..parts[1] + 1)
|
||||
});
|
||||
|
||||
let mut ranges: Vec<Range<usize>> = Vec::new();
|
||||
|
||||
for range in input {
|
||||
let mut left = range;
|
||||
|
||||
while let Some(index) = ranges.iter()
|
||||
.position(|right| {
|
||||
left.start >= right.start && left.start <= right.end ||
|
||||
left.end >= right.start && left.end <= right.end ||
|
||||
right.start >= left.start && right.start <= left.end ||
|
||||
right.end >= left.start && right.end <= left.end
|
||||
})
|
||||
{
|
||||
let right = ranges.remove(index);
|
||||
|
||||
left = cmp::min(left.start, right.start)..cmp::max(left.end, right.end);
|
||||
}
|
||||
|
||||
ranges.push(left);
|
||||
}
|
||||
|
||||
let mut value = 0;
|
||||
|
||||
for range in ranges.iter() {
|
||||
if value >= range.start && value < range.end {
|
||||
value = range.end;
|
||||
}
|
||||
}
|
||||
|
||||
println!("min={}", value);
|
||||
|
||||
|
||||
let mut allowed = 4294967295;
|
||||
|
||||
for range in ranges.iter() {
|
||||
allowed -= range.end - range.start;
|
||||
}
|
||||
|
||||
println!("allowed={}", allowed + 1);
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn example_01() {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user