#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <random>
using namespace std;
class muTimer
{
using Clock = std::chrono::high_resolution_clock;
bool active = false;
Clock::duration duration_;
Clock::time_point start_ = Clock::now(), stop_ = Clock::now();
muTimer(const muTimer&) = delete;
muTimer& operator=(const muTimer&) = delete;
public:
using ns = std::chrono::nanoseconds;
using mks = std::chrono::microseconds;
using ms = std::chrono::milliseconds;
muTimer() { reset(); start(); }
~muTimer() = default;
muTimer& reset()
{
duration_ = std::chrono::nanoseconds(0);
active = false;
return *this;
}
muTimer& start()
{
if (!active)
{
start_ = Clock::now();
active = true;
}
return *this;
}
muTimer& stop()
{
if (active)
{
stop_ = Clock::now();
duration_ += stop_ - start_;
active = false;
}
return *this;
}
template<typename T = mks>
unsigned long long duration()
{
return static_cast<unsigned long long>
(std::chrono::duration_cast<T>(stop_-start_).count());
}
};
int day(const char * nm)
{
long long x = nm[0]+nm[1]+nm[2]-300;
return (((((101047ll*x+694384ll)*x-19207693ll)*x-61935874ll)*x
+1060034136ll)*x-1218412800)*(2+x)/2058376320+1;
}
int DAY(const char * str)
{
if((str[0] =='M') && (str[1] == 'o') && (str[2] == 'n')) return 1;
if((str[0] =='T') && (str[1] == 'u') && (str[2] == 'e')) return 2;
if((str[0] =='W') && (str[1] == 'e') && (str[2] == 'd')) return 3;
if((str[0] =='T') && (str[1] == 'h') && (str[2] == 'u')) return 4;
if((str[0] =='F') && (str[1] == 'r') && (str[2] == 'i')) return 5;
if((str[0] =='S') && (str[1] == 'a') && (str[2] == 't')) return 6;
if((str[0] =='S') && (str[1] == 'u') && (str[2] == 'n')) return 7;
return 0;
}
int DAY2(const char * str)
{
const int days[23] = {3, 5, 0, 0, 0, 0, 0, 0, 6, 0, 1,
0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 7};
int index = str[0] + str[1] + str[2] - 288;
return days[index];
}
int main()
{
char M[7][4] = { "Mon","Tue","Wed","Thu","Fri","Sat","Sun" };
const std::size_t vect_size = 20000000;
std::vector<char> rand_vect(vect_size);
std::mt19937 gen(0);
std::uniform_int_distribution<> distrib(0,6);
for (int i = 0; i < vect_size; ++i)
rand_vect[i] = distrib(gen);
{
int sum = 0;
muTimer mt;
for(int i = 0; i < vect_size; ++i)
{
sum += day(M[rand_vect[i]]);
}
mt.stop();
cout << "day: " << sum << " for " << mt.duration<>() << " mks\n";
}
{
int sum = 0;
muTimer mt;
for(int i = 0; i < vect_size; ++i)
{
sum += DAY(M[rand_vect[i]]);
}
mt.stop();
cout << "DAY: " << sum << " for " << mt.duration<>() << " mks\n";
}
{
int sum = 0;
muTimer mt;
for(int i = 0; i < vect_size; ++i)
{
sum += DAY2(M[rand_vect[i]]);
}
mt.stop();
cout << "DAY2: " <<sum << " for " << mt.duration<>() << " mks\n";
}
}