#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#define RUNNING 0
#define INFECTED 1
#define RECOVERED 2
typedef struct game_info {
int num_systems;
int infected_systems;
float infection_rate;
float recovered_rate;
float patch_rate;
} Info;
typedef struct sys {
int system_num;
/**
* 0 = Running, Not Infected
* 1 = Infected, Spreading
* 2 = Recovered, Patched
*/
int status;
} System;
void print_game_info(Info *info);
void run_game(Info *info);
bool print_population_info(System **systems, int num_systems);
int main(int argc, char *argv[]) {
/*if (argc != 6) {
fprintf(stderr, "usage: ./main [systems] [infected] [rate 1] [rate 2] [rate 3]\n");
return EXIT_FAILURE;
}*/
Info *info = NULL;
info
= calloc(1, sizeof(Info
));
fscanf(stdin
, "%d %d %f %f %f", &info
->num_systems
, &info
->infected_systems
, &info
->infection_rate
, &info
->recovered_rate
, &info
->patch_rate
);
/*sscanf(argv[1], "%d", &info->num_systems);
sscanf(argv[2], "%d", &info->infected_systems);
sscanf(argv[3], "%f", &info->infection_rate);
sscanf(argv[4], "%f", &info->recovered_rate);
sscanf(argv[5], "%f", &info->patch_rate);*/
print_game_info(info);
run_game(info);
return EXIT_SUCCESS;
}
void run_game(Info *info) {
int num_systems = info->num_systems;
int initial_infected = info->infected_systems;
float infection_rate = info->infection_rate;
float recovered_rate = info->recovered_rate;
float patch_rate = info->patch_rate;
bool running = true;
// Setting up all the systems
System **systems = NULL;
systems
= calloc(num_systems
, sizeof(System
*)); unsigned int i;
for (i = 0; i < num_systems; i++) {
systems
[i
] = calloc(1, sizeof(System
)); systems[i]->system_num = i + 1;
systems[i]->status = (i < initial_infected) ? INFECTED : RUNNING;
}
printf("Beginning Simulation:\n"); print_population_info(systems, num_systems);
while (running == true) {
for (i = 0; i < num_systems; i++) {
System *sys = systems[i];
float random
= (rand() % 10) / 10.0; switch (sys->status) {
case RUNNING:
if (random <= infection_rate) {
systems[i]->status = INFECTED;
} else if (random <= patch_rate) {
systems[i]->status = RECOVERED;
}
break;
case INFECTED:
if (random <= recovered_rate) {
systems[i]->status = RECOVERED;
}
break;
case RECOVERED:
break;
default:
fprintf(stderr
, "error finding status of system %d\n", (i
+ 1)); break;
}
}
bool stop = print_population_info(systems, num_systems);
if (stop)
running = false;
}
for (i = 0; i < num_systems; i++)
}
bool print_population_info(System **systems, int num_systems) {
int running = 0;
int infected = 0;
int patched = 0;
unsigned int i;
for (i = 0; i < num_systems; i++) {
switch (systems[i]->status) {
case RUNNING:
running++;
break;
case INFECTED:
infected++;
break;
case RECOVERED:
patched++;
break;
default:
fprintf(stderr
, "error with status code of system %d\n", systems
[i
]->status
); break;
}
}
printf("\tRunning: %d\tInfected: %d\tPatched: %d\n", running
, infected
, patched
); if (patched == num_systems)
return true;
return false;
}
void print_game_info(Info *info) {
printf("Game Information:\n"); printf("\tSystem Population: %d\n", info
->num_systems
); printf("\tInitial Infected Systems: %d\n", info
->infected_systems
); printf("\tInfection Rate: %0.3f\t(Opportunites -> Infection)\n", info
->infection_rate
); printf("\tRecovery Rate: %0.3f\t(Infection -> Recovered)\n", info
->recovered_rate
); printf("\tPatch Rate: %0.3f\t(Opportunities -> Patched)\n", info
->patch_rate
); }
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNkZWZpbmUgUlVOTklORyAgICAgMAojZGVmaW5lIElORkVDVEVEICAgIDEKI2RlZmluZSBSRUNPVkVSRUQgICAyCgp0eXBlZGVmIHN0cnVjdCBnYW1lX2luZm8gewogICAgaW50IG51bV9zeXN0ZW1zOwogICAgaW50IGluZmVjdGVkX3N5c3RlbXM7CiAgICBmbG9hdCBpbmZlY3Rpb25fcmF0ZTsKICAgIGZsb2F0IHJlY292ZXJlZF9yYXRlOwogICAgZmxvYXQgcGF0Y2hfcmF0ZTsKfSBJbmZvOwoKdHlwZWRlZiBzdHJ1Y3Qgc3lzIHsKICAgIGludCBzeXN0ZW1fbnVtOwogICAgLyoqCiAgICAgKiAwID0gUnVubmluZywgTm90IEluZmVjdGVkCiAgICAgKiAxID0gSW5mZWN0ZWQsIFNwcmVhZGluZwogICAgICogMiA9IFJlY292ZXJlZCwgUGF0Y2hlZAogICAgICovCiAgICBpbnQgc3RhdHVzOwp9IFN5c3RlbTsKCnZvaWQgcHJpbnRfZ2FtZV9pbmZvKEluZm8gKmluZm8pOwp2b2lkIHJ1bl9nYW1lKEluZm8gKmluZm8pOwpib29sIHByaW50X3BvcHVsYXRpb25faW5mbyhTeXN0ZW0gKipzeXN0ZW1zLCBpbnQgbnVtX3N5c3RlbXMpOwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewoKICAgIC8qaWYgKGFyZ2MgIT0gNikgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IC4vbWFpbiBbc3lzdGVtc10gW2luZmVjdGVkXSBbcmF0ZSAxXSBbcmF0ZSAyXSBbcmF0ZSAzXVxuIik7CiAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgIH0qLwoKICAgIHNyYW5kKHRpbWUoTlVMTCkpOwoKICAgIEluZm8gKmluZm8gPSBOVUxMOwogICAgaW5mbyA9IGNhbGxvYygxLCBzaXplb2YoSW5mbykpOwoKICAgIHByaW50ZigiaW5wdXQ6ICIpOwogICAgZnNjYW5mKHN0ZGluLCAiJWQgJWQgJWYgJWYgJWYiLCAmaW5mby0+bnVtX3N5c3RlbXMsICZpbmZvLT5pbmZlY3RlZF9zeXN0ZW1zLCAmaW5mby0+aW5mZWN0aW9uX3JhdGUsICZpbmZvLT5yZWNvdmVyZWRfcmF0ZSwgJmluZm8tPnBhdGNoX3JhdGUpOwogICAgcHJpbnRmKCJcbiIpOwoKICAgIC8qc3NjYW5mKGFyZ3ZbMV0sICIlZCIsICZpbmZvLT5udW1fc3lzdGVtcyk7CiAgICBzc2NhbmYoYXJndlsyXSwgIiVkIiwgJmluZm8tPmluZmVjdGVkX3N5c3RlbXMpOwogICAgc3NjYW5mKGFyZ3ZbM10sICIlZiIsICZpbmZvLT5pbmZlY3Rpb25fcmF0ZSk7CiAgICBzc2NhbmYoYXJndls0XSwgIiVmIiwgJmluZm8tPnJlY292ZXJlZF9yYXRlKTsKICAgIHNzY2FuZihhcmd2WzVdLCAiJWYiLCAmaW5mby0+cGF0Y2hfcmF0ZSk7Ki8KCiAgICBwcmludF9nYW1lX2luZm8oaW5mbyk7CiAgICBydW5fZ2FtZShpbmZvKTsKCiAgICBmcmVlKGluZm8pOwoKICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cn0KCnZvaWQgcnVuX2dhbWUoSW5mbyAqaW5mbykgewogICAgaW50IG51bV9zeXN0ZW1zID0gaW5mby0+bnVtX3N5c3RlbXM7CiAgICBpbnQgaW5pdGlhbF9pbmZlY3RlZCA9IGluZm8tPmluZmVjdGVkX3N5c3RlbXM7CiAgICBmbG9hdCBpbmZlY3Rpb25fcmF0ZSA9IGluZm8tPmluZmVjdGlvbl9yYXRlOwogICAgZmxvYXQgcmVjb3ZlcmVkX3JhdGUgPSBpbmZvLT5yZWNvdmVyZWRfcmF0ZTsKICAgIGZsb2F0IHBhdGNoX3JhdGUgPSBpbmZvLT5wYXRjaF9yYXRlOwoKICAgIGJvb2wgcnVubmluZyA9IHRydWU7CgogICAgLy8gU2V0dGluZyB1cCBhbGwgdGhlIHN5c3RlbXMKICAgIFN5c3RlbSAqKnN5c3RlbXMgPSBOVUxMOwogICAgc3lzdGVtcyA9IGNhbGxvYyhudW1fc3lzdGVtcywgc2l6ZW9mKFN5c3RlbSAqKSk7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3lzdGVtczsgaSsrKSB7CiAgICAgICAgc3lzdGVtc1tpXSA9IGNhbGxvYygxLCBzaXplb2YoU3lzdGVtKSk7CiAgICAgICAgc3lzdGVtc1tpXS0+c3lzdGVtX251bSA9IGkgKyAxOwogICAgICAgIHN5c3RlbXNbaV0tPnN0YXR1cyA9IChpIDwgaW5pdGlhbF9pbmZlY3RlZCkgPyBJTkZFQ1RFRCA6IFJVTk5JTkc7CiAgICB9CgogICAgcHJpbnRmKCJCZWdpbm5pbmcgU2ltdWxhdGlvbjpcbiIpOwogICAgcHJpbnRfcG9wdWxhdGlvbl9pbmZvKHN5c3RlbXMsIG51bV9zeXN0ZW1zKTsKICAgIHdoaWxlIChydW5uaW5nID09IHRydWUpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5c3RlbXM7IGkrKykgewogICAgICAgICAgICBTeXN0ZW0gKnN5cyA9IHN5c3RlbXNbaV07CiAgICAgICAgICAgIGZsb2F0IHJhbmRvbSA9IChyYW5kKCkgJSAxMCkgLyAxMC4wOwogICAgICAgICAgICBzd2l0Y2ggKHN5cy0+c3RhdHVzKSB7CiAgICAgICAgICAgICAgICBjYXNlIFJVTk5JTkc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmRvbSA8PSBpbmZlY3Rpb25fcmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1zW2ldLT5zdGF0dXMgPSBJTkZFQ1RFRDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhbmRvbSA8PSBwYXRjaF9yYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbXNbaV0tPnN0YXR1cyA9IFJFQ09WRVJFRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIElORkVDVEVEOgogICAgICAgICAgICAgICAgICAgIGlmIChyYW5kb20gPD0gcmVjb3ZlcmVkX3JhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtc1tpXS0+c3RhdHVzID0gUkVDT1ZFUkVEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgUkVDT1ZFUkVEOgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGZpbmRpbmcgc3RhdHVzIG9mIHN5c3RlbSAlZFxuIiwgKGkgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYm9vbCBzdG9wID0gcHJpbnRfcG9wdWxhdGlvbl9pbmZvKHN5c3RlbXMsIG51bV9zeXN0ZW1zKTsKICAgICAgICBpZiAoc3RvcCkKICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3lzdGVtczsgaSsrKQogICAgICAgIGZyZWUoc3lzdGVtc1tpXSk7CiAgICBmcmVlKHN5c3RlbXMpOwp9Cgpib29sIHByaW50X3BvcHVsYXRpb25faW5mbyhTeXN0ZW0gKipzeXN0ZW1zLCBpbnQgbnVtX3N5c3RlbXMpIHsKICAgIGludCBydW5uaW5nID0gMDsKICAgIGludCBpbmZlY3RlZCA9IDA7CiAgICBpbnQgcGF0Y2hlZCA9IDA7CgogICAgdW5zaWduZWQgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5c3RlbXM7IGkrKykgewogICAgICAgIHN3aXRjaCAoc3lzdGVtc1tpXS0+c3RhdHVzKSB7CiAgICAgICAgICAgIGNhc2UgUlVOTklORzoKICAgICAgICAgICAgICAgIHJ1bm5pbmcrKzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIElORkVDVEVEOgogICAgICAgICAgICAgICAgaW5mZWN0ZWQrKzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFJFQ09WRVJFRDoKICAgICAgICAgICAgICAgIHBhdGNoZWQrKzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciB3aXRoIHN0YXR1cyBjb2RlIG9mIHN5c3RlbSAlZFxuIiwgc3lzdGVtc1tpXS0+c3RhdHVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHByaW50ZigiXHRSdW5uaW5nOiAlZFx0SW5mZWN0ZWQ6ICVkXHRQYXRjaGVkOiAlZFxuIiwgcnVubmluZywgaW5mZWN0ZWQsIHBhdGNoZWQpOwogICAgaWYgKHBhdGNoZWQgPT0gbnVtX3N5c3RlbXMpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7Cn0KCnZvaWQgcHJpbnRfZ2FtZV9pbmZvKEluZm8gKmluZm8pIHsKICAgIHByaW50ZigiR2FtZSBJbmZvcm1hdGlvbjpcbiIpOwogICAgcHJpbnRmKCJcdFN5c3RlbSBQb3B1bGF0aW9uOiAlZFxuIiwgaW5mby0+bnVtX3N5c3RlbXMpOwogICAgcHJpbnRmKCJcdEluaXRpYWwgSW5mZWN0ZWQgU3lzdGVtczogJWRcbiIsIGluZm8tPmluZmVjdGVkX3N5c3RlbXMpOwogICAgcHJpbnRmKCJcdEluZmVjdGlvbiBSYXRlOiAlMC4zZlx0KE9wcG9ydHVuaXRlcyAtPiBJbmZlY3Rpb24pXG4iLCBpbmZvLT5pbmZlY3Rpb25fcmF0ZSk7CiAgICBwcmludGYoIlx0UmVjb3ZlcnkgUmF0ZTogJTAuM2ZcdChJbmZlY3Rpb24gLT4gUmVjb3ZlcmVkKVxuIiwgaW5mby0+cmVjb3ZlcmVkX3JhdGUpOwogICAgcHJpbnRmKCJcdFBhdGNoIFJhdGU6ICUwLjNmXHQoT3Bwb3J0dW5pdGllcyAtPiBQYXRjaGVkKVxuIiwgaW5mby0+cGF0Y2hfcmF0ZSk7Cn0=