Tutorials/Coding Life simulators: Difference between revisions
Jump to navigation
Jump to search
Clarified that these are from two contributors |
style, formatting |
||
| Line 1: | Line 1: | ||
This is an | This is an incomplete collection of links to articles on the art of coding [[Conway's Game of Life|Life]] simulators. | ||
== Articles by Eric Lippert == | == Articles by Eric Lippert == | ||
| Line 5: | Line 5: | ||
In 2020-21, Eric Lippert wrote a 38-part coding tutorial discussing a series of algorithms for simulating Conway's Life (and/or other cellular automata), in his blog called [https://ericlippert.com/category/conwayslife/ Fabulous adventures in coding]. | In 2020-21, Eric Lippert wrote a 38-part coding tutorial discussing a series of algorithms for simulating Conway's Life (and/or other cellular automata), in his blog called [https://ericlippert.com/category/conwayslife/ Fabulous adventures in coding]. | ||
[https://ericlippert.com/2020/04/13/life-part-1/ Part 1]: Purpose and plan for Fabulous Adventures in Coding series | * [https://ericlippert.com/2020/04/13/life-part-1/ Part 1]: Purpose and plan for Fabulous Adventures in Coding series | ||
* [https://ericlippert.com/2020/04/20/life-part-2/ Part 2]: Intro to Life rules, plus intro to client and computation engine used in these articles | |||
[https://ericlippert.com/2020/04/20/life-part-2/ Part 2]: Intro to Life rules, plus intro to client and computation engine used in these articles | * [https://ericlippert.com/2020/04/23/life-part-3/ Part 3]: Naïve implementation of Life algorithm -- fixed board vs. wrap-around vs. embiggen as needed | ||
* [https://ericlippert.com/2020/04/27/life-part-4/ Part 4]: Asymptotic performance of naïve Life algorithm -- a series of useful digressions about big-O notation | |||
[https://ericlippert.com/2020/04/23/life-part-3/ Part 3]: Naïve implementation of Life algorithm -- fixed board vs. wrap-around vs. embiggen as needed | * [https://ericlippert.com/2020/04/30/life-part-5/ Part 5]: Naïve algo is proportional to number of cells in grid -- more salubrious and nourishing exercises with big-O notation | ||
* [https://ericlippert.com/2020/05/04/life-part-6/ Part 6]: Naïve algo, concluded -- speed bottlenecks and how to find them | |||
[https://ericlippert.com/2020/04/27/life-part-4/ Part 4]: Asymptotic performance of naïve Life algorithm -- a series of useful digressions about big-O notation | * [https://ericlippert.com/2020/05/07/life-part-7/ Part 7]: Scholes' Life algorithm in one line of APL -- life grid as array as mathematical value | ||
* [https://ericlippert.com/2020/05/11/life-part-8/ Part 8]: Scholes' Life algo, concluded -- performance metrics, and two ways to improve | |||
[https://ericlippert.com/2020/04/30/life-part-5/ Part 5]: Naïve algo is proportional to number of cells in grid -- more salubrious and nourishing exercises with big-O notation | * [https://ericlippert.com/2020/05/14/life-part-9/ Part 9]: Parallelizing computation of Life grids -- SIMD (Single Instruction on Multiple Data) | ||
* [https://ericlippert.com/2020/05/18/life-part-10/ Part 10]: Hardware acceleration and image processing -- GPUs and their limitations re: Life | |||
[https://ericlippert.com/2020/05/04/life-part-6/ Part 6]: Naïve algo, concluded -- speed bottlenecks and how to find them | * [https://ericlippert.com/2020/05/21/life-part-11/ Part 11]: Optimization guru Michael Abrash's algorithm from the 1990's -- performance, optimizations, and tradeoffs | ||
* [https://ericlippert.com/2020/05/26/life-part-12/ Part 12]: Turning Abrash's algo into Stafford's algo -- how to know when a cell might need to change? | |||
[https://ericlippert.com/2020/05/07/life-part-7/ Part 7]: Scholes' Life algorithm in one line of APL -- life grid as array as mathematical value | * [https://ericlippert.com/2020/05/28/life-part-13/ Part 13]: Turning Abrash's algo into Stafford's algo, continued -- performance as grid size increases | ||
* [https://ericlippert.com/2020/06/11/life-part-14/ Part 14]: Uses of a bigger grid -- puffers, rare ash, and the Wall of Death | |||
[https://ericlippert.com/2020/05/11/life-part-8/ Part 8]: Scholes' Life algo, concluded -- performance metrics, and two ways to improve | * [https://ericlippert.com/2020/06/15/life-part-15/ Part 15]: Abrash's algo to Stafford's algo, continued -- 18 pounds in a 15-pound sack | ||
* [https://ericlippert.com/2020/06/18/life-part-16/ Part 16]: Stafford's algo, continued -- updating neighbor counts | |||
[https://ericlippert.com/2020/05/14/life-part-9/ Part 9]: Parallelizing computation of Life grids -- SIMD (Single Instruction on Multiple Data) | * [https://ericlippert.com/2020/06/22/life-part-17/ Part 17]: UI optimizations | ||
* [https://ericlippert.com/2020/06/25/life-part-18/ Part 18]: Stafford's algo, continued -- optimizations | |||
[https://ericlippert.com/2020/05/18/life-part-10/ Part 10]: Hardware acceleration and image processing -- GPUs and their limitations re: Life | * [https://ericlippert.com/2020/06/29/life-part-19/ Part 19]: Stafford's algo implementation completed -- a lookup of functions | ||
* [https://ericlippert.com/2020/07/02/life-part-20/ Part 20]: Stafford's algo concluded (almost) -- verification of big-O predictions | |||
[https://ericlippert.com/2020/05/21/life-part-11/ Part 11]: Optimization guru Michael Abrash's algorithm from the 1990's -- performance, optimizations, and tradeoffs | * [https://ericlippert.com/2020/07/06/life-part-21/ Part 21]: Stafford's algo addendum -- optimization suggestions from David Stafford, Michael Abrash, Terje Mathisen | ||
* [https://ericlippert.com/2020/07/09/life-part-22/ Part 22]: Life with sparse arrays -- see also Python version on [https://www.madelyneriksen.com/python-game-of-life Madelyn Eriksen's blog] | |||
[https://ericlippert.com/2020/05/26/life-part-12/ Part 12]: Turning Abrash's algo into Stafford's algo -- how to know when a cell might need to change? | * [https://ericlippert.com/2020/07/13/life-part-23/ Part 23]: Putting together a prototype of Hensel's QuickLife algo -- data structure first intro | ||
* [https://ericlippert.com/2020/07/16/life-part-24/ Part 24]: Prototype of Hensel's QuickLife algo, continued -- stepping forward the center of a quad | |||
[https://ericlippert.com/2020/05/28/life-part-13/ Part 13]: Turning Abrash's algo into Stafford's algo, continued -- performance as grid size increases | * [https://ericlippert.com/2020/07/20/life-part-25/ Part 25]: Prototype of Hensel's QuickLife algo, continued -- 12x12 (9 Quad2s) -> 8x8, 1 tick later | ||
* [https://ericlippert.com/2020/07/23/life-part-26/ Part 26]: Prototype of Hensel's QuickLife algo, continued -- Quad3s and Quad4s | |||
[https://ericlippert.com/2020/06/11/life-part-14/ Part 14]: Uses of a bigger grid -- puffers, rare ash, and the Wall of Death | * [https://ericlippert.com/2020/07/27/life-part-27/ Part 27]: Prototype of Hensel's QuickLife algo, continued -- stepping algorithm | ||
* [https://ericlippert.com/2020/07/30/life-part-28/ Part 28]: Proto-QuickLife analysis -- speed not too bad, memory use pretty good | |||
[https://ericlippert.com/2020/06/15/life-part-15/ Part 15]: Abrash's algo to Stafford's algo, continued -- 18 pounds in a 15-pound sack | * [https://ericlippert.com/2020/08/03/life-part-29/ Part 29]: Optimization of Hensel's QuickLife algo -- miscellaneous bit-twiddling | ||
* [https://ericlippert.com/2020/08/05/life-part-30/ Part 30]: Adding change tracking for quads in Hensel's QuickLife algo -- a big optimization win | |||
[https://ericlippert.com/2020/06/18/life-part-16/ Part 16]: Stafford's algo, continued -- updating neighbor counts | * [https://ericlippert.com/2020/08/13/life-part-31/ Part 31]: Implementation of Hensel's QuickLife algo, concluded | ||
* [https://ericlippert.com/2020/08/17/life-part-32/ Part 32]: Core data structure of HashLife -- introducing quadtrees, quads, and memoization of quads | |||
[https://ericlippert.com/2020/06/22/life-part-17/ Part 17]: UI optimizations | * [https://ericlippert.com/2020/08/26/life-part-33/ Part 33]: Finding specific coordinates in a quadtree, drawing subsets of a quadtree | ||
* [https://ericlippert.com/2020/09/10/life-part-34/ Part 34]: A first attempt at Gosper's HashLife algorithm -- how do we step a quad forward one tick? | |||
[https://ericlippert.com/2020/06/25/life-part-18/ Part 18]: Stafford's algo, continued -- optimizations | * [https://ericlippert.com/2020/09/14/life-part-35/ Part 35]: Deriving HashLife for real -- a missed algorithmic optimization | ||
* [https://ericlippert.com/2020/10/06/life-part-36/ Part 36]: Digging into debugging -- a bug from part 32 tracked down, analyzed, and mercilessly exterminated | |||
[https://ericlippert.com/2020/06/29/life-part-19/ Part 19]: Stafford's algo implementation completed -- a lookup of functions | * [https://ericlippert.com/2020/10/12/life-part-37/ Part 37]: Are there any Life patterns that have unbounded quadratic growth? Yes! | ||
* [https://ericlippert.com/2021/02/17/life-part-38/ Part 38]: A 1970's BASIC implementation of one of the simplest possible Life algorithms | |||
[https://ericlippert.com/2020/07/02/life-part-20/ Part 20]: Stafford's algo concluded (almost) -- verification of big-O predictions | |||
[https://ericlippert.com/2020/07/06/life-part-21/ Part 21]: Stafford's algo addendum -- optimization suggestions from David Stafford, Michael Abrash, Terje Mathisen | |||
[https://ericlippert.com/2020/07/09/life-part-22/ Part 22]: Life with sparse arrays -- see also Python version on [https://www.madelyneriksen.com/python-game-of-life Madelyn Eriksen's blog] | |||
[https://ericlippert.com/2020/07/13/life-part-23/ Part 23]: Putting together a prototype of Hensel's QuickLife algo -- data structure first intro | |||
[https://ericlippert.com/2020/07/16/life-part-24/ Part 24]: Prototype of Hensel's QuickLife algo, continued -- stepping forward the center of a quad | |||
[https://ericlippert.com/2020/07/20/life-part-25/ Part 25]: Prototype of Hensel's QuickLife algo, continued -- 12x12 (9 Quad2s) -> 8x8, 1 tick later | |||
[https://ericlippert.com/2020/07/23/life-part-26/ Part 26]: Prototype of Hensel's QuickLife algo, continued -- Quad3s and Quad4s | |||
[https://ericlippert.com/2020/07/27/life-part-27/ Part 27]: Prototype of Hensel's QuickLife algo, continued -- stepping algorithm | |||
[https://ericlippert.com/2020/07/30/life-part-28/ Part 28]: Proto-QuickLife analysis -- speed not too bad, memory use pretty good | |||
[https://ericlippert.com/2020/08/03/life-part-29/ Part 29]: Optimization of Hensel's QuickLife algo -- miscellaneous bit-twiddling | |||
[https://ericlippert.com/2020/08/05/life-part-30/ Part 30]: Adding change tracking for quads in Hensel's QuickLife algo -- a big optimization win | |||
[https://ericlippert.com/2020/08/13/life-part-31/ Part 31]: Implementation of Hensel's QuickLife algo, concluded | |||
[https://ericlippert.com/2020/08/17/life-part-32/ Part 32]: Core data structure of HashLife -- introducing quadtrees, quads, and memoization of quads | |||
[https://ericlippert.com/2020/08/26/life-part-33/ Part 33]: Finding specific coordinates in a quadtree, drawing subsets of a quadtree | |||
[https://ericlippert.com/2020/09/10/life-part-34/ Part 34]: A first attempt at Gosper's HashLife algorithm -- how do we step a quad forward one tick? | |||
[https://ericlippert.com/2020/09/14/life-part-35/ Part 35]: Deriving HashLife for real -- a missed algorithmic optimization | |||
[https://ericlippert.com/2020/10/06/life-part-36/ Part 36]: Digging into debugging -- a bug from part 32 tracked down, analyzed, and mercilessly exterminated | |||
[https://ericlippert.com/2020/10/12/life-part-37/ Part 37]: Are there any Life patterns that have unbounded quadratic growth? Yes! | |||
[https://ericlippert.com/2021/02/17/life-part-38/ Part 38]: A 1970's BASIC implementation of one of the simplest possible Life algorithms | |||
== Articles by DroneBetter == | == Articles by DroneBetter == | ||
LifeWiki articles contributed by [[User:DroneBetter|DroneBetter]]: | |||
* [[{{PAGENAME}}/bitwise SWAR Life]] | * [[{{PAGENAME}}/bitwise SWAR Life]] | ||
* [[{{PAGENAME}}/eightfold reducer]] | * [[{{PAGENAME}}/eightfold reducer]] | ||
{{Tutorial}} | {{Tutorial}} | ||
Revision as of 04:17, 12 February 2023
This is an incomplete collection of links to articles on the art of coding Life simulators.
Articles by Eric Lippert
In 2020-21, Eric Lippert wrote a 38-part coding tutorial discussing a series of algorithms for simulating Conway's Life (and/or other cellular automata), in his blog called Fabulous adventures in coding.
- Part 1: Purpose and plan for Fabulous Adventures in Coding series
- Part 2: Intro to Life rules, plus intro to client and computation engine used in these articles
- Part 3: Naïve implementation of Life algorithm -- fixed board vs. wrap-around vs. embiggen as needed
- Part 4: Asymptotic performance of naïve Life algorithm -- a series of useful digressions about big-O notation
- Part 5: Naïve algo is proportional to number of cells in grid -- more salubrious and nourishing exercises with big-O notation
- Part 6: Naïve algo, concluded -- speed bottlenecks and how to find them
- Part 7: Scholes' Life algorithm in one line of APL -- life grid as array as mathematical value
- Part 8: Scholes' Life algo, concluded -- performance metrics, and two ways to improve
- Part 9: Parallelizing computation of Life grids -- SIMD (Single Instruction on Multiple Data)
- Part 10: Hardware acceleration and image processing -- GPUs and their limitations re: Life
- Part 11: Optimization guru Michael Abrash's algorithm from the 1990's -- performance, optimizations, and tradeoffs
- Part 12: Turning Abrash's algo into Stafford's algo -- how to know when a cell might need to change?
- Part 13: Turning Abrash's algo into Stafford's algo, continued -- performance as grid size increases
- Part 14: Uses of a bigger grid -- puffers, rare ash, and the Wall of Death
- Part 15: Abrash's algo to Stafford's algo, continued -- 18 pounds in a 15-pound sack
- Part 16: Stafford's algo, continued -- updating neighbor counts
- Part 17: UI optimizations
- Part 18: Stafford's algo, continued -- optimizations
- Part 19: Stafford's algo implementation completed -- a lookup of functions
- Part 20: Stafford's algo concluded (almost) -- verification of big-O predictions
- Part 21: Stafford's algo addendum -- optimization suggestions from David Stafford, Michael Abrash, Terje Mathisen
- Part 22: Life with sparse arrays -- see also Python version on Madelyn Eriksen's blog
- Part 23: Putting together a prototype of Hensel's QuickLife algo -- data structure first intro
- Part 24: Prototype of Hensel's QuickLife algo, continued -- stepping forward the center of a quad
- Part 25: Prototype of Hensel's QuickLife algo, continued -- 12x12 (9 Quad2s) -> 8x8, 1 tick later
- Part 26: Prototype of Hensel's QuickLife algo, continued -- Quad3s and Quad4s
- Part 27: Prototype of Hensel's QuickLife algo, continued -- stepping algorithm
- Part 28: Proto-QuickLife analysis -- speed not too bad, memory use pretty good
- Part 29: Optimization of Hensel's QuickLife algo -- miscellaneous bit-twiddling
- Part 30: Adding change tracking for quads in Hensel's QuickLife algo -- a big optimization win
- Part 31: Implementation of Hensel's QuickLife algo, concluded
- Part 32: Core data structure of HashLife -- introducing quadtrees, quads, and memoization of quads
- Part 33: Finding specific coordinates in a quadtree, drawing subsets of a quadtree
- Part 34: A first attempt at Gosper's HashLife algorithm -- how do we step a quad forward one tick?
- Part 35: Deriving HashLife for real -- a missed algorithmic optimization
- Part 36: Digging into debugging -- a bug from part 32 tracked down, analyzed, and mercilessly exterminated
- Part 37: Are there any Life patterns that have unbounded quadratic growth? Yes!
- Part 38: A 1970's BASIC implementation of one of the simplest possible Life algorithms
Articles by DroneBetter
LifeWiki articles contributed by DroneBetter:
- Tutorials/Coding Life simulators/bitwise SWAR Life
- Tutorials/Coding Life simulators/eightfold reducer
| |||||||||||||||||