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  }