summaryrefslogtreecommitdiff
path: root/aoc_2022/day-01/sol.c
blob: 612692af0bb1e3a1c8767dd65b7626a529b49165 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>

#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))

/*
  USAGE: ./sol <inputfile>
*/

int get_my_score(char elf, char me)
{
  int elf_choice = (int)(elf - 'A') + 1;
  int my_choice = (int)(me - 'X') + 1;
  int i_won = 0;
  if (elf_choice == my_choice)
    return my_choice + 3;

  switch (elf_choice + my_choice)
  {
  case 3:
    i_won = (elf_choice == 1);
    break;
  case 4:
    i_won = (elf_choice == 3);
    break;
  case 5:
    i_won = (elf_choice == 2);
    break;
  }

  return my_choice + i_won * 6;
}

const int wins[3] = {2, 3, 1};
const int loss[3] = {3, 1, 2};

int get_my_score_2(char elf, char me)
{
  int elf_choice = (int)(elf - 'A') + 1;
  int outcome = (int)(me - 'X') + 1;

  if (outcome == 2)
    return elf_choice + 3;

  if (outcome == 1)
    return loss[elf_choice - 1];
  return 6 + wins[elf_choice - 1];
}

int main(int argc, char *argv[])
{
  char *fileName = argv[1];

  FILE *file = fopen(fileName, "r");
  char line[256];
  char elf, me;

  int score1 = 0;
  int score2 = 0;
  while (1)
  {
    int i = fscanf(file, "%c %c\n", &elf, &me);
    if (i == EOF)
      break;
    score1 += get_my_score(elf, me);
    score2 += get_my_score_2(elf, me);
  }

  printf("Score one: %d\n", score1);
  printf("Score two: %d\n", score2);

  fclose(file);
  return 0;
}