Revisando algunos archivos guardados de trabajos que hice para las clases en la universidad, conseguí un programa que hice en Perl para un curso que se llamaba Computación Emergente. Es una implementación de el juego de la vida bastante sencilla, lo interesante de esto es que nadie en el curso conocía algo sobre Perl, y todos hicieron la implementación en Matlab, por que según era más fácil para manejar las matrices, y hacer las iteraciones, etc, etc .. así que pensé en hacerlo usando otras herramientas, y esto fue lo que salió, la idea es crear una matriz de N x N y ejecutar todas las reglas o algoritmos en un determinado número de iteraciones. El código quizás se pueda mejorar, pero con esto bastó para sacar 20 en esta asignación
:
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 83 84 | #!/usr/share/bin/perl use Modern::Perl; use Math::MatrixReal; say"Indique el valor de N, se creara un grid NxN: "; my $n = <STDIN>; chomp($n); say "Indique la cantidad de iteraciones: "; my $iter = <STDIN>; chomp($iter); my ($x,$y); my $grid = Math::MatrixReal->new_random($n,$n,{bounded_by=>[-1,2], integer=>1}); $grid->display_precision(0); system('clear'); say "INICIO"; impgrid($grid); sleep(2); for (my $it = 1; $it <= $iter; $it++) { my $gridtemp = $grid->clone(); $gridtemp->each( sub{ my (undef,$i,$j) = @_; #say "$i -- $j"; my $newval = evalua($i,$j); $gridtemp->assign($i,$j,$newval); } ); system('clear'); $gridtemp->display_precision(0); say "Iteracion = $it"; impgrid($gridtemp); sleep(1); $grid = $gridtemp ; $grid->display_precision(0); } sub impgrid { my $pgrid = shift; for (my $i=1; $i<=$n; $i++) { for (my $ii =1; $ii <= $n; $ii++) { my $valc = $pgrid->element($i,$ii); my $printc = "*"; $printc = " " if $valc == 0; print "$printc "; } print "\n"; } } sub evalua { $x= shift; $y = shift; my $tot = 0; my ($xant,$xsig,$yant,$ysig) = vecinos($x,$y); my $newval = 0; my $celula = $grid->element($x,$y); $tot = $tot + $grid->element($xant,$y); $tot = $tot + $grid->element($xant,$ysig); $tot = $tot + $grid->element($x,$ysig); $tot = $tot + $grid->element($xsig,$ysig); $tot = $tot + $grid->element($xsig,$y); $tot = $tot + $grid->element($xsig,$yant); $tot = $tot + $grid->element($x,$yant); $tot = $tot + $grid->element($xant,$yant); $newval = 1 if ( (($celula == 1) && (($tot == 2) || ($tot == 3))) || (($celula == 0) && ($tot == 3)) ); return $newval; } sub vecinos { my $x = shift; my $y = shift; my $xant = ( $x == 1 ) ? $n : ( $x - 1 ); my $xsig = ( $x == $n ) ? 1 : ( $x + 1 ); my $yant = ( $y == 1 ) ? $n : ( $y - 1 ); my $ysig = ( $y == $n ) ? 1 : ($y + 1); return ($xant,$xsig,$yant,$ysig); } |
Estoy usando el modulo Math::MatrixReal que permite interactuar de una manera rápida y sencilla con matrices.



