KGRKJGETMRETU895U-589TY5MIGM5JGB5SDFESFREWTGR54TY
Server : Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 PHP/5.2.17
System : Linux localhost 2.6.18-419.el5 #1 SMP Fri Feb 24 22:47:42 UTC 2017 x86_64
User : nobody ( 99)
PHP Version : 5.2.17
Disable Function : NONE
Directory :  /usr/share/doc/python-numeric-23.7/Demo/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //usr/share/doc/python-numeric-23.7/Demo/life.py
"""A Python implementation of Conway's Life

Michael Wohlgenannt writes this about Life:
  "For a single cell there are two distinct states, dead and alive. A living
  cell dies of boredom if there are less than two living neighbours (all in
  all there are eight). A dead cell gets back to life again if there are
  exactly three living neighbours. The last rule is that a living cell dies
  if there are more than three living neighbours.
  A lot of cell configurations that can be constructed show a peculiar and
  amusing behaviour. Some stay as they are, dead or alive, some oscillate,
  some even propagate."
"""

# 26 august 1998, Just van Rossum <just@letterror.com>

from Numeric import *
import sys
import string

def life(cells):
	# convert cells to bytes for speed
	cells = cells.astype(Int8)

	# calculate how many neibors each cell has
	neighbors = shift_left(shift_up(cells))
	neighbors = neighbors + shift_up(cells)
	neighbors = neighbors + shift_right(shift_up(cells))
	neighbors = neighbors + shift_left(cells)
	neighbors = neighbors + shift_right(cells)
	neighbors = neighbors + shift_left(shift_down(cells))
	neighbors = neighbors + shift_down(cells)
	neighbors = neighbors + shift_right(shift_down(cells))

	# apply the "Life" rules (see module doc string)
	newcells = logical_or(
			logical_and(
				cells,
				logical_and(
					less_equal(2, neighbors),
					less_equal(neighbors, 3)
				)
			),
			equal(neighbors, 3)
		)

	# If I understood it correctly, with "rich comparisons"
	# the above could look like this:
	#
	# newcells = cell and (2 <= neighbors <= 3) or neighbors == 3
	#
	# Now, wouldn't that be nice...

	return newcells


def shift_up(cells):
	return concatenate((cells[1:], cells[:1]))

def shift_down(cells):
	return concatenate((cells[-1:], cells[:-1]))

def shift_left(cells):
	return transpose(shift_up(transpose(cells)))

def shift_right(cells):
	return transpose(shift_down(transpose(cells)))

def randomcells(width, height, chance = 5):
	from whrandom import randint
	cells = zeros((height, width), Int8)

	_range = range

	# fill with noise
	for y in _range(height):
		for x in _range(width):
			cells[y][x] = randint(0, chance) == 0
	return cells

def printcells(cells):
	x, y = cells.shape
	thing = "+" + y * "-" + "+"
	lines = [thing]
	for i in range(x):
		list = map(lambda x: " O"[x], cells[i])
		lines.append("|"+string.join(list, "")+"|")
	lines.append(thing)
	print string.join(lines, "\n")


if __name__ == "__main__":
	import time
	width = 20
	height = 10
	cells = randomcells(width, height)

	while 1:
		printcells(cells)
		time.sleep(0.1)
		cells = life(cells)



Anon7 - 2021