blob: ce21752318bd080eebe693703dd7806e9a8ed1f6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
use std::io;
struct Range {
start: i64,
end: i64,
}
impl Range {
fn new<'a>(mut iter: impl DoubleEndedIterator<Item = &'a str>) -> Self {
let start = iter.next().unwrap().parse::<i64>().unwrap();
let end = iter.next().unwrap().parse::<i64>().unwrap();
Self { start, end }
}
}
fn is_invalid(value: i64) -> bool {
let tmp = value.to_string();
/*
if tmp.len() % 2 != 0 {
return false
}
let (a, b) = tmp.split_at(tmp.len() / 2);
return a == b;
*/
for x in 1..=tmp.len() / 2 {
if tmp.len() % x != 0 {
continue;
}
let (first, rest) = tmp.split_at(x);
let mut rest2 = rest;
let mut all_match = true;
for _ in 0..tmp.len() / x - 1 {
match rest2.strip_prefix(first) {
Some(value) => rest2 = value,
None => {
all_match = false;
break;
}
};
}
if all_match {
return true;
}
}
false
}
fn invalid(range: &Range) -> i64 {
let mut total = 0;
for i in range.start..=range.end {
if is_invalid(i) {
total += i;
}
}
total
}
fn main() {
let mut buffer = String::new();
io::stdin().read_line(&mut buffer).unwrap();
let mut total = 0;
for range in buffer
.trim_end()
.split(',')
.map(|x| Range::new(x.split('-')))
{
total += invalid(&range);
}
println!("Invalid: {}", total);
}
|