I had a spare fifteen minutes and decided that I should tidy up my monorepo. The work of tidying up is not finished; this is a small step in the right direction. TL;DR - Created a tools directory - Created a scratch directory (see README.md for more information) - Added README.md to third_party - Renamed delete_dotfile_symlinks -> symlinkManager - Packaged symlinkManager as an executable symlink-mgr using buildGo
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from itertools import product
 | |
| from random import choice
 | |
| from time import sleep
 | |
| from os import system
 | |
| from math import floor
 | |
| from colorama import Back, Fore, Style
 | |
| 
 | |
| ################################################################################
 | |
| # Simulation of Conway's Game of Life. The goal here was to write this with a
 | |
| # small amount of code as a proof-of-concept that could be run in the terminal.
 | |
| #
 | |
| # If you'd like to tinker with the rules, see the conditionals defined in the
 | |
| # `advance/1` function. For other parameters, like the board size and refresh
 | |
| # rate, refer to the while-loop defined at the bottom of this file.
 | |
| ################################################################################
 | |
| 
 | |
| 
 | |
| def init_board(n, init_alive_percentage):
 | |
|     """Initialize a board of size `n` by `n`. Supply a percentage,
 | |
|     `init_alive_percentage`, representing the number of cells in the board that
 | |
|     should be alive from the start."""
 | |
|     alive_count = floor(n * init_alive_percentage)
 | |
|     distribution = [True] * alive_count + [False] * (n - alive_count)
 | |
|     return [[choice(distribution) for _ in range(n)] for _ in range(n)]
 | |
| 
 | |
| 
 | |
| def neighbors(coord, board):
 | |
|     """Return the neighbors for a given `coord` on a `board`."""
 | |
|     n = len(board)
 | |
|     row, col = coord
 | |
|     return [
 | |
|         board[(row + row_d) % n][(col + col_d) % n]
 | |
|         for row_d, col_d in product([-1, 0, 1], [-1, 0, 1])
 | |
|         if (row_d, col_d) != (0, 0)
 | |
|     ]
 | |
| 
 | |
| 
 | |
| def advance(board):
 | |
|     """Advance the state of the `board` from T[n] to T[n+1]."""
 | |
|     n = len(board)
 | |
|     new_board = [[False for _ in range(n)] for _ in range(n)]
 | |
|     for row in range(n):
 | |
|         for col in range(n):
 | |
|             alive_count = len([x for x in neighbors((row, col), board) if x])
 | |
|             # Loneliness
 | |
|             if alive_count == 0:
 | |
|                 new_board[row][col] = False
 | |
|             # Status Quo
 | |
|             elif alive_count == 1:
 | |
|                 new_board[row][col] = board[row][col]
 | |
|             # Cooperation
 | |
|             elif alive_count == 2:
 | |
|                 new_board[row][col] = True
 | |
|             # Resource starvation
 | |
|             elif alive_count >= 3:
 | |
|                 new_board[row][col] = False
 | |
|     return new_board
 | |
| 
 | |
| 
 | |
| def print_board(board):
 | |
|     """Print the game `board` in a human-readable way."""
 | |
|     result = ''
 | |
|     for row in board:
 | |
|         for col in row:
 | |
|             if col:
 | |
|                 result += Back.GREEN + '1 ' + Style.RESET_ALL
 | |
|             else:
 | |
|                 result += Back.RED + '0 ' + Style.RESET_ALL
 | |
|         result += '\n'
 | |
|     print(result)
 | |
| 
 | |
| 
 | |
| board = init_board(100, 0.50)
 | |
| while True:
 | |
|     system('clear')
 | |
|     print_board(board)
 | |
|     sleep(0.15)
 | |
|     board = advance(board)
 |