Guest User

Untitled

a guest
Jul 23rd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <limits.h>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6.  
  7. int WORLD = 0;
  8. int LASTWORLD = 0;
  9. int NEWWORLD = 0;
  10.  
  11. const int ROW_L = sqrt(log2(INT_MAX));
  12. const int set[3] = { -1, 0, 1 };
  13.  
  14. int offset( int x, int y ) {
  15. int offset_bit = (y*ROW_L)+x;
  16. int numeric_val = pow(2,offset_bit);
  17. return numeric_val;
  18. }
  19. int getX( int offset ) {
  20. return ( offset % ROW_L );
  21. }
  22. int getY( int offset ) {
  23. return ( offset / ROW_L );
  24. }
  25.  
  26.  
  27. int pokeCell( int x, int y ) {
  28. if (
  29. x >= 0 && y >= 0 &&
  30. x < ROW_L && y < ROW_L
  31. ) {
  32. int bit = offset(x, y);
  33. return ( WORLD & bit ) != 0;
  34. } else {
  35. return -1;
  36. }
  37. }
  38.  
  39. void setCell(int x, int y) {
  40. int bit = offset(x,y);
  41. WORLD += bit;
  42. }
  43.  
  44. void unsetCell(int x, int y) {
  45. int bit = offset(x,y);
  46. WORLD -= bit;
  47. }
  48.  
  49. int getDelta() {
  50. int ret = (WORLD & LASTWORLD);
  51. return (WORLD-ret);
  52. }
  53.  
  54. int getNextOffset( int MIDWORLD ) {
  55. int oldmidworld = MIDWORLD;
  56. MIDWORLD = ((MIDWORLD) & (MIDWORLD-1));
  57. if ( MIDWORLD == 0 )
  58. if ( oldmidworld != 0 )
  59. return oldmidworld;
  60. else
  61. return 0;
  62. else
  63. return oldmidworld^MIDWORLD;
  64. }
  65.  
  66. void processNode( int x, int y ) {
  67. int nCount = 0;
  68.  
  69. for ( int i = 0; i < 3; ++i )
  70. for ( int n = 0; n < 3; ++n )
  71. if ( pokeCell(x+set[i], y+set[n]) == 1 )
  72. if (!( set[i] == 0 && set[n] == 0 ))
  73. nCount++;
  74.  
  75. int bitflag = offset(x,y);
  76.  
  77. if ( nCount < 2 || nCount > 3 )
  78. if ( ( NEWWORLD & bitflag ) > 0 )
  79. NEWWORLD -= bitflag;
  80.  
  81. if ( nCount == 3 )
  82. if ( ( NEWWORLD & bitflag ) == 0 )
  83. NEWWORLD += bitflag;
  84. }
  85.  
  86. void processNode( int x, int y, int flag ) {
  87. if ( flag )
  88. for ( int i = 0; i < 3; ++i )
  89. for ( int n = 0; n < 3; ++n )
  90. processNode(x+set[i], y+set[n]);
  91. }
  92.  
  93. void renderWorld() {
  94. for ( int i = 0; i < ROW_L; ++i ) {
  95. for ( int n = 0; n < ROW_L; ++n )
  96. if ( pokeCell(i,n) )
  97. std::cout << " O";
  98. else
  99. std::cout << " X";
  100. std::cout << std::endl;
  101. }
  102. std::cout << std::endl;
  103. }
  104.  
  105. int main( int argc, char ** argv ) {
  106.  
  107. setCell(2,1);
  108. setCell(2,2);
  109. setCell(2,3);
  110.  
  111. while ( WORLD != LASTWORLD ) {
  112. renderWorld();
  113. NEWWORLD = WORLD;
  114. int delt = getDelta();
  115. int next = getNextOffset(delt);
  116. delt -= next;
  117. while ( next != 0 ) {
  118. int x = getX(log2(next));
  119. int y = getY(log2(next));
  120. processNode(x,y,1);
  121. next = getNextOffset(delt);
  122. delt -= next;
  123. }
  124. if ( NEWWORLD == LASTWORLD ) {
  125. std::cout << "Hey! This loops! Cool!" << std::endl;
  126. LASTWORLD = NEWWORLD;
  127. WORLD = NEWWORLD;
  128. }
  129.  
  130. LASTWORLD = WORLD;
  131. WORLD = NEWWORLD;
  132. }
  133.  
  134. std::cout << "All set. This is the final state." << std::endl << std::endl;
  135. renderWorld();
  136. }
Add Comment
Please, Sign In to add comment