<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.extremist.software/index.php?action=history&amp;feed=atom&amp;title=User%3ADanf%2FTurtleGraphics</id>
	<title>User:Danf/TurtleGraphics - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.extremist.software/index.php?action=history&amp;feed=atom&amp;title=User%3ADanf%2FTurtleGraphics"/>
	<link rel="alternate" type="text/html" href="https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;action=history"/>
	<updated>2026-04-04T15:19:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.13</generator>
	<entry>
		<id>https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;diff=46400&amp;oldid=prev</id>
		<title>Danf: features &amp; refactoring: cycle detection, separation of concerns</title>
		<link rel="alternate" type="text/html" href="https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;diff=46400&amp;oldid=prev"/>
		<updated>2015-01-24T02:54:10Z</updated>

		<summary type="html">&lt;p&gt;features &amp;amp; refactoring: cycle detection, separation of concerns&lt;/p&gt;
&lt;a href=&quot;https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;amp;diff=46400&amp;amp;oldid=46375&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Danf</name></author>
	</entry>
	<entry>
		<id>https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;diff=46375&amp;oldid=prev</id>
		<title>Danf: &#039;x&#039; to re-randomize ... lulz</title>
		<link rel="alternate" type="text/html" href="https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;diff=46375&amp;oldid=prev"/>
		<updated>2015-01-21T04:08:47Z</updated>

		<summary type="html">&lt;p&gt;&amp;#039;x&amp;#039; to re-randomize ... lulz&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:08, 20 January 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l5&quot;&gt;Line 5:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 5:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# turtlife.py - Artistic License w/ Attribution -&amp;gt; &amp;quot;(evil) Dan of MOISEBRIDGE&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# turtlife.py - Artistic License w/ Attribution -&amp;gt; &amp;quot;(evil) Dan of MOISEBRIDGE&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# note: press &amp;#039;n&amp;#039; to advance frame, &amp;#039;r&amp;#039; to run, &amp;#039;p&amp;#039; to pause&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# note: press &amp;#039;n&amp;#039; to advance frame, &amp;#039;r&amp;#039; to run, &amp;#039;p&amp;#039; to pause&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, &amp;#039;x&amp;#039; to re-randomize&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;from turtle import Screen, Turtle, mainloop&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;from turtle import Screen, Turtle, mainloop&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Danf</name></author>
	</entry>
	<entry>
		<id>https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;diff=46374&amp;oldid=prev</id>
		<title>Danf: better demo-size rows &amp; columns setting</title>
		<link rel="alternate" type="text/html" href="https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;diff=46374&amp;oldid=prev"/>
		<updated>2015-01-21T04:06:36Z</updated>

		<summary type="html">&lt;p&gt;better demo-size rows &amp;amp; columns setting&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:06, 20 January 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l205&quot;&gt;Line 205:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 205:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;def main():&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;def main():&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   sr = ScreenRunner(rules=&amp;#039;life&amp;#039;, displaymode=&amp;#039;fade&amp;#039;, rows=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;17&lt;/del&gt;, cols=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;29&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   sr = ScreenRunner(rules=&amp;#039;life&amp;#039;, displaymode=&amp;#039;fade&amp;#039;, rows=&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;7&lt;/ins&gt;, cols=&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;11&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   return &amp;quot;EVENTLOOP&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   return &amp;quot;EVENTLOOP&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Danf</name></author>
	</entry>
	<entry>
		<id>https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;diff=46373&amp;oldid=prev</id>
		<title>Danf: python turtle module -&gt; Conway&#039;s Game of Life ... and stuff.</title>
		<link rel="alternate" type="text/html" href="https://wiki.extremist.software/index.php?title=User:Danf/TurtleGraphics&amp;diff=46373&amp;oldid=prev"/>
		<updated>2015-01-21T04:01:56Z</updated>

		<summary type="html">&lt;p&gt;python turtle module -&amp;gt; Conway&amp;#039;s Game of Life ... and stuff.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;python turtle module -&amp;gt; Conway&amp;#039;s Game of Life ... and stuff.&lt;br /&gt;
&lt;br /&gt;
experimental work in progress, needs to be cleaned up and refactored a bit ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# turtlife.py - Artistic License w/ Attribution -&amp;gt; &amp;quot;(evil) Dan of MOISEBRIDGE&amp;quot;&lt;br /&gt;
# note: press &amp;#039;n&amp;#039; to advance frame, &amp;#039;r&amp;#039; to run, &amp;#039;p&amp;#039; to pause&lt;br /&gt;
&lt;br /&gt;
from turtle import Screen, Turtle, mainloop&lt;br /&gt;
from itertools import islice, product, repeat, starmap&lt;br /&gt;
from random import randint&lt;br /&gt;
from time import sleep&lt;br /&gt;
&lt;br /&gt;
class Cell(object):&lt;br /&gt;
  def __init__(self, colony, row, col):&lt;br /&gt;
    self.colony = colony&lt;br /&gt;
    self.row = row&lt;br /&gt;
    self.col = col&lt;br /&gt;
    self.val = 0&lt;br /&gt;
    self.extra = 0&lt;br /&gt;
    self.rules = colony.rules&lt;br /&gt;
    self._neighbors = None&lt;br /&gt;
  def neighbors(self):&lt;br /&gt;
    if self._neighbors is None:&lt;br /&gt;
      self._neighbors = list(self.colony.neighbormap(self, self.colony.cells))&lt;br /&gt;
    return self._neighbors&lt;br /&gt;
  def neighborsum(self):&lt;br /&gt;
    return sum(o.val for o in self.neighbors())&lt;br /&gt;
  def destiny(self):&lt;br /&gt;
    n = self.neighborsum()&lt;br /&gt;
    if self.rules == &amp;#039;prime&amp;#039;:&lt;br /&gt;
      return ((self.val if (n == 5 or n == 7) else 1 if (n == 2 or n == 3) else 0), n) &lt;br /&gt;
    elif self.rules == &amp;#039;life&amp;#039;:&lt;br /&gt;
      return ((self.val if (n == 2) else 1 if (n == 3) else 0), n) &lt;br /&gt;
  def value(self, val=None, extra=None):&lt;br /&gt;
    if val is not None:&lt;br /&gt;
      self.val = val&lt;br /&gt;
    if extra is not None:&lt;br /&gt;
      self.extra = extra&lt;br /&gt;
    return self.val&lt;br /&gt;
  def valchar(self):&lt;br /&gt;
    return (&amp;#039; &amp;#039;, &amp;#039;o&amp;#039;)[self.val]&lt;br /&gt;
&lt;br /&gt;
class Raster(object):&lt;br /&gt;
  def __init__(self, rules, displaymode, rows, cols):&lt;br /&gt;
    self.rules = rules&lt;br /&gt;
    self.displaymode = displaymode&lt;br /&gt;
    self.rows = rows&lt;br /&gt;
    self.cols = cols&lt;br /&gt;
    self.cells = list(starmap(&lt;br /&gt;
      lambda x, y: Cell(self, x, y),&lt;br /&gt;
      product(range(rows), range(cols)) ))&lt;br /&gt;
    self.turtles = None&lt;br /&gt;
  def rowslice(self, r):&lt;br /&gt;
    i = r * self.cols&lt;br /&gt;
    return islice(self.cells, i, i + self.cols)&lt;br /&gt;
  def neighborhood(self, row, col):&lt;br /&gt;
    up = row - 1 if row else self.rows - 1&lt;br /&gt;
    down = row + 1 if row &amp;lt; self.rows - 1 else 0&lt;br /&gt;
    left = col - 1 if col else self.cols - 1&lt;br /&gt;
    right = col + 1 if col &amp;lt; self.cols - 1 else 0&lt;br /&gt;
    return ( (up, left), (up, col), (up, right),&lt;br /&gt;
             (row, left),             (row, right),&lt;br /&gt;
             (down, left), (down, col), (down, right) )&lt;br /&gt;
  def neighbormap(self, o, sq):&lt;br /&gt;
    return starmap(&lt;br /&gt;
      lambda x, y: sq[x * self.cols + y],&lt;br /&gt;
      self.neighborhood(o.row, o.col) )&lt;br /&gt;
  def turtledisplay(self):&lt;br /&gt;
    if self.turtles is None:&lt;br /&gt;
      self.turtles = list(CellularTurtle(self, row, col) for row in range(self.rows) for col in range(self.cols))&lt;br /&gt;
    for c, t in zip(self.cells, self.turtles):&lt;br /&gt;
      if c.val:&lt;br /&gt;
        if c.extra == 2:&lt;br /&gt;
          t.rgb = list(t.colors[&amp;#039;blue&amp;#039;])&lt;br /&gt;
        elif c.extra == 3:&lt;br /&gt;
          t.rgb = list(t.colors[&amp;#039;green&amp;#039;])&lt;br /&gt;
        elif c.extra == 5:&lt;br /&gt;
          t.rgb = list(t.colors[&amp;#039;yellow&amp;#039;])&lt;br /&gt;
        elif c.extra == 7:&lt;br /&gt;
          t.rgb = list(t.colors[&amp;#039;red&amp;#039;])&lt;br /&gt;
      else:&lt;br /&gt;
        if self.displaymode == &amp;#039;ambient&amp;#039;:&lt;br /&gt;
          t.rgb = list(t.ambience())&lt;br /&gt;
        elif self.displaymode == &amp;#039;fade&amp;#039;:&lt;br /&gt;
          for i in range(3):&lt;br /&gt;
            t.rgb[i] *= 0.618&lt;br /&gt;
        else:&lt;br /&gt;
          t.rgb = list(t.colors[&amp;#039;black&amp;#039;])&lt;br /&gt;
      t.color(t.rgb)&lt;br /&gt;
  def textdisplay(self):&lt;br /&gt;
    for r in range(self.rows):&lt;br /&gt;
      print(&amp;#039;&amp;#039;.join(map(lambda x: x.valchar(), self.rowslice(r))))&lt;br /&gt;
  def display(self):&lt;br /&gt;
    self.turtledisplay() &lt;br /&gt;
    self.textdisplay() &lt;br /&gt;
&lt;br /&gt;
class CellularTurtle(Turtle):&lt;br /&gt;
  def __init__(self, colony, row, col):&lt;br /&gt;
    Turtle.__init__(self)&lt;br /&gt;
    self.colony = colony&lt;br /&gt;
    self.row = row&lt;br /&gt;
    self.col = col&lt;br /&gt;
    self.speed(0)&lt;br /&gt;
    # self.hideturtle()&lt;br /&gt;
    self.shape(&amp;quot;circle&amp;quot;)&lt;br /&gt;
    # self.settiltangle(90)&lt;br /&gt;
    self.resizemode(&amp;quot;user&amp;quot;)&lt;br /&gt;
    self.shapesize(2, 2, 0)&lt;br /&gt;
    self.pu()&lt;br /&gt;
    self.setx(col)&lt;br /&gt;
    self.sety(row)&lt;br /&gt;
    self.colors = dict( (&lt;br /&gt;
      ( &amp;#039;black&amp;#039;, (0.0, 0.0, 0.0) ),&lt;br /&gt;
      ( &amp;#039;grey50&amp;#039;, (0.5, 0.5, 0.5) ),&lt;br /&gt;
      ( &amp;#039;white&amp;#039;, (1.0, 1.0, 1.0) ),&lt;br /&gt;
      ( &amp;#039;red&amp;#039;, (0.7, 0.0, 0.0) ),&lt;br /&gt;
      ( &amp;#039;yellow&amp;#039;, (0.7, 0.7, 0.0) ),&lt;br /&gt;
      ( &amp;#039;green&amp;#039;, (0.0, 0.7, 0.0) ),&lt;br /&gt;
      ( &amp;#039;blue&amp;#039;, (0.0, 0.0, 0.7) ) ) )&lt;br /&gt;
    self.rgb = list(self.colors[&amp;#039;black&amp;#039;])&lt;br /&gt;
    self.color(self.rgb)&lt;br /&gt;
    self._neighbors = None&lt;br /&gt;
  def neighbors(self):&lt;br /&gt;
    if self._neighbors is None:&lt;br /&gt;
      self._neighbors = list(self.colony.neighbormap(self, self.colony.turtles))&lt;br /&gt;
    return self._neighbors&lt;br /&gt;
  def avg_rgb(self, turtles):&lt;br /&gt;
    rgb = [0.0, 0.0, 0.0]&lt;br /&gt;
    n = len(turtles)&lt;br /&gt;
    for t in turtles:&lt;br /&gt;
      for i in range(3):&lt;br /&gt;
        rgb[i] += t.rgb[i]&lt;br /&gt;
    return map(lambda x: x/n, rgb)&lt;br /&gt;
  def ambience(self):&lt;br /&gt;
    return self.avg_rgb(self.neighbors())&lt;br /&gt;
&lt;br /&gt;
class CellRunner(object):&lt;br /&gt;
  def __init__(self, rules, displaymode, rows, cols):&lt;br /&gt;
    self.raster = Raster(rules, displaymode, rows, cols) &lt;br /&gt;
    self.randomize()&lt;br /&gt;
  def randomize(self):&lt;br /&gt;
    list(map(lambda x: x.value(randint(0, 1)), self.raster.cells))&lt;br /&gt;
  def update(self, sync=True):&lt;br /&gt;
    dst = map(lambda x: x.destiny(), self.raster.cells)&lt;br /&gt;
    if sync:&lt;br /&gt;
      dst = list(dst)&lt;br /&gt;
    list(starmap(&lt;br /&gt;
       lambda x, y: x.value(*y),&lt;br /&gt;
      zip(self.raster.cells, dst) )) &lt;br /&gt;
    self.raster.display() &lt;br /&gt;
  def run(self, n=0, delay=0.1):&lt;br /&gt;
    f = (lambda: repeat(1, n)) if n else (lambda: repeat(1))&lt;br /&gt;
    for x in f():&lt;br /&gt;
      try:&lt;br /&gt;
        self.update(sync=True)&lt;br /&gt;
        if(delay):&lt;br /&gt;
          sleep(delay)&lt;br /&gt;
      except:&lt;br /&gt;
        break&lt;br /&gt;
&lt;br /&gt;
class ScreenRunner(object):&lt;br /&gt;
  def __init__(self, rules=&amp;#039;prime&amp;#039;, displaymode=&amp;#039;ambient&amp;#039;, rows=16, cols=32):&lt;br /&gt;
    self.screen = self.initscreen(rows, cols)&lt;br /&gt;
    self.cellrunner = CellRunner(rules, displaymode, rows, cols)&lt;br /&gt;
    self.running = False&lt;br /&gt;
    self.next()&lt;br /&gt;
  def initscreen(self, rows, cols):&lt;br /&gt;
    screen = Screen()&lt;br /&gt;
    screen.delay(0)&lt;br /&gt;
    offset = map(lambda x: x - 0.3, (0, rows, cols, 0))&lt;br /&gt;
    screen.setworldcoordinates(*offset)&lt;br /&gt;
    screen.bgcolor(0.0, 0.0, 0.0)&lt;br /&gt;
    screen.tracer(n=rows*cols)&lt;br /&gt;
    self.bindkeys(screen)&lt;br /&gt;
    return screen&lt;br /&gt;
  def bindkeys(self, screen):&lt;br /&gt;
    screen.onkey(self.randomize, &amp;#039;x&amp;#039;)&lt;br /&gt;
    screen.onkey(self.next, &amp;#039;n&amp;#039;)&lt;br /&gt;
    screen.onkey(self.run, &amp;#039;r&amp;#039;)&lt;br /&gt;
    screen.onkey(self.save, &amp;#039;s&amp;#039;)&lt;br /&gt;
    screen.onkey(self.pause, &amp;#039;p&amp;#039;)&lt;br /&gt;
    screen.onkey(self.quit, &amp;#039;q&amp;#039;)&lt;br /&gt;
    screen.listen()&lt;br /&gt;
  def randomize(self):&lt;br /&gt;
    self.cellrunner.randomize()&lt;br /&gt;
    self.next()&lt;br /&gt;
  def next(self):&lt;br /&gt;
    self.cellrunner.run(1, 0)&lt;br /&gt;
  def run(self):&lt;br /&gt;
    self.running = True&lt;br /&gt;
    self.timer()&lt;br /&gt;
  def save(self):&lt;br /&gt;
    self.pause(r)&lt;br /&gt;
    s = &amp;#039;&amp;#039;.join(str(o.val) for o in self.cellrunner.raster.cells)&lt;br /&gt;
    print(s)&lt;br /&gt;
  def pause(self):&lt;br /&gt;
    self.running = False&lt;br /&gt;
  def quit(self):&lt;br /&gt;
    exit()&lt;br /&gt;
  def timer(self, delay=100):&lt;br /&gt;
    if self.running:&lt;br /&gt;
      self.next()&lt;br /&gt;
      self.screen.ontimer(lambda: self.timer(delay), delay)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  sr = ScreenRunner(rules=&amp;#039;life&amp;#039;, displaymode=&amp;#039;fade&amp;#039;, rows=17, cols=29)&lt;br /&gt;
  return &amp;quot;EVENTLOOP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
  msg = main()&lt;br /&gt;
  print(msg)&lt;br /&gt;
  mainloop()&lt;/div&gt;</summary>
		<author><name>Danf</name></author>
	</entry>
</feed>