You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
2.8 KiB
C++
132 lines
2.8 KiB
C++
#include <array>
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
static const std::array<unsigned int, 5> pieces = {
|
|
0x3C, 0x081C08, 0x10101C, 0x04040404, 0x0C0C
|
|
};
|
|
static auto next = pieces.begin();
|
|
static auto current = *next;
|
|
static unsigned int currenty;
|
|
|
|
static void add(std::vector<unsigned char>& tet);
|
|
static bool move(std::vector<unsigned char>& tet, char dir);
|
|
static void show(const std::vector<unsigned char>& tet);
|
|
|
|
int main()
|
|
{
|
|
std::vector<unsigned char> tet;
|
|
std::string jet;
|
|
|
|
std::getline(std::cin, jet);
|
|
|
|
auto j = jet.cbegin();
|
|
for (int i = 0; i < 2022; ++i) {
|
|
add(tet);
|
|
|
|
while (move(tet, *j++)) {
|
|
if (tet.back() == 0)
|
|
tet.pop_back();
|
|
|
|
if (j >= jet.cend())
|
|
j = jet.cbegin();
|
|
}
|
|
}
|
|
std::cout << tet.size() << std::endl;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void add(std::vector<unsigned char>& tet)
|
|
{
|
|
tet.push_back(0);
|
|
tet.push_back(0);
|
|
tet.push_back(0);
|
|
|
|
current = *next;
|
|
currenty = tet.size();
|
|
for (auto n = current; n; n >>= 8)
|
|
tet.push_back(n);
|
|
|
|
if (++next >= pieces.end())
|
|
next = pieces.begin();
|
|
}
|
|
|
|
bool move(std::vector<unsigned char>& tet, char dir)
|
|
{
|
|
auto tetcopy = tet;
|
|
|
|
if (dir == '<') {
|
|
if ((current & 0x0101) == 0) {
|
|
int i = currenty;
|
|
int shift = 1;
|
|
for (auto n = current; n; n >>= 8) {
|
|
auto t = tet[i] & ~n;
|
|
if (t & (n >> 1)) {
|
|
shift = 0;
|
|
tet = tetcopy;
|
|
break;
|
|
}
|
|
tet[i] = t | n >> 1;
|
|
++i;
|
|
}
|
|
|
|
if (shift)
|
|
current >>= 1;
|
|
}
|
|
} else if (dir == '>') {
|
|
if ((current & 0x4040) == 0) {
|
|
int i = currenty;
|
|
int shift = 1;
|
|
for (auto n = current; n; n >>= 8) {
|
|
auto t = tet[i] & ~n;
|
|
if (t & (n << 1)) {
|
|
shift = 0;
|
|
tet = tetcopy;
|
|
break;
|
|
}
|
|
tet[i] = t | n << 1;
|
|
++i;
|
|
}
|
|
|
|
if (shift)
|
|
current <<= 1;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
if (currenty == 0)
|
|
return false;
|
|
|
|
tetcopy = tet;
|
|
|
|
int i = currenty;
|
|
for (auto n = current; n; n >>= 8) {
|
|
if (tet[i - 1] & n) {
|
|
tet = tetcopy;
|
|
return false;
|
|
}
|
|
|
|
tet[i] &= ~n;
|
|
tet[i - 1] |= n;
|
|
++i;
|
|
}
|
|
--currenty;
|
|
|
|
return true;
|
|
}
|
|
|
|
void show(const std::vector<unsigned char>& tet)
|
|
{
|
|
for (auto it = tet.rbegin(); it != tet.rend(); ++it) {
|
|
for (int i = 0; i < 7; ++i)
|
|
std::cout << ((*it & (1 << i)) ? '@' : '.');
|
|
std::cout << std::endl;
|
|
}
|
|
|
|
std::cout << std::endl;
|
|
}
|
|
|