Skip to content
Snippets Groups Projects
Select Git revision
  • f2e09afcb791b3bb5600251488fbb55b9500166a
  • master default protected
2 results

main.cpp

Blame
  • main.cpp 1.42 KiB
    #include "main.h"
    #include <random>
    #include <algorithm>
    #include <cassert>
    #include <cstring>
    #include <unistd.h>
    #include <ctime>
    
    #define verdict_add(a...) do{ int r = sprintf(verdict+verdict_len, a); assert(r>0); verdict_len += r;}while(false)
    
    using namespace lib;
    using namespace internal;
    
    int main(int argc, char ** argv)
    {
    	if(argc==2 && !strcmp(argv[1], "-v"))
    	{
    		printf("%d\n", VERSION);
    		return 0;
    	}
    	assert(argc>=3);
    	std::uniform_int_distribution<unsigned int> dist(0, 1000000000);
    	std::random_device urandom("/dev/urandom");
    
    	int n = atoi(argv[1]);
    	vector<int> in(2*n);
    	int seed = 0;
    
    	if('A' <= argv[2][0] and argv[2][0] <= 'Z')
    	{
    		assert(strlen(argv[2]) == 2*n);
    		fo(i, 2*n)
    			in[i] = argv[2][i] - 'A';
    	}
    	else
    	{
    		seed = argv[2][0]?atoi(argv[2]):dist(urandom);
    		srand(seed);
    		fo(i,n) in[i] = i;
    		fo(i,n) in[n+i] = i;
    		random_shuffle(in.begin(), in.end());
    	}
    
    	fflush(stdout);
    	int old_stdout = dup(1);
    	dup2(2, 1);
    	long long time_before = time(0);
    	auto out = solve(n, in, argc-3, argv+3);
    	long long time_after = time(0);
    	fflush(stdout);
    	dup2(old_stdout, 1);
    
    	char verdict[1000];
    	int verdict_len=0;
    
    	verdict_add("{\"_\":0");
    	format_args(verdict, verdict_len, argc-3, argv+3);
    	validate_and_format_verdict(n, in, out, verdict, verdict_len, argv[0], time_after-time_before);
    	verdict_add(", \"seed\": %d", seed);
    	verdict_add("},\n");
    
    	add_to_log_file(verdict);
    	print_data(n, in, out, verdict);
    	return 0;
    }