github.com/mnlphlp/aoc22@v0.0.0-20230330151331-c1dc4bff1b9b/aoc22_rust/src/day02.rs (about) 1 use crate::types::Task; 2 3 fn get_move(m: u8) -> u8 { 4 if m < b'D' { 5 return m - b'A'; 6 } else { 7 return m - b'X'; 8 } 9 } 10 11 fn calc_score(line: &str) -> i32 { 12 let opponent = get_move(line.bytes().nth(0).unwrap()); 13 let me = get_move(line.bytes().nth(2).unwrap()); 14 // score for pick 15 let mut score = me as i32 + 1; 16 // score for draw 17 if me == opponent { 18 score += 3 19 } 20 // score for winning 21 if (me + 2) % 3 == opponent { 22 score += 6 23 } 24 score 25 } 26 27 fn decide_move(opponent: u8, me: u8) -> u8 { 28 match me { 29 b'X' => { 30 // pick losing move 31 (opponent + 2) % 3 32 } 33 b'Z' => { 34 // pick winning move 35 (opponent + 1) % 3 36 } 37 _ => { 38 // pick draw move 39 opponent 40 } 41 } 42 } 43 44 fn calc_score2(line: &str) -> i32 { 45 let opponent = get_move(line.bytes().nth(0).unwrap()); 46 let me = decide_move(opponent, line.bytes().nth(2).unwrap()); 47 // score for pick 48 let mut score = me as i32 + 1; 49 // score for draw 50 if me == opponent { 51 score += 3 52 } 53 // score for winning 54 if (me + 2) % 3 == opponent { 55 score += 6 56 } 57 score 58 } 59 60 pub fn solve(input: &str, _debug: bool, task: Task) -> (String, String) { 61 let (mut res1, mut res2) = ("".to_string(), "".to_string()); 62 let lines: Vec<&str> = input.lines().collect(); 63 if !matches!(task, Task::Two) { 64 let mut score = 0; 65 for line in &lines { 66 if line.len() == 0 { 67 continue; 68 } 69 score += calc_score(line) 70 } 71 res1 = score.to_string(); 72 } 73 74 if !matches!(task, Task::One) { 75 let mut score = 0; 76 for line in &lines { 77 if line.len() == 0 { 78 continue; 79 } 80 score += calc_score2(line) 81 } 82 res2 = score.to_string(); 83 } 84 (res1, res2) 85 }