pub struct Number {
// (depth, value)
v: Vec<(u8, u8)>,
}
impl Number {
pub fn parse(s: &str) -> Self {
let mut depth = 0;
let mut v = vec![];
for c in s.chars() {
match c {
'[' => depth += 1,
']' => depth -= 1,
',' => {},
_ => {
let i = c.to_digit(10).unwrap() as u8;
v.push((i, depth));
},
}
}
return Number {v};
}
fn explode(&mut self) -> bool {
match self.v.iter().position(|(_, depth)| *depth > 4) {
Some(i) => {
let (a, depth_a) = self.v.remove(i);
let (b, depth_b) = self.v.remove(i);
assert_eq!(depth_a, depth_b);
self.v.insert(i, (0, depth_a - 1));
if i > 0 {
self.v[i - 1].0 += a;
}
if i + 1 < self.v.len() {
self.v[i + 1].0 += b;
}
true
},
None => false,
}
}
fn split(&mut self) -> bool {
match self.v.iter().position(|(value, _)| *value >= 10) {
Some(i) => {
let (value, depth) = self.v.remove(i);
self.v.insert(i, (value - value / 2, depth + 1));
self.v.insert(i, (value / 2, depth + 1));
true
},
None => false,
}
}
fn magnitute_insert(&self, mut path: &mut Vec