-
Notifications
You must be signed in to change notification settings - Fork 0
/
aoc14.cpp
82 lines (75 loc) · 1.88 KB
/
aoc14.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//
// g++ -O3 -std=c++17 -fconstexpr-loop-limit=24000000 -o aoc14 aoc14.cpp
//
//
#include <iostream>
#include <array>
#include <algorithm>
#include <string>
template<typename C> constexpr int step(int n, C& w, int cnt)
{
return (n + w[n] + 1) % cnt;
}
template<unsigned sz> constexpr auto generate() -> std::array<char, sz>
{
std::array<char, sz> wking{};
int cnt = 0;
wking[cnt++] = 3 ;
wking[cnt++] = 7;
int e1 = 0;
int e2 = 1;
while (cnt < sz-1)
{
int n = wking[e1] + wking[e2];
if (n < 10)
wking[cnt++] = n;
else
{
wking[cnt++] = n / 10;
wking[cnt++] = n % 10;
}
// step elves
e1 = step(e1, wking, cnt);
e2 = step(e2, wking, cnt);
}
return wking;
}
constexpr auto swking = generate<24000000>();
void pt1(int n)
{
auto it = std::begin(swking) + n;
for(int i = 0; i < 10; ++i)
{
std::cout << +(*it);
++it;
}
}
template<typename I> void pt2(I b, I e)
{
auto it = std::search(std::begin(swking), std::end(swking), b, e);
if (it == std::end(swking))
std::cout << "not found\n";
else
std::cout << std::distance( std::begin(swking), it) << "\n";
}
int main(int ac, char**av)
{
if ( ac < 2 )
{
std::cout << "usage: aoc14 <input> [[input2]...[inputn]]\n\n";
return -1;
}
int arg = 1;
while(arg < ac)
{
std::string s(av[arg]);
int p = std::stoi(s);
std::cout << s << "\n";
std::cout << "pt1 - ";
pt1(p);
std::transform(std::begin(s), std::end(s), std::begin(s), [](auto c){ return c - '0';});
std::cout << "\npt2 - ";
pt2(std::begin(s), std::end(s));
++arg;
}
}