starting on day13, parser is halfway done
This commit is contained in:
parent
0423e7a8f3
commit
24feb1c127
3 changed files with 120 additions and 0 deletions
|
@ -12,3 +12,4 @@ lazy_static = "1.4.0"
|
|||
regex = "1.7"
|
||||
ndarray = "0.15"
|
||||
petgraph = "0.6"
|
||||
lyn = "0.1.0"
|
||||
|
|
118
2022-aoc/src/d13.rs
Normal file
118
2022-aoc/src/d13.rs
Normal file
|
@ -0,0 +1,118 @@
|
|||
use aoc_runner_derive::{aoc as aoc_run, aoc_generator};
|
||||
use lyn::*;
|
||||
|
||||
/*
|
||||
<packet> ::= <leftbrace> <list>? <rightbrace>
|
||||
<list> ::= <single> (<comma> <single>)*
|
||||
<single> ::= <number> | <leftbrace> <list>* <rightbrace>
|
||||
<comma> ::= "," | ", "
|
||||
<leftbrace> ::= "["
|
||||
<rightbrace> ::= "]"
|
||||
<number> ::= [0-9]+
|
||||
*/
|
||||
|
||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
struct Packet {
|
||||
elements: Vec<Element>,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||
enum Element {
|
||||
Plain(u32),
|
||||
List(Vec<Element>),
|
||||
}
|
||||
|
||||
impl PartialOrd for Element {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||
use Element::*;
|
||||
match (self, other) {
|
||||
(Plain(v1), Plain(v2)) => Some(v1.cmp(v2)),
|
||||
(List(v1), List(v2)) => v1.partial_cmp(v2),
|
||||
(Plain(_), List(_)) => List(vec![self.clone()]).partial_cmp(other),
|
||||
(List(_), Plain(_)) => self.partial_cmp(&List(vec![other.clone()])),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Ord for Element {
|
||||
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||
self.partial_cmp(other).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc_generator(day13)]
|
||||
fn parse_input(input: &str) -> Vec<Packet> {
|
||||
let mut out = Vec::new();
|
||||
for line in input.lines() {
|
||||
let mut scanner = Scanner::new(line);
|
||||
let packet = parse_packet(&mut scanner);
|
||||
out.push(packet);
|
||||
}
|
||||
|
||||
out
|
||||
}
|
||||
|
||||
fn parse_packet(scanner: &mut Scanner) -> Packet {
|
||||
// we can pop the first character off, it's the opening brace
|
||||
scanner.pop();
|
||||
let elements = parse_list(scanner);
|
||||
// pop off the last character, the final closing brace
|
||||
assert!(scanner.pop().is_some());
|
||||
assert!(scanner.is_done());
|
||||
Packet { elements }
|
||||
}
|
||||
|
||||
fn parse_list(scanner: &mut Scanner) -> Vec<Element> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
#[aoc_run(day13, part1)]
|
||||
fn part1(input: &[Packet]) -> u32 {
|
||||
0
|
||||
}
|
||||
|
||||
#[aoc_run(day13, part2)]
|
||||
fn part2(input: &[Packet]) -> u32 {
|
||||
0
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
const INPUT: &str = "[1,1,3,1,1]
|
||||
[1,1,5,1,1]
|
||||
|
||||
[[1],[2,3,4]]
|
||||
[[1],4]
|
||||
|
||||
[9]
|
||||
[[8,7,6]]
|
||||
|
||||
[[4,4],4,4]
|
||||
[[4,4],4,4,4]
|
||||
|
||||
[7,7,7,7]
|
||||
[7,7,7]
|
||||
|
||||
[]
|
||||
[3]
|
||||
|
||||
[[[]]]
|
||||
[[]]
|
||||
|
||||
[1,[2,[3,[4,[5,6,7]]]],8,9]
|
||||
[1,[2,[3,[4,[5,6,0]]]],8,9]";
|
||||
|
||||
#[test]
|
||||
fn part1_test() {
|
||||
let v = parse_input(INPUT);
|
||||
|
||||
assert_eq!(part1(&v), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_test() {
|
||||
let v = parse_input(INPUT);
|
||||
assert_eq!(part2(&v), 1);
|
||||
}
|
||||
}
|
|
@ -12,5 +12,6 @@ mod d9;
|
|||
mod d10;
|
||||
mod d11;
|
||||
mod d12;
|
||||
mod d13;
|
||||
|
||||
aoc_lib! { year = 2022 }
|
||||
|
|
Loading…
Reference in a new issue