- #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=