Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.71 KB | None | 0 0
  1. #!/usr/bin/perl
  2. #phurba is ghey
  3. use warnings;
  4. use strict;
  5. use Term::ANSIColor;
  6. use GD;
  7.  
  8. my @grid;
  9.  
  10. my $X = 500;
  11. my $Y = 500;
  12. for my $a(0 .. $X) {
  13.         for my $b(0 .. $Y) {
  14.                 $grid[$a][$b] = 0;
  15.         }
  16. }
  17.  
  18. sub display {
  19.         system("clear");
  20.         for my $a(0 .. $X) {
  21.                 for my $b(0 .. $Y) {
  22.                         my $neighbors = neighbors($a, $b);
  23.                         if($grid[$a][$b] == 1) {
  24. #                               print colored ['red on_green'], $neighbors;
  25.                                 print colored ['red on_green'], ' ';
  26.                         } else {
  27. #                               print $neighbors > 0 ? $neighbors : ' ';
  28.                                 print ' ';
  29.                         }
  30.                 }
  31.                 print "\n";
  32.         }
  33. }
  34.  
  35. sub neighbors {
  36.         my($a, $b) = @_;
  37.  
  38.         my $neighbors = 0;
  39.         $neighbors++ if($grid[($a -1) % $X][$b] == 1);  # left
  40.         $neighbors++ if($grid[($a +1) % $X][$b] == 1);  # right
  41.         $neighbors++ if($grid[$a][($b -1) % $Y] == 1);  # above
  42.         $neighbors++ if($grid[$a][($b +1) % $Y] == 1);  # below
  43.  
  44.         $neighbors++ if($grid[($a -1) % $X][($b -1) % $Y] == 1); # diag above left
  45.         $neighbors++ if($grid[($a -1) % $X][($b +1) % $Y] == 1); # diag above right
  46.         $neighbors++ if($grid[($a +1) % $X][($b -1) % $Y] == 1); # diag below left
  47.         $neighbors++ if($grid[($a +1) % $X][($b +1) % $Y] == 1); # diag below right
  48.  
  49.         return $neighbors;
  50. }
  51. sub generation {
  52.         my @neighbors;
  53.         for my $a(0 .. $X) {
  54.                 for my $b(0 .. $Y) {
  55.                         $neighbors[$a][$b] = neighbors($a, $b);
  56.                 }
  57.         }
  58.  
  59.         for my $a(0 .. $X) {
  60.                 for my $b(0 .. $Y) {
  61.  
  62.                         if($grid[$a][$b] == 1) {
  63.                                 if($neighbors[$a][$b] < 2) {
  64.                         if($grid[$a][$b] == 1) {
  65.                                 if($neighbors[$a][$b] < 2) {
  66.                                         $grid[$a][$b] = 0; #print "KilledA $a,$b with $neighbors[$a][$b] ";
  67.                                 } elsif($neighbors[$a][$b] == 2 || $neighbors[$a][$b] == 3) {
  68.                                         $grid[$a][$b] = 1; #print "Lived $a,$b ";
  69.                                 } elsif($neighbors[$a][$b] > 3) {
  70.                                         $grid[$a][$b] = 0; #print "KilledB $a,$b ";
  71.                                 }
  72.                         } else {
  73.                                 if($neighbors[$a][$b] == 3 ) {
  74.                                         $grid[$a][$b] = 1; #print "LIved $a,$b ";
  75.                                 }
  76.                         }
  77.                 }
  78.                 #print "\n";
  79.         }
  80. }
  81.  
  82. sub mutate {
  83.         for my $a(0 .. 59) {
  84.                 for my $b(0 .. 59) {
  85.                         # 1 in 100 chance of mutation
  86.                         if(int(rand(99)) == 5) {
  87.                                 if($grid[$a][$b] == 1) {
  88.                                         $grid[$a][$b] = 0;
  89.                                 } else {
  90.                                         $grid[$a][$b] = 1;
  91.                                 }
  92.                         }
  93.                 }
  94.         }
  95. }
  96.  
  97. # glider gun
  98. $grid[1][25] = 1;
  99. $grid[2][23] = 1;
  100. $grid[2][25] = 1;
  101. $grid[3][13] = 1;
  102. $grid[3][14] = 1;
  103. $grid[3][21] = 1;
  104. $grid[3][22] = 1;
  105. $grid[3][35] = 1;
  106. $grid[3][36] = 1;
  107. $grid[4][12] = 1;
  108. $grid[4][16] = 1;
  109. $grid[4][21] = 1;
  110. $grid[4][22] = 1;
  111. $grid[4][35] = 1;
  112. $grid[4][36] = 1;
  113. $grid[5][1] = 1;
  114. $grid[5][2] = 1;
  115. $grid[5][11] = 1;
  116. $grid[5][17] = 1;
  117. $grid[5][21] = 1;
  118. $grid[5][22] = 1;
  119. $grid[6][1] = 1;
  120. $grid[6][2] = 1;
  121. $grid[6][11] = 1;
  122. $grid[6][15] = 1;
  123. $grid[6][17] = 1;
  124. $grid[6][18] = 1;
  125. $grid[6][23] = 1;
  126. $grid[6][25] = 1;
  127. $grid[7][11] = 1;
  128. $grid[7][17] = 1;
  129. $grid[7][25] = 1;
  130. $grid[8][12] = 1;
  131. $grid[8][16] = 1;
  132. $grid[9][13] = 1;
  133. $grid[9][14] = 1;
  134.  
  135. for(0 .. 9999) {
  136.         writeOut($_);
  137.         #display();
  138.         print "Generation $_\n";
  139.         generation();
  140.     #mutate() if(int(rand(9)) == 1);
  141.  
  142. }
  143.  
  144. sub writeOut {
  145.         my $file = shift;
  146.         my $image = GD::Image->new($Y, $X);
  147.         my $black = $image->colorAllocate(0, 0, 0);
  148.         my $white = $image->colorAllocate(255, 255, 255);
  149.  
  150.         for my $a(0 .. $X) {
  151.                 for my $b(0 .. $Y) {
  152.                         if($grid[$a][$b] == 1) {
  153.                                 $image->setPixel($b, $a, $white);
  154.                         }
  155.                 }
  156.         }
  157.  
  158.         my $fn = sprintf("%06u.jpg", $file);
  159.         open(OUT, "> /tmp/life/$fn") or die $!;
  160.         binmode(OUT);
  161.         print OUT $image->gif();
  162.         close(OUT);
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement