fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <time.h>
  5.  
  6. #define RUNNING 0
  7. #define INFECTED 1
  8. #define RECOVERED 2
  9.  
  10. typedef struct game_info {
  11. int num_systems;
  12. int infected_systems;
  13. float infection_rate;
  14. float recovered_rate;
  15. float patch_rate;
  16. } Info;
  17.  
  18. typedef struct sys {
  19. int system_num;
  20. /**
  21.   * 0 = Running, Not Infected
  22.   * 1 = Infected, Spreading
  23.   * 2 = Recovered, Patched
  24.   */
  25. int status;
  26. } System;
  27.  
  28. void print_game_info(Info *info);
  29. void run_game(Info *info);
  30. bool print_population_info(System **systems, int num_systems);
  31.  
  32. int main(int argc, char *argv[]) {
  33.  
  34. /*if (argc != 6) {
  35.   fprintf(stderr, "usage: ./main [systems] [infected] [rate 1] [rate 2] [rate 3]\n");
  36.   return EXIT_FAILURE;
  37.   }*/
  38.  
  39. srand(time(NULL));
  40.  
  41. Info *info = NULL;
  42. info = calloc(1, sizeof(Info));
  43.  
  44. printf("input: ");
  45. fscanf(stdin, "%d %d %f %f %f", &info->num_systems, &info->infected_systems, &info->infection_rate, &info->recovered_rate, &info->patch_rate);
  46. printf("\n");
  47.  
  48. /*sscanf(argv[1], "%d", &info->num_systems);
  49.   sscanf(argv[2], "%d", &info->infected_systems);
  50.   sscanf(argv[3], "%f", &info->infection_rate);
  51.   sscanf(argv[4], "%f", &info->recovered_rate);
  52.   sscanf(argv[5], "%f", &info->patch_rate);*/
  53.  
  54. print_game_info(info);
  55. run_game(info);
  56.  
  57. free(info);
  58.  
  59. return EXIT_SUCCESS;
  60. }
  61.  
  62. void run_game(Info *info) {
  63. int num_systems = info->num_systems;
  64. int initial_infected = info->infected_systems;
  65. float infection_rate = info->infection_rate;
  66. float recovered_rate = info->recovered_rate;
  67. float patch_rate = info->patch_rate;
  68.  
  69. bool running = true;
  70.  
  71. // Setting up all the systems
  72. System **systems = NULL;
  73. systems = calloc(num_systems, sizeof(System *));
  74. unsigned int i;
  75. for (i = 0; i < num_systems; i++) {
  76. systems[i] = calloc(1, sizeof(System));
  77. systems[i]->system_num = i + 1;
  78. systems[i]->status = (i < initial_infected) ? INFECTED : RUNNING;
  79. }
  80.  
  81. printf("Beginning Simulation:\n");
  82. print_population_info(systems, num_systems);
  83. while (running == true) {
  84. for (i = 0; i < num_systems; i++) {
  85. System *sys = systems[i];
  86. float random = (rand() % 10) / 10.0;
  87. switch (sys->status) {
  88. case RUNNING:
  89. if (random <= infection_rate) {
  90. systems[i]->status = INFECTED;
  91. } else if (random <= patch_rate) {
  92. systems[i]->status = RECOVERED;
  93. }
  94. break;
  95. case INFECTED:
  96. if (random <= recovered_rate) {
  97. systems[i]->status = RECOVERED;
  98. }
  99. break;
  100. case RECOVERED:
  101. break;
  102. default:
  103. fprintf(stderr, "error finding status of system %d\n", (i + 1));
  104. break;
  105. }
  106. }
  107. bool stop = print_population_info(systems, num_systems);
  108. if (stop)
  109. running = false;
  110. }
  111.  
  112. for (i = 0; i < num_systems; i++)
  113. free(systems[i]);
  114. free(systems);
  115. }
  116.  
  117. bool print_population_info(System **systems, int num_systems) {
  118. int running = 0;
  119. int infected = 0;
  120. int patched = 0;
  121.  
  122. unsigned int i;
  123. for (i = 0; i < num_systems; i++) {
  124. switch (systems[i]->status) {
  125. case RUNNING:
  126. running++;
  127. break;
  128. case INFECTED:
  129. infected++;
  130. break;
  131. case RECOVERED:
  132. patched++;
  133. break;
  134. default:
  135. fprintf(stderr, "error with status code of system %d\n", systems[i]->status);
  136. break;
  137. }
  138. }
  139. printf("\tRunning: %d\tInfected: %d\tPatched: %d\n", running, infected, patched);
  140. if (patched == num_systems)
  141. return true;
  142. return false;
  143. }
  144.  
  145. void print_game_info(Info *info) {
  146. printf("Game Information:\n");
  147. printf("\tSystem Population: %d\n", info->num_systems);
  148. printf("\tInitial Infected Systems: %d\n", info->infected_systems);
  149. printf("\tInfection Rate: %0.3f\t(Opportunites -> Infection)\n", info->infection_rate);
  150. printf("\tRecovery Rate: %0.3f\t(Infection -> Recovered)\n", info->recovered_rate);
  151. printf("\tPatch Rate: %0.3f\t(Opportunities -> Patched)\n", info->patch_rate);
  152. }
