This is a program to search for oscillators, spaceships, and related objects in Conway's Game of Life and related cellular automata. In order to make any sense of it, you must be familiar with Life. If not, you can start by visiting some of the web sites on the topic, such as http://www.pobox.com/~jason1/life/.
LIFESRC by David Bell
Initial Windows port by Jason Summers
Further development by Karel Suhajda
Requires Windows 95/98/NT/whatever
Lots and lots of CPU time
This program may be buggy, quirky, illogical, and incomplete in places. And it isn't very well documented. Nearly all of that is the fault of the porter, not the author of LIFESRC.
This following picture isn't a typical WLS window but it shows all the elements that can be present:
The array displayed in the window represents the state of a block of cells during a certain number of generations (one generation is displayed at a time). If you want a given cell to be ON or OFF in a certain generation, you can force it to that state by setting it so in the array. All the other cells have an unknown state the program must determine to support the definition.
These are cells set to ON of OFF in a given generation.
Blank cells are neither ON nor OFF. They are set to either ON or OFF state during the search while keeping the Life rules. If all blank cells are set to ON or OFF, the array is declared a solution.
A frozen cell is a blank cell that must be the same in all generations. This means that during the search, the program assigns it the state ON or OFF in all generations at once.
Unchecked cells are blank cells that do not need to be set to find a solution. The program doesn't set them to ON or OFF during the search unless this choice is forced by the surrounding pattern and Life rules.
You can change cell state by pointing the mouse at the cell and pressing one of the following keys:
Normal (lowercase) keys change only the currently displayed generation. Pressed with shift (uppercase) set the cell in all generations. Note that Caps Lock reverses this behaviour. This doesn't apply to frozen cells, which are always set in all generations.
Mouse buttons have a reverse function, too. For instance, pressing the left mouse button over an ON cell changes the cell to blank.
If a block of cells is selected, all cells in the selected block are changed the desired way.
A block of cells can be selected simply by pressing and holding mouse button while dragging the mouse over the area to be selected. Only rectangular selections are possible.
All block operations are reachable from the Edit menu. However, keyboard shortcuts appear to be more practical. If there is a block selected, the operation is performed on it. Otherwise, the operation is performed on the whole field.
The following operation works on the whole field only, ignoring the selection.
The following keys change the displayed generation:
PgDn, ArrowRight, 'n', '.' - go to next generation
PgUp, ArrowLeft, 'p', ',' - go to previous generation
The generation can also be changed with the scroll bar at the bottom.
The field size can be changed by selecting Options/Rows and columns or by pressing 'F2':
The initial size is 35 by 15. The maximum size is 132 by 80.
The generation count can be changed by selecting Options/Period or by pressing 'F3':
Initially the field is 2 generations 'deep'. The maximum is 19 generations.
A symmetry can be specified by selecting Options/Symmetry or by pressing 'F4':
Diagonal, 90-degree and 8-fold symmetries are allowed only in a square field.
It is best to select the symmetry before you start to fill the field with cells. When editing a field with a symmetry set, all corresponding cells are set the same way. Note, however, that block operations (shifts/flips) don't honor the symmetry setting - it's your responsibility to return the field back to a symmetric state before starting a search.
Selected symmetry is displayed using symmetry markers.
Translations are used in spaceship/fuse searches, i.e. when the pattern is periodic and moves at the same time. Translation can be set by selecting Options/Translation or by pressing 'F5':
Rotate 90/270 and diagonal flips are allowed only in a square field.
The chosen translation is displayed using translation markers - the green and red arrows. You can imagine the red arrow placed in one generation successor of the last generation, while the green arrow shows how the same arrow looks like in generation 0.
Basic search settings can be found by selecting Options/Search settings or by pressing 'F6':
Life rules - specify the rule under which the search will be done. Initially it's set to standard Life. Rules with B0 are not supported.
Force an ON cell in column - if set, only solutions with at least one ON cell in the specified column in generation 0 are accepted
Force an ON cell in row - the same for rows
Limit ON cells in generation 0 to - if set, only solutions with this number of ON cells or less in generation 0 are accepted
Limit ON cells in each column to - if set, maximum this number of cells are allowed to be ON in each column in generation 0
Limit width of each column to - if set, each column in generation 0 may be this number of cells wide. The width of a column is the maximum distance between two ON cells in it. A column containing just one ON cell is 1 cell wide.
ON cells must be within of ON cells in previous columns - if set, for each ON cell in generation 0 there must be an ON cell up to 'n' columns to the left and 'n' rows up or down.
Also find subperiods - in a periodic search, subperiodic solutions are omitted if this field is not checked. The test for subperiodicity is made by comparing the generation 0 of the solution with all its other generations.
Find parents only - normally, a periodic search is performed, i.e. i.e. the last
generation is the predecessor of generation 0. If this option is checked, the program doesn't
check what happens after last generation or before generation 0. This option
also influences generation sorting - if unchecked, generation 0 is sorted as first.
If checked, generation 0 is sorted as last.
Combine solutions only - when a search is running, solutions are displayed and saved and also a solution combination is calculated. The combination contains all cell states, which are the same in all solutions found so far. When the search ends normally (i.e. not by Reset), this combination is displayed. If this option is checked, individual solutions are not displayed or saved and the program just tries to find the combination, taking shortcuts where possible. Search for combination is never slower than normal search for all solutions, usually it is much faster.
Sort to try all gens first - if checked, all generations for given cell are sorted before another cell. If unchecked, whole generation is searched before the search continues to another generation.
Diagonal search order - if unchecked, the search goes by column by column starting from column 1. If checked, search goes diagonally taking upper left corner first.
Knightship search order - if checked, cells are sorted by 2*row+column.
Sort to find wide objects - if unchecked, the outer cells in a column are searched before the inner cells. If checked, the inner cells are searched before the outter cells. If the search sets thems OFF first, this may lead to finding wider objects first.
Sort to try middle columns first - if unchecked, the search starts at
column 1 and continues to the right. If checked, the search starts at the
middle column and continues on the columns to the left and right, alternating.
First try cells near ON cells in previous column - if checked, cell ordering is slightly twisted but I don't really understand how.
Try ON cells if ON in an adjacent generation- by default, all cells are tried in the OFF state first. With this box checked, cells are tried first in ON state if there is the ON state in the previous or the next generation. This setting should give preference to solutions with more stable cells.
First try cells with the greatest impact - 'smart' sort twisting. If
this box is checked, the first N cells in sort order are tested for how many cells
will be
forced to some state by setting it to ON or OFF. Then,
the cell that forces the most other cells is selected.
Try ON cells first if they have greater impact - applies in impact checking. If checked, cells are first tried in ON state if this state forces more cells to be set than the OFF state. If unchecked, the OFF state is tried first.
Impact checking window - sets how many of the cells at the top of the current search list are tested for impact (the 'N' value). The gray field shows the average window usage in the last 100.000 steps (usually smaller due to impact threshold).
Impact checking threshold - if a cell is found that forces this many cells to be set, the impact check is stopped and this cell is selected. The gray field shows the average impact in the last 100.000 steps (usually lower but may be higher).
The gray fields show how useful the impact checking values are. However, they are not updated when the dialog is open, so it is necessary to open/close the dialog to see how the values change over time. The Impact checking values can be changed during search.
Output settings can be found by selecting Options/Output settings or by pressing 'F7'.
Stop after each calculation - pauses the search and displays current status after setting a single cell and propagating its impact according to Life rules. Useful for debugging purposes or to see what's going on.
Stop when an object is found - pauses the search and displays current status after a solution is found. Doesn't work if the search setting 'combine solutions only' is set.
Save found objects to file - if checked, each solution found is written in text format to given file. Doesn't work if 'combine solutions only' search setting is set.
All generations - if checked, all generations of the solution are saved side-by-side. Otherwise, only generation 0 is saved.
Update screen every - sets how often current search progress is displayed.
Dump to file - if a number of calculations is specified, the search status is saved periodically to given file
Save partial results every - saves partial results to the same file as the solutions.
Once the field is set up, you can start the search by selecting Search/Prepare or Search/Start. When starting a search, the field is first checked for consistency. All defined cells are accepted and all direct implications from Life rules are propagated. Then, each Blank cell (including Unchecked cells!) is tested for ON and OFF state. If only one state is possible, the cell is set so. If anything goes wrong, an appropriate error message is displayed. There are three possible messages:
Inconsistent ON state for cell (r, c, g)
Inconsistent OFF state for cell (r, c, g)
These messages mean that the cell cannot be set this way.
Inconsistent UNK state for cell (r, c, g)
This message may appear during checking Blank cells for ON or OFF state and it means that given cell cannot be set - both the ON and OFF states lead to an inconsistency.
Don't be fooled by the cell coordinates, though. The actual problem may be several cells away from the reported location - so if this happens, just double-check the definition.
Search/Prepare just does the initial check, displays the
field status, and then pauses. This is useful to see how the
definition gets propagated by the Life rules.
Search/Start does the check and immediately continues searching.
While the search is running, the solutions and the current status are displayed according to output settings. You can use the following commands:
Search/Pause - pauses the search and displays the current status.
Search/Continue - continues the paused search
Search/Backup - goes back one level in the search tree. This may lead to skipping solutions.
Search/Backup 20 - goes back 20 levels in the search tree. This may lead to skipping solutions.
Search/Clear combination - clears the solution combination buffer.
Search/Reset - resets the search and allows you to edit the definition.
Search/Copy result - copies current state/solution to definition and
stops the search. This
enables you to use the current state as the basis for another search.
Search/Copy combination - like 'Copy result', but copies the combination buffer instead of the current state.
It is possible to save a running search to a dump file. It is also possible to save an unfinished definition, but it is internally saved as a running search and so it mustn't contain any inconsistencies.
Use File/Save state (Ctrl+S or L) to save the current status to a dump file. You should use the extension .wdf. The dump file is a plain text file, though.
Use File/Load state (Ctrl+O or D) to load the status from a dump file.
Ctrl | Shift | Key | Description |
a | Set the cell/selection to OFF ![]() |
||
A | Set the cell/selection to OFF ![]() |
||
B | Back up the search one cell | ||
c | Set the cell/selection to Blank ![]() |
||
C | Set the cell/selection to Blank ![]() |
||
Ctrl | C | Copy the displayed generation to the clipboard | |
d | Save the status to a dump file | ||
Ctrl | E | Flip the field/selection in the current generation vertically | |
Ctrl | Shift | E | Flip the field/selection in all generations vertically |
f, F | Set the cell/selection to Frozen ![]() |
||
Ctrl | G | Start the search | |
Ctrl | H | Flip the field/selection in the current generation horizontally | |
Ctrl | Shift | H | Flip the field/selection in all generations horizontally |
i | Change the cell/selection in the current generation from Unchecked ![]() ![]() |
||
I | Change the cell/selection in all generations from Unchecked ![]() ![]() |
||
l (minor 'L') | Load the status from a dump file | ||
n | Go to the next generation | ||
o | Change the cell/selection in the current generation from Blank ![]() ![]() |
||
O | Change the cell/selection in all generations from Blank ![]() ![]() |
||
Ctrl | O | Load the status from a dump file | |
p | Go to the previous generation | ||
Ctrl | P | Start the search, pause it right after the initial check | |
Ctrl | R | Reset the search | |
s | Set the cell/selection to ON ![]() |
||
S | Set the cell/selection to ON ![]() |
||
Ctrl | S | Save the search status to a dump file | |
Ctrl | T | Transpose the field/selection in current generation | |
Ctrl | Shift | T | Transpose the field/selection in all generations |
x | Set the cell/selection to Unchecked ![]() |
||
X | Set the cell/selection to Unchecked ![]() |
||
y | Back up the search 20 cells | ||
, | Go to the previous generation | ||
. | Go to the next generation | ||
Arrow left | Go to the previous generation | ||
Shift | Arrow left | Rotate the field/selection in the current generation one cell left | |
Ctrl | Shift | Arrow left | Rotate the field/selection in all generations one cell left |
Shift | Arrow up | Rotate the field/selection in the current generation one cell up | |
Ctrl | Shift | Arrow up | Rotate the field/selection in all generations one cell up |
Shift | Arrow down | Rotate the field/selection in the current generation one cell down | |
Ctrl | Shift | Arrow down | Rotate the field/selection in all generations one cell down |
Arrow right | Go to the next generation | ||
Shift | Arrow right | Rotate the field/selection in the current generation one cell right | |
Ctrl | Shift | Arrow right | Rotate the field/selection in all generations one cell right |
Backspace | Hide selection | ||
Ctrl | Delete | Change all cells in the current generation to Blank ![]() |
|
Ctrl | Shift | Delete | Change all cells in all generations to Blank ![]() |
Escape | Pause the search | ||
Page Up | Go to the previous generation | ||
Ctrl | Shift | Page Up | Rotate the field/selection in all generations one generation to past |
Page Down | Go to the next generation | ||
Ctrl | Shift | Page Down | Rotate the field/selection in all generations one generation to future |
Space | Continue the search | ||
F2 | Display the Rows and Columns dialog | ||
F3 | Display the Period dialog | ||
F4 | Display the Symmetry dialog | ||
F5 | Display the Translation dialog | ||
F6 | Display the Search settings dialog | ||
F7 | Display the Output settings dialog |
When search has nothing to do (no blank cells are present), it reports 'no solution'. The same happens also when all blank cells are filled by initial check.
If you pause or reset the search when the screen is being updated, program locks. If screen updates come too often, set Options/Output settings/Stop after each calculation to safely pause the search.
Some editing is possible during search (changes in field size, period, symmetry etc) but it is bound to screw the search so don't try it.
It is not possible to set a selection to ON by clicking the left mouse button.
When clicking the right mouse button when a block of cells is selected, the block is set to reverse of the cell clicked, even though that cell was outside the selection.
0.61
Bugfix/maintenance release by Karel Suhajda:
0.60
Changes by Karel Suhajda:
0.50
Changes by Karel Suhajda:
0.40
Jason Summers' port of David Bell's LIFESRC. Taken as 'initial' version because I'm unable to trace older changes.
John Conway for Life
David Bell for LIFESRC
Jason Summers for initial port of LIFESRC and for hosting this program
Gabriel Nivash and Dave Greene for spell-checking my horrible english.