Add src/05part2.rs
This commit is contained in:
		
						commit
						2833e1dc93
					
				
							
								
								
									
										162
									
								
								src/05part2.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								src/05part2.rs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,162 @@
 | 
			
		|||
use std::fs;
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    let file_path = "input/05input.txt";
 | 
			
		||||
    let contents = fs::read_to_string(file_path).expect("should read file");
 | 
			
		||||
    let mut lines = contents.lines();
 | 
			
		||||
    let seeds_str = lines.next().unwrap().strip_prefix("seeds: ").unwrap();
 | 
			
		||||
    let mut seeds: Vec<i128> = seeds_str.split(" ").map(|x| {x.parse::<i128>().ok().unwrap()}).collect();
 | 
			
		||||
    let mut soil = Vec::new();
 | 
			
		||||
    lines.next();
 | 
			
		||||
    lines.next();
 | 
			
		||||
    seeds = sort_by_pair(seeds);
 | 
			
		||||
    loop {
 | 
			
		||||
        let line = lines.next().unwrap();
 | 
			
		||||
        if line == "" {
 | 
			
		||||
            soil.append(&mut seeds);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        process_line(line, &mut seeds, &mut soil);
 | 
			
		||||
    }
 | 
			
		||||
    soil = sort_by_pair(soil);
 | 
			
		||||
    let mut fertilizer = Vec::new();
 | 
			
		||||
    lines.next();
 | 
			
		||||
    loop {
 | 
			
		||||
        let line = lines.next().unwrap();
 | 
			
		||||
        if line == "" {
 | 
			
		||||
            fertilizer.append(&mut soil);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        process_line(line, &mut soil, &mut fertilizer);
 | 
			
		||||
    }
 | 
			
		||||
    fertilizer = sort_by_pair(fertilizer);
 | 
			
		||||
    let mut water = Vec::new();
 | 
			
		||||
    lines.next();
 | 
			
		||||
    loop {
 | 
			
		||||
        let line = lines.next().unwrap();
 | 
			
		||||
        if line == "" {
 | 
			
		||||
            water.append(&mut fertilizer);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        process_line(line, &mut fertilizer, &mut water);
 | 
			
		||||
    }
 | 
			
		||||
    water = sort_by_pair(water);
 | 
			
		||||
    let mut light = Vec::new();
 | 
			
		||||
    lines.next();
 | 
			
		||||
    loop {
 | 
			
		||||
        let line = lines.next().unwrap();
 | 
			
		||||
        if line == "" {
 | 
			
		||||
            light.append(&mut water);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        process_line(line, &mut water, &mut light);
 | 
			
		||||
    }
 | 
			
		||||
    light = sort_by_pair(light);
 | 
			
		||||
    let mut temperature = Vec::new();
 | 
			
		||||
    lines.next();
 | 
			
		||||
    loop {
 | 
			
		||||
        let line = lines.next().unwrap();
 | 
			
		||||
        if line == "" {
 | 
			
		||||
            temperature.append(&mut light);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        process_line(line, &mut light, &mut temperature);
 | 
			
		||||
    }
 | 
			
		||||
    temperature = sort_by_pair(temperature);
 | 
			
		||||
    let mut humidity = Vec::new();
 | 
			
		||||
    lines.next();
 | 
			
		||||
    loop {
 | 
			
		||||
        let line = lines.next().unwrap();
 | 
			
		||||
        if line == "" {
 | 
			
		||||
            humidity.append(&mut temperature);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        process_line(line, &mut temperature, &mut humidity);
 | 
			
		||||
    }
 | 
			
		||||
    humidity = sort_by_pair(humidity);
 | 
			
		||||
    let mut location = Vec::new();
 | 
			
		||||
    lines.next();
 | 
			
		||||
    loop {
 | 
			
		||||
        match lines.next() {
 | 
			
		||||
            Some(line) => {
 | 
			
		||||
                process_line(line, &mut humidity, &mut location);
 | 
			
		||||
            },
 | 
			
		||||
            None => {
 | 
			
		||||
                location.append(&mut humidity);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    location = sort_by_pair(location);
 | 
			
		||||
    println!("{:?}", location.first().unwrap());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn range_from_line(line: &str) -> (i128, i128, i128) {
 | 
			
		||||
    let mut nums = line.split_whitespace();
 | 
			
		||||
    let dest = nums.next().unwrap().parse::<i128>().ok().unwrap();
 | 
			
		||||
    let source = nums.next().unwrap().parse::<i128>().ok().unwrap();
 | 
			
		||||
    let count = nums.next().unwrap().parse::<i128>().ok().unwrap();
 | 
			
		||||
    return (source, dest, count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn process_line(line: &str, input_vec: &mut Vec<i128>, out_vec: &mut Vec<i128>) {
 | 
			
		||||
    let values = range_from_line(line);
 | 
			
		||||
    let input_clone = input_vec.clone();
 | 
			
		||||
    let mut index = 0;
 | 
			
		||||
    for n in 0..input_clone.len()/2 {
 | 
			
		||||
        if input_clone[n*2] < values.0 + values.2 && input_clone[n*2] >= values.0 {
 | 
			
		||||
            out_vec.push(input_clone[n*2] - values.0 + values.1);
 | 
			
		||||
            if input_clone[n*2+1] <= values.2 - (input_clone[n*2] - values.0) {
 | 
			
		||||
                out_vec.push(input_clone[n*2+1]);
 | 
			
		||||
                input_vec.remove(index);
 | 
			
		||||
                input_vec.remove(index);
 | 
			
		||||
            } else {
 | 
			
		||||
                out_vec.push(values.2 - 1);
 | 
			
		||||
                input_vec.push(values.0 + values.2);
 | 
			
		||||
                input_vec.push(input_clone[n*2+1] - values.2 + 1);
 | 
			
		||||
                input_vec.remove(index);
 | 
			
		||||
                input_vec.remove(index);
 | 
			
		||||
            }
 | 
			
		||||
        } else if input_clone[n*2] < values.0 && input_clone[n*2] + input_clone[n*2+1] >= values.0 {
 | 
			
		||||
            out_vec.push(values.1);
 | 
			
		||||
            if input_clone[n*2] + input_clone[n*2+1] > values.0 + values.2 {
 | 
			
		||||
                out_vec.push(values.2 - 1);
 | 
			
		||||
                input_vec.push(input_clone[n*2]);
 | 
			
		||||
                input_vec.push(values.0 - input_clone[n*2]);
 | 
			
		||||
                input_vec.push(values.0 + values.2);
 | 
			
		||||
                input_vec.push(input_clone[n*2] + input_clone[n*2+1] - values.0 - values.2);
 | 
			
		||||
                input_vec.remove(index);
 | 
			
		||||
                input_vec.remove(index);
 | 
			
		||||
            } else {
 | 
			
		||||
                out_vec.push(input_clone[n*2] - values.0 + input_clone[n*2+1] - 1);
 | 
			
		||||
                input_vec.push(input_clone[n*2]);
 | 
			
		||||
                input_vec.push(values.0 - input_clone[n*2]);
 | 
			
		||||
                input_vec.remove(index);
 | 
			
		||||
                input_vec.remove(index);
 | 
			
		||||
            }
 | 
			
		||||
        } else if input_clone[n*2] + input_clone[n*2+1] < values.0 {
 | 
			
		||||
            index += 2;
 | 
			
		||||
        } else {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn sort_by_pair(input_vec: Vec<i128>) -> Vec<i128> {
 | 
			
		||||
    let mut sort_vec = Vec::new();
 | 
			
		||||
    let mut out_vec = Vec::new();
 | 
			
		||||
    for i in 0..input_vec.len()/2 {
 | 
			
		||||
        if input_vec[i*2+1] == 0 {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        let insert_index: usize;
 | 
			
		||||
        match sort_vec.binary_search(&input_vec[i*2]) {
 | 
			
		||||
            Ok(val) => insert_index = val,
 | 
			
		||||
            Err(val) => insert_index = val,
 | 
			
		||||
        }
 | 
			
		||||
        sort_vec.insert(insert_index, input_vec[i*2]);
 | 
			
		||||
        out_vec.insert(insert_index * 2, input_vec[i*2]);
 | 
			
		||||
        out_vec.insert(insert_index*2+1, input_vec[i*2+1]);
 | 
			
		||||
    }
 | 
			
		||||
    return out_vec;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user