aboutsummaryrefslogtreecommitdiff
path: root/day16/day16.c
blob: bdff4dfbe33e2bd0ebecc335a79eee56199cb004 (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <stdio.h>
#include <string.h>

typedef struct {
  int
    children,
    cats,
    samoyeds,
    pomeranians,
    akitas,
    vizslas,
    goldfish,
    trees,
    cars,
    perfumes;
} knowledge;

knowledge machine = {
  .children = 3,
  .cats = 7,
  .samoyeds = 2,
  .pomeranians = 3,
  .akitas = 0,
  .vizslas = 0,
  .goldfish = 5,
  .trees = 3,
  .cars = 2,
  .perfumes = 1
};

void initknowledge(knowledge* k) {
  k->children = -1;
  k->cats = -1;
  k->samoyeds = -1;
  k->pomeranians = -1;
  k->akitas = -1;
  k->vizslas = -1;
  k->goldfish = -1;
  k->trees = -1;
  k->cars = -1;
  k->perfumes = -1;
}

void loadknowledge(knowledge* k, char* key, int value) {
         if(strncmp(key, "children",     8) == 0) {
    k->children = value;
  } else if(strncmp(key, "cats",         4) == 0) {
    k->cats = value;
  } else if(strncmp(key, "samoyeds",     8) == 0) {
    k->samoyeds = value;
  } else if(strncmp(key, "pomeranians", 11) == 0) {
    k->pomeranians = value;
  } else if(strncmp(key, "akitas",       6) == 0) {
    k->akitas = value;
  } else if(strncmp(key, "vizslas",      7) == 0) {
    k->vizslas = value;
  } else if(strncmp(key, "goldfish",     8) == 0) {
    k->goldfish = value;
  } else if(strncmp(key, "trees",        5) == 0) {
    k->trees = value;
  } else if(strncmp(key, "cars",         4) == 0) {
    k->cars = value;
  } else if(strncmp(key, "perfumes",     8) == 0) {
    k->perfumes = value;
  }
}

int matchknowledges(knowledge* a, knowledge* b) {
  int val = 1;

  if(a->children    != -1 && b->children    != -1 && a->children    != b->children)    val = 0;
  if(a->cats        != -1 && b->cats        != -1 && a->cats        != b->cats)        val = 0;
  if(a->samoyeds    != -1 && b->samoyeds    != -1 && a->samoyeds    != b->samoyeds)    val = 0;
  if(a->pomeranians != -1 && b->pomeranians != -1 && a->pomeranians != b->pomeranians) val = 0;
  if(a->akitas      != -1 && b->akitas      != -1 && a->akitas      != b->akitas)      val = 0;
  if(a->vizslas     != -1 && b->vizslas     != -1 && a->vizslas     != b->vizslas)     val = 0;
  if(a->goldfish    != -1 && b->goldfish    != -1 && a->goldfish    != b->goldfish)    val = 0;
  if(a->trees       != -1 && b->trees       != -1 && a->trees       != b->trees)       val = 0;
  if(a->cars        != -1 && b->cars        != -1 && a->cars        != b->cars)        val = 0;
  if(a->perfumes    != -1 && b->perfumes    != -1 && a->perfumes    != b->perfumes)    val = 0;

  return val;
}

int roughknowledges(knowledge* a, knowledge* b) {
  int val = 1;

  if(a->children    != -1 && b->children    != -1 && a->children    != b->children)    val = 0;
  if(a->cats        != -1 && b->cats        != -1 && a->cats         > b->cats)        val = 0;
  if(a->samoyeds    != -1 && b->samoyeds    != -1 && a->samoyeds    != b->samoyeds)    val = 0;
  if(a->pomeranians != -1 && b->pomeranians != -1 && a->pomeranians  < b->pomeranians) val = 0;
  if(a->akitas      != -1 && b->akitas      != -1 && a->akitas      != b->akitas)      val = 0;
  if(a->vizslas     != -1 && b->vizslas     != -1 && a->vizslas     != b->vizslas)     val = 0;
  if(a->goldfish    != -1 && b->goldfish    != -1 && a->goldfish     < b->goldfish)    val = 0;
  if(a->trees       != -1 && b->trees       != -1 && a->trees        > b->trees)       val = 0;
  if(a->cars        != -1 && b->cars        != -1 && a->cars        != b->cars)        val = 0;
  if(a->perfumes    != -1 && b->perfumes    != -1 && a->perfumes    != b->perfumes)    val = 0;

  return val;
}

int main() {
  knowledge sue;
  int this, know1v, know2v, know3v;
  char know1k[16], know2k[16], know3k[16];

  while(
      scanf("Sue %d: %[a-z]: %d, %[a-z]: %d, %[a-z]: %d\n",
        &this,
        know1k, &know1v,
        know2k, &know2v,
        know3k, &know3v) != EOF) {
    initknowledge(&sue);
    loadknowledge(&sue, know1k, know1v);
    loadknowledge(&sue, know2k, know2v);
    loadknowledge(&sue, know3k, know3v);
    if(matchknowledges(&machine, &sue))
      printf("Almost Sue: %d\n", this);
    if(!matchknowledges(&machine, &sue) && roughknowledges(&machine, &sue))
      printf("Actual Sue %d\n", this);
  }
  return 0;
}