Day 13 - task 2
This commit is contained in:
		
							parent
							
								
									3d80103536
								
							
						
					
					
						commit
						22a46d10a6
					
				
					 1 changed files with 49 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -6,6 +6,7 @@ pub fn solve() {
 | 
			
		|||
 | 
			
		||||
    let contents = fs::read_to_string(path).expect("I/O error, wrong path?");
 | 
			
		||||
 | 
			
		||||
    // Task 1
 | 
			
		||||
    let pairs: Vec<(&str, &str)> = contents
 | 
			
		||||
        .split("\n\n")
 | 
			
		||||
        .map(|pair| pair.split_at(pair.find("\n").unwrap()))
 | 
			
		||||
| 
						 | 
				
			
			@ -16,10 +17,10 @@ pub fn solve() {
 | 
			
		|||
        let json1: Value = serde_json::from_str(pair.0).unwrap();
 | 
			
		||||
        let json2: Value = serde_json::from_str(pair.1).unwrap();
 | 
			
		||||
 | 
			
		||||
        println!("== Pair {} ==", i+1);
 | 
			
		||||
        // println!("== Pair {} ==", i+1);
 | 
			
		||||
        let res = is_right_order((&json1, &json2));
 | 
			
		||||
 | 
			
		||||
        println!("Pair {}: {res:?}\n", i+1);
 | 
			
		||||
        // println!("Pair {}: {res:?}\n", i+1);
 | 
			
		||||
 | 
			
		||||
        if res != Ordered::No {
 | 
			
		||||
            right_order_indices.push((i+1) as u32);
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +30,46 @@ pub fn solve() {
 | 
			
		|||
    let res: u32 = right_order_indices.iter().sum();
 | 
			
		||||
    println!("Result 1: {res}");
 | 
			
		||||
 | 
			
		||||
    // Task 2
 | 
			
		||||
    let mut packets: Vec<Value> = contents
 | 
			
		||||
        .lines()
 | 
			
		||||
        .filter(|line| *line != "")
 | 
			
		||||
        .map(|line| serde_json::from_str(line).unwrap())
 | 
			
		||||
        .collect();
 | 
			
		||||
    
 | 
			
		||||
    // add [[2]] and [[6]] as divider packets
 | 
			
		||||
    packets.push(serde_json::from_str("[[6]]").unwrap());
 | 
			
		||||
    packets.push(serde_json::from_str("[[2]]").unwrap());
 | 
			
		||||
 | 
			
		||||
    // sort by compare function using is_right_order
 | 
			
		||||
    packets.sort_by(|a, b| 
 | 
			
		||||
        match is_right_order((a, b)) {
 | 
			
		||||
            Ordered::Yes => Ordering::Less,
 | 
			
		||||
            Ordered::Maybe => Ordering::Equal,
 | 
			
		||||
            Ordered::No => Ordering::Greater
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // find [[2]] and [[6]] indices
 | 
			
		||||
    let mut i2 = 0;
 | 
			
		||||
    let mut i6 = 0;
 | 
			
		||||
    packets.iter().enumerate().for_each(|(i, v)| {
 | 
			
		||||
        if v.is_array() && v.as_array().unwrap().len() == 1 {
 | 
			
		||||
            let v = v.as_array().unwrap();
 | 
			
		||||
            if v[0].is_array() && v[0].as_array().unwrap().len() == 1 {
 | 
			
		||||
                let v = v[0].as_array().unwrap();
 | 
			
		||||
                if v[0].is_number() && v[0].as_u64().unwrap() == 2 {
 | 
			
		||||
                    i2 = i+1
 | 
			
		||||
                }
 | 
			
		||||
                else if v[0].is_number() && v[0].as_u64().unwrap() == 6 {
 | 
			
		||||
                    i6 = i+1
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    let res = i2*i6;
 | 
			
		||||
 | 
			
		||||
    println!("Result 2: {res}");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(PartialEq, Debug)]
 | 
			
		||||
| 
						 | 
				
			
			@ -39,8 +79,10 @@ enum Ordered {
 | 
			
		|||
    No
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// returns whether the passed Values are in the right order
 | 
			
		||||
// with Ordered enum option
 | 
			
		||||
fn is_right_order(values: (&Value, &Value)) -> Ordered {
 | 
			
		||||
    println!("Compare {} vs {}", values.0, values.1);
 | 
			
		||||
    //println!("Compare {} vs {}", values.0, values.1);
 | 
			
		||||
    
 | 
			
		||||
    // both values numbers
 | 
			
		||||
    if values.0.is_number() && values.1.is_number() {
 | 
			
		||||
| 
						 | 
				
			
			@ -79,14 +121,17 @@ fn is_right_order(values: (&Value, &Value)) -> Ordered {
 | 
			
		|||
            let left = a0iter.next();
 | 
			
		||||
            let right = a1iter.next();
 | 
			
		||||
 | 
			
		||||
            // left smaller, counts as ordered
 | 
			
		||||
            if left.is_none() && right.is_some() {
 | 
			
		||||
                return Ordered::Yes
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // right smaller, counts as unordered
 | 
			
		||||
            if left.is_some() && right.is_none() {
 | 
			
		||||
                return Ordered::No
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // both have same length, doesn't say anything about ordering
 | 
			
		||||
            if left.is_none() && right.is_none() {
 | 
			
		||||
                return Ordered::Maybe
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -94,6 +139,7 @@ fn is_right_order(values: (&Value, &Value)) -> Ordered {
 | 
			
		|||
            let left = left.unwrap();
 | 
			
		||||
            let right = right.unwrap();
 | 
			
		||||
 | 
			
		||||
            // only go into next iteration if not definitely yes or no
 | 
			
		||||
            let res = is_right_order((&left, &right));
 | 
			
		||||
            if res != Ordered::Maybe {
 | 
			
		||||
                return res
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue