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;
}
|