Success #stdin #stdout 0.01s 9440KB
stdin
10000 10 0.01 0.01 0.015
stdout
input: 
Game Information:
	System Population: 10000
	Initial Infected Systems: 10
	Infection Rate: 0.010	(Opportunites -> Infection)
	Recovery Rate: 0.010	(Infection -> Recovered)
	Patch Rate: 0.015	(Opportunities -> Patched)
Beginning Simulation:
	Running: 9990	Infected: 10	Patched: 0
	Running: 9032	Infected: 967	Patched: 1
	Running: 8097	Infected: 1825	Patched: 78
	Running: 7292	Infected: 2450	Patched: 258
	Running: 6569	Infected: 2923	Patched: 508
	Running: 5928	Infected: 3257	Patched: 815
	Running: 5360	Infected: 3481	Patched: 1159
	Running: 4832	Infected: 3673	Patched: 1495
	Running: 4345	Infected: 3795	Patched: 1860
	Running: 3925	Infected: 3855	Patched: 2220
	Running: 3521	Infected: 3897	Patched: 2582
	Running: 3175	Infected: 3875	Patched: 2950
	Running: 2856	Infected: 3828	Patched: 3316
	Running: 2565	Infected: 3728	Patched: 3707
	Running: 2311	Infected: 3618	Patched: 4071
	Running: 2112	Infected: 3473	Patched: 4415
	Running: 1892	Infected: 3359	Patched: 4749
	Running: 1706	Infected: 3210	Patched: 5084
	Running: 1529	Infected: 3069	Patched: 5402
	Running: 1377	Infected: 2902	Patched: 5721
	Running: 1236	Infected: 2740	Patched: 6024
	Running: 1103	Infected: 2583	Patched: 6314
	Running: 980	Infected: 2460	Patched: 6560
	Running: 887	Infected: 2310	Patched: 6803
	Running: 795	Infected: 2178	Patched: 7027
	Running: 729	Infected: 2034	Patched: 7237
	Running: 662	Infected: 1888	Patched: 7450
	Running: 605	Infected: 1776	Patched: 7619
	Running: 548	Infected: 1645	Patched: 7807
	Running: 501	Infected: 1524	Patched: 7975
	Running: 451	Infected: 1433	Patched: 8116
	Running: 393	Infected: 1365	Patched: 8242
	Running: 357	Infected: 1259	Patched: 8384
	Running: 321	Infected: 1169	Patched: 8510
	Running: 282	Infected: 1093	Patched: 8625
	Running: 250	Infected: 1011	Patched: 8739
	Running: 220	Infected: 941	Patched: 8839
	Running: 202	Infected: 865	Patched: 8933
	Running: 184	Infected: 794	Patched: 9022
	Running: 167	Infected: 733	Patched: 9100
	Running: 140	Infected: 684	Patched: 9176
	Running: 130	Infected: 619	Patched: 9251
	Running: 118	Infected: 571	Patched: 9311
	Running: 103	Infected: 518	Patched: 9379
	Running: 91	Infected: 468	Patched: 9441
	Running: 86	Infected: 424	Patched: 9490
	Running: 77	Infected: 395	Patched: 9528
	Running: 68	Infected: 370	Patched: 9562
	Running: 58	Infected: 345	Patched: 9597
	Running: 51	Infected: 323	Patched: 9626
	Running: 46	Infected: 292	Patched: 9662
	Running: 40	Infected: 267	Patched: 9693
	Running: 40	Infected: 244	Patched: 9716
	Running: 34	Infected: 230	Patched: 9736
	Running: 26	Infected: 211	Patched: 9763
	Running: 24	Infected: 194	Patched: 9782
	Running: 21	Infected: 180	Patched: 9799
	Running: 20	Infected: 163	Patched: 9817
	Running: 18	Infected: 149	Patched: 9833
	Running: 18	Infected: 134	Patched: 9848
	Running: 14	Infected: 129	Patched: 9857
	Running: 14	Infected: 120	Patched: 9866
	Running: 14	Infected: 105	Patched: 9881
	Running: 13	Infected: 93	Patched: 9894
	Running: 11	Infected: 84	Patched: 9905
	Running: 11	Infected: 70	Patched: 9919
	Running: 9	Infected: 63	Patched: 9928
	Running: 8	Infected: 56	Patched: 9936
	Running: 8	Infected: 53	Patched: 9939
	Running: 7	Infected: 37	Patched: 9956
	Running: 7	Infected: 33	Patched: 9960
	Running: 7	Infected: 29	Patched: 9964
	Running: 7	Infected: 27	Patched: 9966
	Running: 7	Infected: 25	Patched: 9968
	Running: 7	Infected: 24	Patched: 9969
	Running: 7	Infected: 21	Patched: 9972
	Running: 7	Infected: 18	Patched: 9975
	Running: 7	Infected: 18	Patched: 9975
	Running: 7	Infected: 17	Patched: 9976
	Running: 7	Infected: 12	Patched: 9981
	Running: 6	Infected: 12	Patched: 9982
	Running: 6	Infected: 10	Patched: 9984
	Running: 4	Infected: 11	Patched: 9985
	Running: 4	Infected: 10	Patched: 9986
	Running: 4	Infected: 9	Patched: 9987
	Running: 4	Infected: 8	Patched: 9988
	Running: 4	Infected: 8	Patched: 9988
	Running: 4	Infected: 8	Patched: 9988
	Running: 4	Infected: 8	Patched: 9988
	Running: 4	Infected: 8	Patched: 9988
	Running: 4	Infected: 8	Patched: 9988
	Running: 3	Infected: 9	Patched: 9988
	Running: 3	Infected: 7	Patched: 9990
	Running: 2	Infected: 7	Patched: 9991
	Running: 2	Infected: 7	Patched: 9991
	Running: 1	Infected: 8	Patched: 9991
	Running: 1	Infected: 8	Patched: 9991
	Running: 1	Infected: 6	Patched: 9993
	Running: 1	Infected: 6	Patched: 9993
	Running: 1	Infected: 6	Patched: 9993
	Running: 0	Infected: 7	Patched: 9993
	Running: 0	Infected: 5	Patched: 9995
	Running: 0	Infected: 5	Patched: 9995
	Running: 0	Infected: 5	Patched: 9995
	Running: 0	Infected: 5	Patched: 9995
	Running: 0	Infected: 5	Patched: 9995
	Running: 0	Infected: 3	Patched: 9997
	Running: 0	Infected: 2	Patched: 9998
	Running: 0	Infected: 1	Patched: 9999
	Running: 0	Infected: 0	Patched: 10000