Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.34 KB | None | 0 0
  1. // Problem name : Autumn Leaves
  2. // to do
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. #define all(v) v.begin(),v.end()
  6.  
  7. string affectedFiles = "Affected Files are :\n";
  8. char slug[200];
  9.  
  10. struct MetaData { // done
  11.     string tcValue; // Hand made cases
  12.     int n; // if 0, don't process it
  13.     int q;
  14.     int percentage;
  15.     int min_leaves;
  16.     int max_leaves;
  17.     int max_days;
  18.     int min_segment_length;
  19.     int max_segment_length;
  20.     int seed;
  21.     int code;
  22.  
  23.     MetaData (
  24.         string _tcValue = "",
  25.         int _n = 0,
  26.         int _q = 0,
  27.         int _percentage = 0,
  28.         int _min_leaves = 0,
  29.         int _max_leaves = 0,
  30.         int _max_days = 0,
  31.         int _min_segment_length = 0,
  32.         int _max_segment_length = 0,
  33.         int _seed = 12345,
  34.         int _code = 0
  35.         ) {
  36.  
  37.             tcValue = _tcValue;
  38.             n = _n;
  39.             q = _q;
  40.             percentage = _percentage;
  41.             min_leaves = _min_leaves;
  42.             max_leaves = _max_leaves;
  43.             max_days = _max_days;
  44.             min_segment_length = _min_segment_length;
  45.             max_segment_length = _max_segment_length;
  46.             seed = _seed;
  47.             code = _code;
  48.     }
  49. };
  50.  
  51. /*
  52. void gen0(MetaData data) { // done (may need debugging)
  53.     auto values = bind(std::uniform_int_distribution<int>(1,123 * 456),
  54.                            mt19937(data.seed));
  55.    
  56.     int seed_leaves = values();
  57.     auto leaves = bind(std::uniform_int_distribution<int>(1,data.max_leaves),
  58.                            mt19937(seed_leaves));
  59.    
  60.     int seed_start = values();
  61.     auto start = bind(std::uniform_int_distribution<int>(1,data.n),
  62.                            mt19937(seed_start));
  63.  
  64.     int seed_segment = values();
  65.     auto segment = bind(std::uniform_int_distribution<int>(1,data.max_segment_length),
  66.                            mt19937(seed_segment));
  67.  
  68.     int seed_days = values();
  69.     auto days = bind(std::uniform_int_distribution<int>(1,data.max_days),
  70.                            mt19937(seed_days));
  71.    
  72.     int n = data.n;
  73.     int q = data.q;
  74.     int perc = data.percentage;
  75.    
  76.  
  77.     cout << n << endl;
  78.     for(int i=0;i<n;i++)
  79.         cout << leaves() << endl;
  80.  
  81.     cout << perc << endl;
  82.  
  83.     cout << q << endl;
  84.     for(int i=0;i<q;i++)
  85.         cout << days() << endl;
  86.    
  87.     vector<int> starting(q);
  88.     for(int i=0;i<q;i++)
  89.         starting[i] = start();
  90.    
  91.     vector<int> lengths(q);
  92.     for(int i=0;i<q;i++)
  93.         lengths[i] = segment();
  94.    
  95.     cout << q << endl;
  96.     for(int i=0;i<q;i++)
  97.         cout << starting[i] << endl;
  98.    
  99.     cout << q << endl;
  100.     for(int i=0;i<q;i++)
  101.         cout << min(starting[i] + lengths[i], n) << endl;
  102. }
  103. */
  104.  
  105. void gen0(MetaData data) { // done (may need debugging)
  106.     auto values = bind(std::uniform_int_distribution<int>(1,123 * 456),
  107.                            mt19937(data.seed));
  108.    
  109.     int seed_leaves = values();
  110.     auto leaves = bind(std::uniform_int_distribution<int>(data.min_leaves,data.max_leaves),
  111.                            mt19937(seed_leaves));
  112.    
  113.     int seed_start = values();
  114.     auto start = bind(std::uniform_int_distribution<int>(1,data.n - data.min_segment_length),
  115.                            mt19937(seed_start));
  116.  
  117.     int seed_segment = values();
  118.     auto segment = bind(std::uniform_int_distribution<int>(data.min_segment_length,data.max_segment_length),
  119.                            mt19937(seed_segment));
  120.  
  121.     int seed_days = values();
  122.     auto days = bind(std::uniform_int_distribution<int>(1,data.max_days),
  123.                            mt19937(seed_days));
  124.    
  125.     int n = data.n;
  126.     int q = data.q;
  127.     int perc = data.percentage;
  128.    
  129.  
  130.     cout << n << endl;
  131.     for(int i=0;i<n;i++)
  132.         cout << leaves() << endl;
  133.  
  134.     cout << perc << endl;
  135.  
  136.     cout << q << endl;
  137.     for(int i=0;i<q;i++) {
  138.         if (values() % 2 == 0)
  139.             cout << days() << endl;
  140.         else
  141.             cout << days() % 20 + 1 << endl;
  142.     }
  143.    
  144.     vector<int> starting(q);
  145.     for(int i=0;i<q;i++)
  146.         starting[i] = start();
  147.    
  148.     vector<int> lengths(q);
  149.     for(int i=0;i<q;i++)
  150.         lengths[i] = segment();
  151.    
  152.     cout << q << endl;
  153.     for(int i=0;i<q;i++)
  154.         cout << starting[i] << endl;
  155.    
  156.     cout << q << endl;
  157.     for(int i=0;i<q;i++)
  158.         cout << min(starting[i] + lengths[i], n) << endl;
  159. }
  160.  
  161. void createTest(char* testId, MetaData data) { // done
  162.     typedef void (*fn)(MetaData);
  163.     static vector<fn> functions = {gen0};
  164.  
  165.     assert (data.code >= 0 && data.code < (int)functions.size());
  166.  
  167.     char outputPath[500] = {0};
  168.     strcat(strcat(strcat(outputPath, "testcases/input/input"), testId), ".txt");
  169.     freopen(outputPath, "w", stdout);
  170.     functions[data.code](data);
  171.     fclose(stdout);
  172. }
  173.  
  174. void createOutput(char* testId) { // done
  175.     char command[500] = {0};
  176.     strcat(strcat(strcat(strcat(strcat(strcat(command, "time ./a < testcases/input/input"), testId), ".txt > "), "testcases/output/output"), testId), ".txt");
  177.     system(command);
  178. }
  179.  
  180. bool createTestAndOutput(char* testId, MetaData data) { // done
  181.     // handmade cases
  182.     if ((int)data.tcValue.length() > 0) {
  183.         char outputPath[500] = {0};
  184.         strcat(strcat(strcat(outputPath, "testcases/input/input"), testId), ".txt");
  185.         freopen(outputPath, "w", stdout);
  186.         cout << data.tcValue;
  187.         fclose(stdout);
  188.         createOutput(testId);
  189.  
  190.         affectedFiles += testId;
  191.         affectedFiles += "\n";
  192.  
  193.         return 1;
  194.     }
  195.  
  196.     // when there are less than 15 test cases
  197.     if (data.n == 0)
  198.         return 0;
  199.  
  200.     // run the generator
  201.     createTest(testId, data);
  202.     createOutput(testId);
  203.  
  204.     affectedFiles += testId;
  205.     affectedFiles += "\n";
  206.  
  207.     return 1;
  208. }
  209.  
  210. void initialize() { // done
  211.     system("rm -r testcases/input");
  212.     system("rm -r testcases/output");
  213.     system("mkdir -p testcases/input");
  214.     system("mkdir -p testcases/output");
  215. }
  216.  
  217. void run(char* testId, MetaData data) { // done
  218.     if (createTestAndOutput(testId, data)) {
  219.         freopen ("/dev/tty", "a", stdout);
  220.         cout << "Test case " << testId << " processed" << endl;
  221.         cout << endl;
  222.         fclose(stdout);
  223.     }
  224. }
  225.  
  226. void warnBeforeRunningGenerator() { // done
  227.     char c;
  228.     cout << "(i/I)nitialize_and_run or run normally? ";
  229.     c = getchar();
  230.     int warn = 3;
  231.     if (c == 'i' || c == 'I') {
  232.         getchar();
  233.         cout << "You pressed i/I" << endl;
  234.         for(int i=0;i<warn;i++) {
  235.             cout << "Proceed with initialize? It will delete all the files (" << warn-1-i << "): ";
  236.             getchar();
  237.         }
  238.         cout << slug << endl;
  239.         initialize();
  240.     }
  241.     else {
  242.         for(int i=0;i<warn;i++) {
  243.             cout << "Proceed with run? It will delete old files (" << warn-1-i << "): ";
  244.             getchar();
  245.         }
  246.         cout << slug << endl;
  247.     }
  248. }
  249.  
  250. int main() { // only data remains to be written
  251.     MetaData data[15];
  252.     time_t _tm = time(NULL);
  253.     struct tm * curtime = localtime ( &_tm );
  254.     char buf[100] = {0};
  255.     strcat(strcat(buf, "Last modified : "), asctime(curtime));
  256.     strcpy(slug, buf);
  257.    
  258.     string sample_testcase_0 = "5\n10\n20\n30\n20\n10\n30\n3\n1\n1\n2\n3\n2\n1\n1\n3\n4\n3\n4\n";
  259.     string sample_testcase_1 = "5\n10\n20\n30\n20\n10\n30\n3\n1\n2\n3\n3\n1\n1\n1\n3\n5\n5\n5\n";
  260.  
  261.  
  262.     int seeds[] = {23526, 427628, 136829, 25360, 4267582,
  263.                      5729263, 5262789, 263726, 2238, 277299,
  264.                      63828, 864778, 37897, 98789, 789800};
  265.  
  266.  
  267.     // Hand made cases : 2 // done
  268.     data[0] = MetaData (
  269.         /*tcval = */ sample_testcase_0
  270.     );
  271.     data[1] = MetaData (
  272.         /*tcval = */ sample_testcase_1
  273.     );
  274.  
  275.  
  276.  
  277.  
  278.     /*
  279.         code 0
  280.     */
  281.     data[2] = MetaData (
  282.         /*tcval = */ "",
  283.         /*n = */ 10,
  284.         /*q = */ 10,
  285.         /*percentage = */ 40,
  286.         /*min_leaves = */ 1,
  287.         /*max_leaves = */ 1000,
  288.         /*max_days = */ 5,
  289.         /*min_seg = */ 1,
  290.         /*max_seg = */ 10,
  291.         /*seed = */ seeds[2],
  292.         /*code = */ 0
  293.     );
  294.     data[3] = MetaData (
  295.         /*tcval = */ "",
  296.         /*n = */ 1000,
  297.         /*q = */ 1000,
  298.         /*percentage = */ 30,
  299.         /*min_leaves = */ 1,
  300.         /*max_leaves = */ 1000 * 1000,
  301.         /*max_days = */ 5,
  302.         /*min_seg = */ 1,
  303.         /*max_seg = */ 1000,
  304.         /*seed = */ seeds[3],
  305.         /*code = */ 0
  306.     );
  307.     data[4] = MetaData (
  308.         /*tcval = */ "",
  309.         /*n = */ 1000,
  310.         /*q = */ 1000,
  311.         /*percentage = */ 50,
  312.         /*min_leaves = */ 1,
  313.         /*max_leaves = */ 1000 * 1000,
  314.         /*max_days = */ 7,
  315.         /*min_seg = */ 1,
  316.         /*max_seg = */ 1000,
  317.         /*seed = */ seeds[4],
  318.         /*code = */ 0
  319.     );
  320.     data[5] = MetaData (
  321.         /*tcval = */ "",
  322.         /*n = */ 100000,
  323.         /*q = */ 100000,
  324.         /*percentage = */ 30,
  325.         /*min_leaves = */ 1000 * 1000,
  326.         /*max_leaves = */ 1000 * 1000 * 1000,
  327.         /*max_days = */ 1000 * 1000 * 1000,
  328.         /*min_seg = */ 1000,
  329.         /*max_seg = */ 100000,
  330.         /*seed = */ seeds[5],
  331.         /*code = */ 0
  332.     );
  333.     data[6] = MetaData (
  334.         /*tcval = */ "",
  335.         /*n = */ 100000,
  336.         /*q = */ 100000,
  337.         /*percentage = */ 40,
  338.         /*min_leaves = */ 1000 * 1000,
  339.         /*max_leaves = */ 1000 * 1000 * 1000,
  340.         /*max_days = */ 50,
  341.         /*min_seg = */ 1000,
  342.         /*max_seg = */ 100000,
  343.         /*seed = */ seeds[6],
  344.         /*code = */ 0
  345.     );
  346.     data[7] = MetaData (
  347.         /*tcval = */ "",
  348.         /*n = */ 100000,
  349.         /*q = */ 100000,
  350.         /*percentage = */ 40,
  351.         /*min_leaves = */ 1000 * 1000,
  352.         /*max_leaves = */ 1000 * 1000 * 1000,
  353.         /*max_days = */ 5 * 1000 * 1000,
  354.         /*min_seg = */ 1000,
  355.         /*max_seg = */ 100000,
  356.         /*seed = */ seeds[7],
  357.         /*code = */ 0
  358.     );
  359.     data[8] = MetaData (
  360.         /*tcval = */ "",
  361.         /*n = */ 100000,
  362.         /*q = */ 100000,
  363.         /*percentage = */ 50,
  364.         /*min_leaves = */ 5 * 1000 * 1000,
  365.         /*max_leaves = */ 1000 * 1000 * 1000,
  366.         /*max_days = */ 50,
  367.         /*min_seg = */ 1000,
  368.         /*max_seg = */ 100000,
  369.         /*seed = */ seeds[8],
  370.         /*code = */ 0
  371.     );
  372.     data[9] = MetaData (
  373.         /*tcval = */ "",
  374.         /*n = */ 100000,
  375.         /*q = */ 100000,
  376.         /*percentage = */ 60,
  377.         /*min_leaves = */ 5 * 1000 * 1000,
  378.         /*max_leaves = */ 1000 * 1000 * 1000,
  379.         /*max_days = */ 5 * 1000,
  380.         /*min_seg = */ 1000,
  381.         /*max_seg = */ 100000,
  382.         /*seed = */ seeds[9],
  383.         /*code = */ 0
  384.     );
  385.     data[10] = MetaData (
  386.         /*tcval = */ "",
  387.         /*n = */ 100000,
  388.         /*q = */ 100000,
  389.         /*percentage = */ 37,
  390.         /*min_leaves = */ 5 * 1000 * 1000,
  391.         /*max_leaves = */ 1000 * 1000 * 1000,
  392.         /*max_days = */ 1000 * 1000 * 1000,
  393.         /*min_seg = */ 1000,
  394.         /*max_seg = */ 100000,
  395.         /*seed = */ seeds[10],
  396.         /*code = */ 0
  397.     );
  398.     data[11] = MetaData (
  399.         /*tcval = */ "",
  400.         /*n = */ 100000,
  401.         /*q = */ 100000,
  402.         /*percentage = */ 67,
  403.         /*min_leaves = */ 5 * 1000 * 1000,
  404.         /*max_leaves = */ 1000 * 1000 * 1000,
  405.         /*max_days = */ 1000 * 1000 * 1000,
  406.         /*min_seg = */ 1000,
  407.         /*max_seg = */ 100000,
  408.         /*seed = */ seeds[11],
  409.         /*code = */ 0
  410.     );
  411.     data[12] = MetaData (
  412.         /*tcval = */ "",
  413.         /*n = */ 100000,
  414.         /*q = */ 100000,
  415.         /*percentage = */ 100,
  416.         /*min_leaves = */ 5 * 1000 * 1000,
  417.         /*max_leaves = */ 1000 * 1000 * 1000,
  418.         /*max_days = */ 1000 * 1000 * 1000,
  419.         /*min_seg = */ 1000,
  420.         /*max_seg = */ 100000,
  421.         /*seed = */ seeds[12],
  422.         /*code = */ 0
  423.     );
  424.  
  425.  
  426.     warnBeforeRunningGenerator();
  427.  
  428.     run("00", data[0]);
  429.     run("01", data[1]);
  430.     run("02", data[2]);
  431.     run("03", data[3]);
  432.     run("04", data[4]);
  433.     run("05", data[5]);
  434.     run("06", data[6]);
  435.     run("07", data[7]);
  436.     run("08", data[8]);
  437.     run("09", data[9]);
  438.     run("10", data[10]);
  439.     run("11", data[11]);
  440.     run("12", data[12]);
  441.     run("13", data[13]);
  442.     run("14", data[14]);
  443.  
  444.     //freopen("generator_report.txt", "w", stdout);
  445.     freopen ("/dev/tty", "a", stdout);
  446.     cout << affectedFiles << endl;
  447.  
  448.     return 0;
  449. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement