This commit is contained in:
2021-11-20 22:47:05 +00:00
parent 3f447a25ab
commit a1835ad116

View File

@@ -15,12 +15,55 @@ void print(const std::vector<int>& row)
std::cout << std::endl;
}
void push(std::vector<int> row)
void print(const std::vector<std::vector<int>>& board)
{
print(row);
auto q = row.begin();
auto pe = row.end();
for (auto p = row.begin()+1; p != pe; ++p){
for (const auto& row : board){
for (auto i : row){
std::cout << i << ',';
}
std::cout << std::endl;
}
}
struct OneDimVec
{
using board_t = std::vector<int>;
using iterator_t = int *;
enum {dimentions=1};
static iterator_t begin(board_t& b, int n){
return b.data();
}
static iterator_t end(board_t& b, int n){
return b.data()+b.size();
}
static iterator_t next(iterator_t it){
return it+1;
}
};
struct OneDimVecReverse
{
using board_t = std::vector<int>;
using iterator_t = board_t::reverse_iterator;
enum {dimentions=1};
static iterator_t begin(board_t& b, int n){
return b.rbegin();
}
static iterator_t end(board_t& b, int n){
return b.rend();
}
static iterator_t next(iterator_t it){
return it+1;
}
};
template <typename Traits>
void push(typename Traits::board_t& board, int n)
{
auto q = Traits::begin(board, n);
auto pe = Traits::end(board, n);
for (auto p = Traits::next(q); p != pe; p=Traits::next(p)){
if (*p==0){
continue;
}
@@ -31,25 +74,154 @@ void push(std::vector<int> row)
else if (*q == *p){
*q+=*p;
*p = 0;
++q;
q = Traits::next(q);
}
else {
*++q = *p;
if (*q != *p){
q = Traits::next(q);
*q = *p;
if (q != p){
*p = 0;
}
}
}
print(row);
}
template <typename T>
void test(typename T::board_t v){
std::cout << "--------------" << std::endl;
print(v);
if constexpr (T::dimentions == 1){
push<T>(v,0);
} else {
for (int i = 0; i < T::dim_size(v); ++i){
push<T>(v,i);
}
}
std::cout << "-" << std::endl;
print(v);
}
struct BoardTraits
{
using board_t=std::vector<std::vector<int>>;
enum {dimentions=2};
struct iterator_t {
board_t& b;
int i;
int j;
int& operator*(){
return b[i][j];
}
bool operator != (const iterator_t& it){
return i != it.i;
}
iterator_t& operator = (const iterator_t& it){
i=it.i;
j=it.j;
return *this;
}
};
};
struct Up : public BoardTraits
{
static int dim_size(const board_t& b){
return b[0].size();
}
static iterator_t begin(board_t& b, int n){
return {b, 0, n};
}
static iterator_t end(board_t& b, int n){
return {b, int(b.size()), n};
}
static iterator_t next(const iterator_t& it){
return {it.b, it.i+1, it.j};
}
};
struct Down : public BoardTraits
{
static int dim_size(const board_t& b){
return b[0].size();
}
static iterator_t begin(board_t& b, int n){
return {b, int(b.size())-1, n};
}
static iterator_t end(board_t& b, int n){
return {b, -1, n};
}
static iterator_t next(const iterator_t& it){
return {it.b, it.i-1, it.j};
}
};
struct Left : public BoardTraits
{
using iterator_t = std::vector<int>::iterator;
static int dim_size(const board_t& b){
return b.size();
}
static iterator_t begin(board_t& b, int n){
return b[n].begin();
}
static iterator_t end(board_t& b, int n){
return b[n].end();
}
static iterator_t next(const iterator_t& it){
return it+1;
}
};
struct Right : public BoardTraits
{
using iterator_t = std::vector<int>::reverse_iterator;
static int dim_size(const board_t& b){
return b.size();
}
static iterator_t begin(board_t& b, int n){
return b[n].rbegin();
}
static iterator_t end(board_t& b, int n){
return b[n].rend();
}
static iterator_t next(const iterator_t& it){
return it+1;
}
};
int main ( void )
{try{
auto begin = std::chrono::high_resolution_clock::now();
push({4, 0, 4, 8});
test<OneDimVec>({4, 0, 4, 8});
test<OneDimVecReverse>({4, 0, 4, 8});
std::cout << "test" << std::endl;
//......
test<Left>({
{4, 0, 4, 8},
{2, 0, 2, 8},
{1, 1, 0, 0},
{4, 0, 4, 4}
});
test<Right>({
{4, 0, 4, 8},
{2, 0, 2, 8},
{1, 1, 0, 0},
{4, 0, 4, 4}
});
test<Up>({
{4, 0, 4, 8},
{2, 0, 2, 8},
{1, 1, 0, 0},
{4, 0, 4, 4}
});
test<Down>({
{4, 0, 4, 8},
{2, 0, 2, 8},
{1, 1, 0, 0},
{4, 0, 4, 4}
});
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> seconds = end - begin;