Em Qui, 2009-05-28 às 00:26 -0500, John M. Dlugosz escreveu:
> Mark J. Reed markjreed-at-gmail.com |Perl 6| wrote:
> > Perhaps Perl 6 should not aspire to the expressiveness of APL. :)  As
> > nice as it is that you can write Conway's Life in a one-liner(*), I
> > think that a little verbosity now and then is a good thing for
> > legibility....
> > (*) life ←{↑1 ω⌵.^3 4=+/,‾1 0 1◦.ϕ⊂ω}
> So how would that translate to Perl 6?  Both as an exact translation, 
> and how to do it better in a Perl way?

I didn't try to translate it, but rather I simply tried to implement it
in a way rakudo already runs.... So... here's my shot!

<CODE>
class Game {
  # XXX: rakudo doesn't know how to initialize arrays properly yet.
  has $.seed;
  has $.width;
  has $.height;
  multi method generation(Int $generation where 0) {
    return @($.seed);
  }
  multi method generation(Int $generation) {
    my @previous = self.generation($generation - 1);
    my @new;
    # XXX: rakudo doesn't autovivify arrays properly yet.
    @new.push: [] for ^$.width;
    for ^$.width X ^$.height -> $x, $y {
      # XXX: there's an extra set of parens for rakudo
      my $value = [+] map { @previous[$^i][$^j] },
         ((grep { 0 <= $_ < $.width }, ($x-1)..($x+1))
          X
          (grep { 0 <= $_ < $.height }, ($y-1)..($y+1)));

      if @previous[$x][$y] && 2 <= ($value - 1) <= 3 {
        @new[$x][$y] = 1;
      } elsif !...@previous[$x][$y] && $value == 3 {
        @new[$x][$y] = 1;
      } else {
        @new[$x][$y] = 0;
      }
    }
    return @new;
  }
}

my $game = Game.new(
 :width(15), :height(15),
 :seed([
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ]
 ]));

my @g = $game.generation(4);
say .perl for @g;
</CODE>


I guess my mindset is too much "imperative" for me to think in a more
elegant solution...

daniel

Reply via email to