work on exploding and splitting
This commit is contained in:
parent
63818ee2ee
commit
54053779aa
@ -11,12 +11,27 @@ enum Item {
|
|||||||
SubPair(Box<Pair>),
|
SubPair(Box<Pair>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Item {
|
||||||
|
fn magnitude(&self) -> usize {
|
||||||
|
match self {
|
||||||
|
Item::Value(v) => *v as usize,
|
||||||
|
Item::SubPair(pair) => pair.magnitude(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Pair {
|
struct Pair {
|
||||||
left: Item,
|
left: Item,
|
||||||
right: Item,
|
right: Item,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Pair {
|
||||||
|
fn magnitude(&self) -> usize {
|
||||||
|
3 * self.left.magnitude() + 2 * self.right.magnitude()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Parser<'a> {
|
struct Parser<'a> {
|
||||||
chars: Chars<'a>,
|
chars: Chars<'a>,
|
||||||
@ -25,7 +40,7 @@ struct Parser<'a> {
|
|||||||
impl<'a> Parser<'a> {
|
impl<'a> Parser<'a> {
|
||||||
fn from(src: &'a str) -> Parser<'a> {
|
fn from(src: &'a str) -> Parser<'a> {
|
||||||
let mut chars = src.chars();
|
let mut chars = src.chars();
|
||||||
chars.next(); // throw away the opening bracket
|
chars.next(); // throw away the opening bracket so we don't nest too deeply
|
||||||
Parser {chars}
|
Parser {chars}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,21 +67,24 @@ fn load(data: &str) -> eyre::Result<Vec<Pair>>{
|
|||||||
let mut pairs = Vec::new();
|
let mut pairs = Vec::new();
|
||||||
for line in data.lines() {
|
for line in data.lines() {
|
||||||
let mut parser = Parser::from(line);
|
let mut parser = Parser::from(line);
|
||||||
match parser.parse() {
|
let pair = parser.parse()
|
||||||
Ok(pair) => pairs.push(pair),
|
.map_err(|_| eyre!("Invalid input: {}", line))?;
|
||||||
Err(e) => return Err(eyre!("Invalid input: {}", line)),
|
pairs.push(pair);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Ok(pairs)
|
Ok(pairs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const _SAMPLE: &str = "[[1,9],[8,5]]";
|
const _SAMPLE: &str = "[[[[8,7],[7,7]],[[8,6],[7,7]]],[[[0,7],[6,6]],[8,7]]]";
|
||||||
|
|
||||||
pub fn run(data: &str) -> eyre::Result<(usize, usize)> {
|
pub fn run(data: &str) -> eyre::Result<(usize, usize)> {
|
||||||
let pairs = load(data)?;
|
// let pairs = load(data)?;
|
||||||
dbg!(pairs.len());
|
// dbg!(pairs.len());
|
||||||
dbg!(&pairs[0]);
|
// dbg!(&pairs[0]);
|
||||||
|
|
||||||
|
let mut parser = Parser::from(_SAMPLE);
|
||||||
|
let root = parser.parse()?;
|
||||||
|
dbg!(root.magnitude());
|
||||||
|
|
||||||
Ok((0, 0))
|
Ok((0, 0))
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user