init
This commit is contained in:
		
							
								
								
									
										117
									
								
								d05/src/a1.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								d05/src/a1.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,117 @@
 | 
			
		||||
 | 
			
		||||
struct CargoDock {
 | 
			
		||||
    stacks : Vec<Vec<char>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl CargoDock {
 | 
			
		||||
 | 
			
		||||
    fn new() -> Self {
 | 
			
		||||
        CargoDock { stacks: vec![] }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn add_stacks(&mut self, s : Vec<Vec<char>>) {
 | 
			
		||||
        self.stacks = s; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn parse_move(inp : String) -> Vec<i32> {
 | 
			
		||||
        let mut out_vec = vec![]; 
 | 
			
		||||
        inp.split(' ').for_each(|elem| {
 | 
			
		||||
            match elem.parse::<i32>() {
 | 
			
		||||
                Ok(r) => {
 | 
			
		||||
                    out_vec.push(r); 
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                Err(_) => {}
 | 
			
		||||
            }
 | 
			
		||||
        }); 
 | 
			
		||||
 | 
			
		||||
        out_vec
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn execute_move(&mut self, m : String) {
 | 
			
		||||
 | 
			
		||||
        let parsed_move = CargoDock::parse_move(m); 
 | 
			
		||||
        
 | 
			
		||||
        let count = parsed_move[0]; 
 | 
			
		||||
        let origin : usize = (parsed_move[1] - 1) as usize; 
 | 
			
		||||
        let destination : usize = (parsed_move[2] - 1) as usize; 
 | 
			
		||||
 | 
			
		||||
        for _ in 0..count {
 | 
			
		||||
            let top = self.stacks[origin].pop().unwrap();  
 | 
			
		||||
            self.stacks[destination].push(top); 
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn get_top_layer(&self) -> String {
 | 
			
		||||
        let mut s = String::new(); 
 | 
			
		||||
 | 
			
		||||
        self.stacks.iter().for_each(|vec| {
 | 
			
		||||
            s.push(*vec.last().unwrap()); 
 | 
			
		||||
        }); 
 | 
			
		||||
 | 
			
		||||
        s 
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn parse_stack(inp : Vec<String>) -> Vec<Vec<char>> {
 | 
			
		||||
    let mut vec : Vec<Vec<char>> = vec![]; 
 | 
			
		||||
    vec.push(vec![]); 
 | 
			
		||||
 | 
			
		||||
    inp.iter().for_each(|elem| {
 | 
			
		||||
        if elem.contains('1') {
 | 
			
		||||
            return; 
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let res = elem.split(' ').collect::<Vec<&str>>();
 | 
			
		||||
        let mut space_count = 0; 
 | 
			
		||||
        let mut index = 0; 
 | 
			
		||||
        for s in &res {
 | 
			
		||||
            if s.is_empty() {
 | 
			
		||||
                space_count += 1; 
 | 
			
		||||
 | 
			
		||||
            } else {
 | 
			
		||||
                let found_char = s.chars().nth(1).unwrap();
 | 
			
		||||
                index += space_count / 4;
 | 
			
		||||
                space_count = 0; 
 | 
			
		||||
                while vec.len() < index + 1 {
 | 
			
		||||
                    vec.push(vec![]); 
 | 
			
		||||
                }
 | 
			
		||||
                vec[index].push(found_char); 
 | 
			
		||||
                index += 1; 
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }); 
 | 
			
		||||
 | 
			
		||||
    for v in &mut vec {
 | 
			
		||||
        v.reverse(); 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vec
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn run(inp :Vec<String>) {
 | 
			
		||||
    
 | 
			
		||||
    let mut prev = 0; 
 | 
			
		||||
 | 
			
		||||
    let mut cd = CargoDock::new(); 
 | 
			
		||||
 | 
			
		||||
    for i in 0..inp.len() {
 | 
			
		||||
        if inp[i].is_empty() {
 | 
			
		||||
            let stacks = parse_stack(inp[0..i].to_vec());
 | 
			
		||||
            cd.add_stacks(stacks); 
 | 
			
		||||
            prev = i; 
 | 
			
		||||
            break; 
 | 
			
		||||
        }   
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for i in (prev+1)..inp.len() {
 | 
			
		||||
        cd.execute_move(inp[i].clone()); 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    println!("a1: {:?}", cd.get_top_layer()); 
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										116
									
								
								d05/src/a2.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								d05/src/a2.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
 | 
			
		||||
struct CargoDock {
 | 
			
		||||
    stacks : Vec<Vec<char>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl CargoDock {
 | 
			
		||||
 | 
			
		||||
    fn new() -> Self {
 | 
			
		||||
        CargoDock { stacks: vec![] }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn add_stacks(&mut self, s : Vec<Vec<char>>) {
 | 
			
		||||
        self.stacks = s; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn parse_move(inp : String) -> Vec<i32> {
 | 
			
		||||
        let mut out_vec = vec![]; 
 | 
			
		||||
        inp.split(' ').for_each(|elem| {
 | 
			
		||||
            match elem.parse::<i32>() {
 | 
			
		||||
                Ok(i) => { out_vec.push(i); } 
 | 
			
		||||
                
 | 
			
		||||
                Err(_) => {}
 | 
			
		||||
            }
 | 
			
		||||
        }); 
 | 
			
		||||
 | 
			
		||||
        out_vec
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn execute_move(&mut self, m : String) {
 | 
			
		||||
 | 
			
		||||
        let parsed_move = CargoDock::parse_move(m); 
 | 
			
		||||
        
 | 
			
		||||
        let count = parsed_move[0]; 
 | 
			
		||||
        let origin : usize = (parsed_move[1] - 1) as usize; 
 | 
			
		||||
        let destination : usize = (parsed_move[2] - 1) as usize; 
 | 
			
		||||
        let mut tmp_vec : Vec<char> = vec![]; 
 | 
			
		||||
        for _ in 0..count {
 | 
			
		||||
            let top = self.stacks[origin].pop().unwrap();  
 | 
			
		||||
            tmp_vec.push(top); 
 | 
			
		||||
        }
 | 
			
		||||
        tmp_vec.reverse(); 
 | 
			
		||||
        self.stacks[destination].append(&mut tmp_vec); 
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn get_top_layer(&self) -> String {
 | 
			
		||||
        let mut s = String::new(); 
 | 
			
		||||
 | 
			
		||||
        self.stacks.iter().for_each(|vec| {
 | 
			
		||||
            s.push(*vec.last().unwrap()); 
 | 
			
		||||
        }); 
 | 
			
		||||
 | 
			
		||||
        s 
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn parse_stack(inp : Vec<String>) -> Vec<Vec<char>> {
 | 
			
		||||
    let mut vec : Vec<Vec<char>> = vec![vec![]]; 
 | 
			
		||||
 | 
			
		||||
    inp.iter().for_each(|elem| {
 | 
			
		||||
        if elem.contains('1') {
 | 
			
		||||
            return; 
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let res = elem.split(' ').collect::<Vec<&str>>();
 | 
			
		||||
        let mut space_count = 0; 
 | 
			
		||||
        let mut index = 0; 
 | 
			
		||||
        for s in &res {
 | 
			
		||||
            if s.is_empty() {
 | 
			
		||||
                space_count += 1; 
 | 
			
		||||
 | 
			
		||||
            } else {
 | 
			
		||||
                let found_char = s.chars().nth(1).unwrap();
 | 
			
		||||
                index += space_count / 4;
 | 
			
		||||
                space_count = 0; 
 | 
			
		||||
                while vec.len() < index + 1 {
 | 
			
		||||
                    vec.push(vec![]); 
 | 
			
		||||
                }
 | 
			
		||||
                vec[index].push(found_char); 
 | 
			
		||||
                index += 1; 
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }); 
 | 
			
		||||
 | 
			
		||||
    for v in &mut vec {
 | 
			
		||||
        v.reverse(); 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vec
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn run(inp :Vec<String>) {
 | 
			
		||||
    
 | 
			
		||||
    let mut prev = 0; 
 | 
			
		||||
 | 
			
		||||
    let mut cd = CargoDock::new(); 
 | 
			
		||||
 | 
			
		||||
    for i in 0..inp.len() {
 | 
			
		||||
        if inp[i].is_empty() {
 | 
			
		||||
            let stacks = parse_stack(inp[0..i].to_vec());
 | 
			
		||||
            cd.add_stacks(stacks); 
 | 
			
		||||
            prev = i; 
 | 
			
		||||
            break; 
 | 
			
		||||
        }   
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for i in (prev+1)..inp.len() {
 | 
			
		||||
        cd.execute_move(inp[i].clone()); 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    println!("a2: {:?}", cd.get_top_layer()); 
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								d05/src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								d05/src/main.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
use std::io::BufRead; 
 | 
			
		||||
 | 
			
		||||
mod a1; 
 | 
			
		||||
mod a2; 
 | 
			
		||||
 | 
			
		||||
fn read_file(path :&str) -> Vec<String> {
 | 
			
		||||
 | 
			
		||||
    return match std::fs::File::open(path) {
 | 
			
		||||
     
 | 
			
		||||
        Ok(handle) => {
 | 
			
		||||
 | 
			
		||||
            let reader = std::io::BufReader::new(handle);
 | 
			
		||||
 | 
			
		||||
            let mut vec : Vec<String> = vec![]; 
 | 
			
		||||
 | 
			
		||||
            reader.lines().for_each(|elem| {
 | 
			
		||||
                vec.push(elem.unwrap()); 
 | 
			
		||||
            }); 
 | 
			
		||||
 | 
			
		||||
            vec
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Err(_) => vec![] 
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    
 | 
			
		||||
    let inp :Vec<String> = read_file("input.txt"); 
 | 
			
		||||
 | 
			
		||||
    a1::run(inp.clone()); 
 | 
			
		||||
 | 
			
		||||
    a2::run(inp);
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user