<div dir="ltr">Consider the following update function for conway's game of life:<br><br><div class="prettyprint" style="background-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid; border-width: 1px; word-wrap: break-word;"><code class="prettyprint"><div class="subprettyprint"><span style="color: #008;" class="styled-by-prettify">from</span><span style="color: #000;" class="styled-by-prettify"> collections </span><span style="color: #008;" class="styled-by-prettify">import</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Counter</span><span style="color: #000;" class="styled-by-prettify"><br><br></span><span style="color: #008;" class="styled-by-prettify">def</span><span style="color: #000;" class="styled-by-prettify"> update</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">live</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Set</span><span style="color: #660;" class="styled-by-prettify">[</span><span style="color: #606;" class="styled-by-prettify">Tuple</span><span style="color: #660;" class="styled-by-prettify">[</span><font color="#000000"><span style="color: #606;" class="styled-by-prettify">Integer</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Integer</span></font><span style="color: #660;" class="styled-by-prettify">]]):</span><span style="color: #000;" class="styled-by-prettify"><br>    counts </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Counter</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">fromkeys</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">live</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #066;" class="styled-by-prettify">0</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">+</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Counter</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">itertools</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">chain</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">neighbors</span><span style="color: #660;" class="styled-by-prettify">(*</span><span style="color: #000;" class="styled-by-prettify">cell</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">for</span><span style="color: #000;" class="styled-by-prettify"> cell </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> live</span><span style="color: #660;" class="styled-by-prettify">))</span><span style="color: #000;" class="styled-by-prettify"><br>    flip </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">{</span><span style="color: #000;" class="styled-by-prettify">cell </span><span style="color: #008;" class="styled-by-prettify">for</span><span style="color: #000;" class="styled-by-prettify"> cell</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> count </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> counts</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">items</span><span style="color: #660;" class="styled-by-prettify">()</span><span style="color: #000;" class="styled-by-prettify"> <br>            </span><span style="color: #008;" class="styled-by-prettify">if</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">cell </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> live </span><span style="color: #008;" class="styled-by-prettify">and</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">not</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #066;" class="styled-by-prettify">1</span><span style="color: #660;" class="styled-by-prettify"><</span><span style="color: #000;" class="styled-by-prettify">count</span><span style="color: #660;" class="styled-by-prettify"><</span><span style="color: #066;" class="styled-by-prettify">4</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> <br>            </span><span style="color: #008;" class="styled-by-prettify">or</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">cell </span><span style="color: #008;" class="styled-by-prettify">not</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> live </span><span style="color: #008;" class="styled-by-prettify">and</span><span style="color: #000;" class="styled-by-prettify"> count</span><span style="color: #660;" class="styled-by-prettify">==</span><span style="color: #066;" class="styled-by-prettify">3</span><span style="color: #660;" class="styled-by-prettify">)}</span><span style="color: #000;" class="styled-by-prettify"><br>    live </span><span style="color: #660;" class="styled-by-prettify">^=</span><span style="color: #000;" class="styled-by-prettify"> flip<br><br>around </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> frozenset</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">filter</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">any</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> itertools</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">product</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">range</span><span style="color: #660;" class="styled-by-prettify">(-</span><span style="color: #066;" class="styled-by-prettify">1</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #066;" class="styled-by-prettify">2</span><span style="color: #660;" class="styled-by-prettify">),</span><span style="color: #000;" class="styled-by-prettify"> range</span><span style="color: #660;" class="styled-by-prettify">(-</span><span style="color: #066;" class="styled-by-prettify">1</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #066;" class="styled-by-prettify">2</span><span style="color: #660;" class="styled-by-prettify">))))</span><span style="color: #000;" class="styled-by-prettify"><br></span><span style="color: #008;" class="styled-by-prettify">def</span><span style="color: #000;" class="styled-by-prettify"> neighbors</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">r</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Integer</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> c</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Integer</span><span style="color: #660;" class="styled-by-prettify">):</span><span style="color: #000;" class="styled-by-prettify"><br>    </span><span style="color: #008;" class="styled-by-prettify">return</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">(((</span><span style="color: #000;" class="styled-by-prettify">r</span><span style="color: #660;" class="styled-by-prettify">+</span><span style="color: #000;" class="styled-by-prettify">dr</span><span style="color: #660;" class="styled-by-prettify">)%</span><span style="color: #000;" class="styled-by-prettify">height</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">c</span><span style="color: #660;" class="styled-by-prettify">+</span><span style="color: #000;" class="styled-by-prettify">dc</span><span style="color: #660;" class="styled-by-prettify">)%</span><span style="color: #000;" class="styled-by-prettify">width</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">for</span><span style="color: #000;" class="styled-by-prettify"> dr</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> dc </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> around</span><span style="color: #660;" class="styled-by-prettify">)</span></div></code></div><span class="styled-by-prettify" style="font-family: monospace; background-color: rgb(250, 250, 250); color: rgb(102, 102, 0);"><br></span>The problem is, Count.fromkeys isn't implemented. I propose that it work exactly as it does for dict, otherwise it's difficult to add items to a Counter when you want them to start off at zero or some other count.<br><br>The best solution I came up with is to, more confusingly, count live cells once extra and adjust the rules accordingly:<br><br><div class="prettyprint" style="background-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid; border-width: 1px; word-wrap: break-word;"><code class="prettyprint"><div class="subprettyprint"><span style="color: #008;" class="styled-by-prettify">def</span><span style="color: #000;" class="styled-by-prettify"> update</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">live</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Set</span><span style="color: #660;" class="styled-by-prettify">[</span><span style="color: #606;" class="styled-by-prettify">Tuple</span><span style="color: #660;" class="styled-by-prettify">[</span><span style="color: #606;" class="styled-by-prettify">Integer</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Integer</span><span style="color: #660;" class="styled-by-prettify">]]):</span><span style="color: #000;" class="styled-by-prettify"><br>    counts </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Counter</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">itertools</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">chain</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">live</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">*(</span><span style="color: #000;" class="styled-by-prettify">neighbors</span><span style="color: #660;" class="styled-by-prettify">(*</span><span style="color: #000;" class="styled-by-prettify">cell</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">for</span><span style="color: #000;" class="styled-by-prettify"> cell </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> live</span><span style="color: #660;" class="styled-by-prettify">)))</span><span style="color: #000;" class="styled-by-prettify"><br>    flip </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">{</span><span style="color: #000;" class="styled-by-prettify">cell </span><span style="color: #008;" class="styled-by-prettify">for</span><span style="color: #000;" class="styled-by-prettify"> cell</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> count </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> counts</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">items</span><span style="color: #660;" class="styled-by-prettify">()</span><span style="color: #000;" class="styled-by-prettify"> <br>            </span><span style="color: #008;" class="styled-by-prettify">if</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">cell </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> live </span><span style="color: #008;" class="styled-by-prettify">and</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">not</span><span style="color: #000;" class="styled-by-prettify"> </span><font color="#006666"><span style="color: #066;" class="styled-by-prettify">2</span></font><span style="color: #660;" class="styled-by-prettify"><</span><span style="color: #000;" class="styled-by-prettify">count</span><span style="color: #660;" class="styled-by-prettify"><</span><span style="color: #066;" class="styled-by-prettify">5</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> <br>            </span><span style="color: #008;" class="styled-by-prettify">or</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">cell </span><span style="color: #008;" class="styled-by-prettify">not</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> live </span><span style="color: #008;" class="styled-by-prettify">and</span><span style="color: #000;" class="styled-by-prettify"> count</span><span style="color: #660;" class="styled-by-prettify">==</span><span style="color: #066;" class="styled-by-prettify">3</span><span style="color: #660;" class="styled-by-prettify">)}</span><span style="color: #000;" class="styled-by-prettify"><br>    live </span><span style="color: #660;" class="styled-by-prettify">^=</span><span style="color: #000;" class="styled-by-prettify"> flip<br><br>around </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> frozenset</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">filter</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">any</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> itertools</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">product</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">range</span><span style="color: #660;" class="styled-by-prettify">(-</span><span style="color: #066;" class="styled-by-prettify">1</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #066;" class="styled-by-prettify">2</span><span style="color: #660;" class="styled-by-prettify">),</span><span style="color: #000;" class="styled-by-prettify"> range</span><span style="color: #660;" class="styled-by-prettify">(-</span><span style="color: #066;" class="styled-by-prettify">1</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #066;" class="styled-by-prettify">2</span><span style="color: #660;" class="styled-by-prettify">))))</span><span style="color: #000;" class="styled-by-prettify"><br></span><span style="color: #008;" class="styled-by-prettify">def</span><span style="color: #000;" class="styled-by-prettify"> neighbors</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">r</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Integer</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> c</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Integer</span><span style="color: #660;" class="styled-by-prettify">):</span><span style="color: #000;" class="styled-by-prettify"><br>    </span><span style="color: #008;" class="styled-by-prettify">return</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">(((</span><span style="color: #000;" class="styled-by-prettify">r</span><span style="color: #660;" class="styled-by-prettify">+</span><span style="color: #000;" class="styled-by-prettify">dr</span><span style="color: #660;" class="styled-by-prettify">)%</span><span style="color: #000;" class="styled-by-prettify">height</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">c</span><span style="color: #660;" class="styled-by-prettify">+</span><span style="color: #000;" class="styled-by-prettify">dc</span><span style="color: #660;" class="styled-by-prettify">)%</span><span style="color: #000;" class="styled-by-prettify">width</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">for</span><span style="color: #000;" class="styled-by-prettify"> dr</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> dc </span><span style="color: #008;" class="styled-by-prettify">in</span><span style="color: #000;" class="styled-by-prettify"> around</span><span style="color: #660;" class="styled-by-prettify">)</span></div></code></div><span class="styled-by-prettify" style="font-family: monospace; background-color: rgb(250, 250, 250); color: rgb(102, 102, 0);"><br></span><br><div></div></div>