This is a simple cellular automata program that takes a grid of cells decays them.
Each cell is evaluated based on how many neighbors it has within a square area. If the number of neighbors fall below a certain threshold, the cell dies (becomes blank). This process repeats throughout the whole grid until there are no cells left to kill (or if deaths go below a certain amount).
There are several options to control how the cells decay. Look inside the code files for more details.
Each branch is the code ported to a different language. I might add more if I revisit this small project. The main branch is written in Python(3.14), which is the original language I wrote it in.
Feel free to submit pull requests of your own ports, or extra features.
This library can also print all iterations to a folder (including neighbor counts for each of them if you choose to).
Settings:
threshold = 4
radius = 1
minDelta = 1
discriminate = false
Initial map:
XXXXXXXXXX XXX XX X X X X
X XX X XXXX XX XXXXXXXX X
XXX XXXXXXXX XXXXX XXXXXXXXX
X X X X X XX XXXX XXXXX X X
X X XXXXXXXX XX XXXXXXXX XXX X
X XX XX XX XXXXXX XXX XXXXX X
XXX XX XXXXXXXXXXXXXXX XXXX XX
XXX XXXXXXX XXX XXXXXXXX X
XXXX XXXXXXXXXX XXXX XXXXX
X X XXXXXXXX XXX X XX XX XXXXX
XXXXXXX X XX XXX XX XX XX
X XXXX XXXXXX XX XXXXX XX XX
X X X XX X XXXXXX XXXXXXX XXXX
XX XXX X XXXXXXX XXXXX X X XX
X XXX X XXXXXXX X XXX
XX XXX XXX X XXX X XX XXX XX
XXX XXXXXXX XXXXX XXX X XX X
X X X X XX XXX X X XXXXXXXXXX
XXX XXXXX XXXXXXXXX XXXXX XXXX
X XXXXXXXXXXX XX XX XXXXXXX XX
X XX XXXXXXXX XXXXX XX X X XX X
XXX XX XX X XX XXX XXX X XXXX
XXX XXXX X XXX X XXXX XXXXX X
XXXXX XXXX XX XX XXXX X X XXXX
X XXX XXXXX X XXX XXX XXX XXX
XXXXX XXXXXXXXX XX XX XX XX XXX
XXXX XXXX X XX XXXXXXX X XXXX
XXXXXXXX X XXXX XX X XXX XXXX X
XXX XX XX XX X X X XXXXXXXX X
XX XXX XXXXXXXXXXXXXX XXXXXXXX
X X XXXXXX X X XXXX XXX XXXX
XX XXXX XXXXX XXXXX XXX XXX XX
Mid-decay (20th iteration):
XX
XXXX XX
XXXX XXXXX
XX XXXXXXXX
XXXXXX XXX XXXXX
XXXXXXXXXXXXXX XXXX
XXXXXXX XXX XXXXXXXX
XXXXXXXXXX XXXX XXXX
XXXXXXXX XXX XX XXXX
XXXXX XXX XX XX
XXX XX XXXX XX
X XXXXXX XXX XXX
XX XXXXXX XXX XX
XX XXXXXXX XX
XXX XXX X XXX XX
XXXXXXX XXXXX XX X
X X XX XXX X XXXXXXXXX
XXXXX XXXXXXXX XXXXX XXXX
XXXXXXXXX XX XX XXXXXXX X
XXXXXXXX XXX XX X XX
XX XX XXX XX XX
XXXX X XXXX XX
XX XXXX XXXX XXX
XXX XXXXX XX XXX
XXXX XXXXX XXX
XXXX XXXX XXX
XXXXXX XXX
XX XXX
X
Final result (58 iterations):
XX
XXXX XX
XXXX XXXXX
XX XXXXXXXX
XXXXXX XXX XXXX
XXXXXXXXXXXXXX XX
XXXXXXX XXX XXXXX
XXXXXXXXXX XXXX
XXXXXXXX XXX XX
XXXXX XXX XX
XXX XX XXXX
X XXXXXX XXX
XX XXXXXX XXX
XX XXXXXXX
XXX XXX X XXX
XXXXXXX XXXXX
X X XX XXX X
XXXXX XXXXXXXX
XXXXXXXXX XX XX
XXXXXXXX XXX XX
XX XX XXX XX
XXXX X XXXX
XX XXXX XXXX
XXX XXXXX XX
XXXX XXXXX
XXXX XXXX
XXXXXX
XX
This example only detects neighbors of the same type. Settings:
threshold = 7
radius = 2
minDelta = 1
discriminate = true
Initial map:
ZZXYZZXYXXYXXZXZXZXXZYZZXYXYZZXY
XZXYYXYZZZZYXYZZZZZZZYYYYYZZXXXX
YYYXZYZYZZYYZZXZYXZZYXYXXZXXXYYX
ZZYZYYZXZZXYYZYYXYYZZYZXXXZYYYYY
XZZXZXXXXXYYXXZXXZXZXYZXZZYYZYXY
XXYXYZYXXYZZYYYZZXXZYZYYYZXYZZYX
XYZYZXXXZZZXZZZZZYXXYZZXYXXXZZXX
XZYYYZXZZZXXYXXXXZXXYXZXYXZYYXXY
XXXZZXXXYZZXZZZYXXYXZXYYXXZZZZYY
YXXYXYYZXXYXYXZXYZXXZXZYYXXYXZZX
YXZZZXZYYZZXYYZYZYYYYYXZZXZYZYYZ
XYXZZYXYZXZZYXZYZYYYYXZYYZYYZXYZ
ZZXXXYYZXZYXZXXXZYZYZYYYYXYZZZYY
XXXZXZXYXXZZYYXXXXYXZZYYZYYYZYXX
XYXYZXYZXXXZYZZZXYZXZXZYZYYZZYZX
XZXYZZXZZYYYXXYZZXZXYXYYXZXZYZZX
ZZYZYXXYXYYYXYZXXXZYYYZXZYXZZXXZ
ZXYXZXXZYYYZXXYZXYZYZZZZXYXXYYZX
XYZXYYZZXYZXXYZZXYYXYYYXZYZZYZZZ
YXXXXXZXXZZZYYXXYYYYYZZYZZXZYZXZ
ZZYXXZYYZXXZXYXZYZXXXXZZZZXZXZYX
YYZYZXXXXXZXYYYXZZXYZXYXXZXXXZXY
XXZXZZXZYZYZZXXZYYZXZZZXZZZXYZYZ
ZYYXYZYZZYZXXZXZZZZZZZZZYYXYXZYX
ZYXXXXXXYZYZYYYYXXXZXZZZYZZYZZYX
XYXZYZXXXXYXXZYYYXXZXZZXXZZXZYZX
XZZYZYYXXZZYYXYYXXZYXXXXXZYXYYXY
XXYZZYZXXYZZZYZXYXXZYYZYZXXXXZZX
ZYYYYZZZYXYYZZXXZXZYZXYXXZXZZZZX
XZYZXZXYXYXZXXYYXXZYYZYYZZZXXXZZ
XXYXXYYXYXZXYZYXZZZZZZXXZXYYZXYX
ZYYZXXXZZXZZYXXXZXXZXXXXZZZXYXXY
Mid-decay (7th iteration):
XXX
X
YYYYY
YYYY YY
XXX Y Y YYYY
X X X Y YY Y
X X Y
X YYY Y
X YYY Z
XX YY
X Z ZZ Z
XXX ZZ Z
ZZZZ Z
Z Z
ZZZ ZZ
ZZZZZ
X Z ZZZ
XXXX ZZ
XX
XX
Final result (15 iterations):
YYY
YYY
Y Y
YYY
YYY
YY
Z
ZZZ
ZZZZZ
Z ZZZ
ZZ