## gencols: techniques

For scripts to aid with computation or simulation in cellular automata.
codeholic
Moderator
Posts: 1142
Joined: September 13th, 2011, 8:23 am
Location: Hamburg, Germany

### gencols: techniques

Though gencols is probably one of the first search programs for Conway's Game of Life,
it's still one of the most useful tools for exploring it.

I'd like to share some of my experience of working with gencols.

EDIT: It seems that the idea with a game doesn't really work out, so I'll just share my insights about gencols one after another.
Ivan Fomichev

codeholic
Moderator
Posts: 1142
Joined: September 13th, 2011, 8:23 am
Location: Hamburg, Germany

### Re: gencols: techniques

Example #1
Q: Find all unique collisions of a glider with each of standard spaceships, that don't destroy the spaceship and leave something behind.
A:

Code: Select all

./gencols -pat obj/glider.list obj/allss_n.list -nph 2 -tc 30 33 -gen 200 -del2 -filt ap -geq 1
"-nph 2" refers to the phases of each spaceship, we need just two, because spaceships are glide-symmetric, and we've already got all four gliders (and there are two pairs of symmetric patterns). "-tc 30 33" is because glider period is 4. "-del2" means, that we should be able to delete the second pattern in the place where it would be after 199 generations (gencols starts generation numbering with 1), if there were no collision. "-filt ap" means that we're looking for both periodic and aperiodic patterns. A periodic pattern is anything that repeats itself with an optional shift in up to 4 generations. Everything else is considered aperiodic. E. g. empty pattern, block, blinker, pulsar, glider and a spaceship are considered periodic, but r-pentamino, domino, a glider and a blinker and a pentadecathlon are considered aperiodic. One needs to specify "-filt ap", because otherwise gencols will also include those pattern, where deletion of the second pattern failed.

There is a way to change the maximum oscillator period detected by gencols, if you want to hunt for pentadecathlons, for instance.

Code: Select all

--- a/output.c
+++ b/output.c
@@ -62,7 +62,7 @@ int gen,resultafter,delpat1,delpat2,synch,genresult,pat1offset,pat2offset,phase;
}
#endif

-#define MAXOSCTEST 4
+#define MAXOSCTEST 30
removefailed=0;
if (countpat(tmp,tgen)
==countpat(pat1gen,tgen)+countpat(pat2gen,tgen)
@@ -158,7 +158,7 @@ int maxmove=0;
if (removefailed && !strchr(filterstring,'f') ) return;
if (per== -1 && !strchr(filterstring,'n') ) return;
if (per>MAXOSCTEST && !strchr(filterstring,'a') ) return;
-            if (per>=1 && per <=4 && !strchr(filterstring,'p') &&
+            if (per>=1 && per <= MAXOSCTEST && !strchr(filterstring,'p') &&
!strchr(filterstring,'0'+per)
&& (maxmove!=1 || !strchr(filterstring,'g'))
&& (maxmove!=2 || !strchr(filterstring,'s'))) return;

The last parameter, "-geq 1" instructs gencols to display only those results that have 1 or more cells. This number refers to the number of all cells after all removals that may have taken place (in our case, removal of the spaceship).
Ivan Fomichev

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

How would you search with gencols for all interactions of two pies on blinker tracks that do not destroy the pies?

codeholic
Moderator
Posts: 1142
Joined: September 13th, 2011, 8:23 am
Location: Hamburg, Germany

### Re: gencols: techniques

I would create two following pattern files:

pi.life

Code: Select all

..*
..*
..*
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.***
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..*
..*
..*
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.***
.
.
.
.
.
.
.
.
.
.
.
.
..*
.***
**.**

pi_g136.life

Code: Select all

.
.***
.
.
.
.
.
.
.
.
.
.
.
.
..*
.***
**.**
.
.
.
.
.
.
.
.***
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..*
..*
..*
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.***

Then I would run gencols with:

Code: Select all

./gencols -pat pi.life pi.life -nph 45 -tc 2 91 -gen 136 -test1 pi_g136.life -test2 pi_g136.life -genafter 50 -filt ap >result.col
Ivan Fomichev

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

Does the last version of gencols run on win7 64 bit?

Hartmut

codeholic
Moderator
Posts: 1142
Joined: September 13th, 2011, 8:23 am
Location: Hamburg, Germany

### Re: gencols: techniques

I don't know about Windows, but I had to do some adjustments in order to make it work on my 64-bit Mac.

The diff is against https://github.com/codeholic/gencols so I'm not sure whether it works for the original gencols.

Code: Select all

diff --git a/Makefile b/Makefile
index 398275a..7e5419f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
CC = gcc
-CFLAGS = -O3
+CFLAGS = -O3 -m64

all:	gencols makematrix makepatlist

diff --git a/boxes.c b/boxes.c
index 69aa457..f702dec 100644
--- a/boxes.c
+++ b/boxes.c
@@ -15,7 +15,7 @@

#include <stdio.h>
#include <limits.h>
-#include <malloc.h>
+//#include <malloc.h>
#include "defs.h"

diff --git a/defs.h b/defs.h
index 1983696..9a24cbf 100644
--- a/defs.h
+++ b/defs.h
@@ -36,7 +36,7 @@ typedef struct {
int maxc,maxr;
} TORUS;

-typedef unsigned long cellseg;
+typedef unsigned int cellseg;

#define WORDLEN 32
#define URBIT 0
diff --git a/lists.c b/lists.c
index 4a178d5..8dd1151 100644
--- a/lists.c
+++ b/lists.c
@@ -14,7 +14,7 @@

#include <stdio.h>
#include <limits.h>
-#include <malloc.h>
+//#include <malloc.h>
#include "defs.h"

#define HASHMULT 1999
diff --git a/makematrix.c b/makematrix.c
index d446f0b..2850ca5 100644
--- a/makematrix.c
+++ b/makematrix.c
@@ -14,7 +14,7 @@

#include <stdio.h>
#include <limits.h>
-#include <malloc.h>
+//#include <malloc.h>
#include "defs.h"

char inpline[MAXPATLEN];
diff --git a/makepatlist.c b/makepatlist.c
index 6f84742..fb792ec 100644
--- a/makepatlist.c
+++ b/makepatlist.c
@@ -15,7 +15,7 @@

#include <stdio.h>
#include <limits.h>
-#include <malloc.h>
+//#include <malloc.h>
#include "defs.h"

char inpline[MAXPATLEN];
diff --git a/output.c b/output.c
index 222e3f8..8c9cec4 100644
--- a/output.c
+++ b/output.c
@@ -15,7 +15,7 @@

#include <stdio.h>
#include <limits.h>
-#include <malloc.h>
+//#include <malloc.h>
#include "defs.h"

char filterstring[MAXLINE]="apnf";

Ivan Fomichev

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

I don't have a C compiler on my current machine.

codeholic
Moderator
Posts: 1142
Joined: September 13th, 2011, 8:23 am
Location: Hamburg, Germany

### Re: gencols: techniques

Google search for "gcc windows" returns http://www.mingw.org/ as the first link. (I haven't tried it myself, but people at stackoverflow also recommend it.)
Ivan Fomichev

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

My (windows) version of gencols doesn't find any files, no matter where I start it from.

What could be the reason? Does windows understand the extension *.life?

@codeholic: Could you run the pi search you proposed and tell me if there are any interesting results additionally to those already used in the caterpillar recipe?

Thanks for any help,
Hartmut

dvgrn
Moderator
Posts: 6701
Joined: May 17th, 2009, 11:00 pm
Contact:

### Re: gencols: techniques

HartmutHolzwart wrote:My (windows) version of gencols doesn't find any files, no matter where I start it from.

What could be the reason? Does windows understand the extension *.life?
Windows shouldn't care what a file is named, and I've never had any trouble with .life files on my Windows laptop.

Have you tried something radical, like moving the gencols executable to a folder right under the root directory -- C:\temp, let's say -- and specifying the full path in the call to gencols?

Code: Select all

.\gencols -pat C:\temp\pi.life C:\temp\pi.life -nph 45 -tc 2 91 -gen 136 -test1 C:\temp\pi_g136.life -test2 C:\temp\pi_g136.life -genafter 50 -filt ap > C:\temp\result.col
[The backslashes are Windows-specific -- most other OSes treat those as escape characters. Forward slashes should also work, though, as in codeholic's original. I recommended C:/temp because Windows is very strange in another way -- it's unpredictable about handling long file names, or filenames with spaces in them, especially when running simple old code.]

It's also worth actually running "cmd" (instead of relying on batch files -- just in case that's what you're doing), manually switching to the gencols directory, and running a "dir" to make sure that everything is really there and the names are all exactly correct.

I mention this only because Windows has always had a very nasty habit of hiding file extensions -- I have to turn off that "feature" immediately whenever I move to a new system. So it's perfectly possible to create your pi.life files in a text editor, and have Windows report that they're called plain old "pi.life". But when you check the directory listing, they're "pi.life.txt" ...!

-- Just trying to come up with a theory here. Otherwise I don't see why gencols couldn't find a file in the same directory as the executable.

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

So it's most liekly no 64 bit problem?

I use teh version that Paul Tooke uploaded es .exe in this forum.

dvgrn
Moderator
Posts: 6701
Joined: May 17th, 2009, 11:00 pm
Contact:

### Re: gencols: techniques

HartmutHolzwart wrote:So it's most liekly no 64 bit problem?
Not too likely. I have a 64-bit Windows machine, and I just set up gencols as I suggested and ran the search as codeholic suggested. Results are attached -- I haven't looked to see if they're the right results, though...

I'm using the version of gencols that I compiled and posted last year -- I haven't tried Paul Tooke's version, but probably I should, just to see if there's some strange incompatibility (with the new -rule command-line parameter he added, maybe?) You got your copy from this link, I take it?
Attachments
result.zip
results for gencols pi-climber collision search

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

you were completely correct! I created a txt file!

Many thanks,
Hartmut

oblique
Posts: 122
Joined: July 16th, 2013, 1:30 pm

### Re: gencols: techniques

As for 32 ./. 64

I found out the hard way, that the original version of gencols does *not* work correctly when compiled for 64 bits.

I recompiled with -m32 and ... tada ... the "example #1" posted by codeholic in this thread suddenly worked.

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

Found under the gencols pi collision results:

Code: Select all

x = 60, y = 105, rule = B3/S23
2$40b3o16$9b3o29bo$41bo$41bo3$40b3o$9b3o27bo3bo$9b3o27b2ob2o$9b3o$7bo 5bo$5b3o5b3o16bo17bo$b3o6bo6b3o10b3o3b2o7b2o3b3o$bo7b3o7bo9bo4bo2bo7bo
2bo4bo$b3o2bob2ob2obo2b3o9bo3bo15bo3bo$6b4ob4o14bo5b4o5b4o5bo$4b2ob2o 3b2ob2o13b2o4b2o7b2o4b2o$32b3o13b3o$5b2o7b2o17b2o13b2o$6b2o5b2o19bo3bo
5bo3bo$7bo5bo$35bo2bo5bo2bo$36bobo5bobo2$9b3o29bo$41bo$41bo14$10bo19bo bo$10bo22bo$10bo22bo6b3o$30bo2bo$31b3o14$9b3o22$32b2o$32b3o$31bob2o$
31b3o$32bo!  codeholic Moderator Posts: 1142 Joined: September 13th, 2011, 8:23 am Location: Hamburg, Germany ### Re: gencols: techniques You can find all of them by Code: Select all fgrep '(4,' result.col | ./makematrix -space 200 >result.life Ivan Fomichev HartmutHolzwart Posts: 463 Joined: June 27th, 2009, 10:58 am Location: Germany ### Re: gencols: techniques The interesting thing is that this produces a downward LWSS... Probably of no use but curious. codeholic Moderator Posts: 1142 Joined: September 13th, 2011, 8:23 am Location: Hamburg, Germany ### Re: gencols: techniques HartmutHolzwart wrote:The interesting thing is that this produces a downward LWSS... Probably of no use but curious. Actually there is a very good use for it, namely a glider filter. For backward rakes: Code: Select all ./gencols -pat obj/lwss_s.life obj/glider_se.life -nph 4 -tc 20 23 -gen 100 -del1 -filt p -leq 0 | ./makematrix Code: Select all #P 0 0 ............*.*. ...........*. ...........*. ...........*..*. ..*........***. *.*. .**. #P 50 0 ...........*.*. ..........*. .*........*. ..*.......*..*. ***.......***. #P 100 0 ............*.*. ...........*. ...........*. ...........*..*. *.*........***. .**. .*.  For forward rakes: Code: Select all ./gencols -pat obj/lwss_s.life obj/glider_ne.life -nph 4 -tc 20 23 -gen 100 -del1 -filt p -leq 0 | ./makematrix Code: Select all #P 0 0 ...........*.*. ..........*. ..........*. ..........*..*. ..........***. . . . . . . . . . **. .**. *. #P 50 0 ............*.*. ...........*. ...........*. ...........*..*. ...........***. . . . . . . . . . . . . . . .*. .**. *.*.  Ivan Fomichev HartmutHolzwart Posts: 463 Joined: June 27th, 2009, 10:58 am Location: Germany ### Re: gencols: techniques how would I search for pi collisions that cleanly delete the blinkers behind the pies? codeholic Moderator Posts: 1142 Joined: September 13th, 2011, 8:23 am Location: Hamburg, Germany ### Re: gencols: techniques I replaced pi_g136.life with Code: Select all . .*** . . . . . . . . . . . . ..* .*** **.**  and ran the same search Code: Select all ./gencols -pat pi.life pi.life -nph 45 -tc 2 91 -gen 136 -test1 pi_g136.life -test2 pi_g136.life -genafter 50 -filt ap >result.col Then I sorted results by population and took some first ones: Code: Select all sort -nk3 result.col | head -30 | ./makematrix -space 200 >result.life Here is the result (duplicates removed): Code: Select all x = 239, y = 483, rule = B3/S23 2bo199bo$2bo199bo$2bo199bo4$225bo$28b3o194bo$225bo10$b3o197b3o5$29bo$29bo194b3o$29bo9$2bo199bo$2bo199bo$2bo199bo4$225bo$28b3o194bo$225bo10$b3o197b3o5$29bo$29bo194b3o$29bo4$225bo$29bo194b3o$2bo26bo172bo20bo3bo$
b3o24bobo170b3o21bo$2ob2o195b2ob2o16bo3bo3bo$25b2ob3ob2o182b2o3bo7bo3b
2o$22bob2obo3bob2obo179b2o3bob5obo3b2o$21b5obo3bob5o177bo6bob3obo6bo$22b2o2bo5bo2b2o179b2o15b2o$26b2o3b2o183b5o9b5o$21bo2bo2bo3bo2bo2bo182b o9bo$26bobobobo186bo2b2o3b2o2bo$22bo3b2o3b2o3bo182b2ob2o3b2ob2o$26bo5b
o187bo2bo3bo2bo$25bo7bo187b2o5b2o123$202bo$202bo$202bo10$223b3o6$201b
3o10$224bo$224bo$224bo4$202bo$202bo$202bo10$223b3o6$201b3o10$224bo$
224bo$224bo$202bo$201b3o$200b2ob2o9$223b3o$222bo3bo$222b2ob2o122$2bo
199bo$2bo199bo$2bo199bo4$224bo$224bo$224bo3$29bo$29bo$29bo5$b3o197b3o 6$223b3o5$28b3o5$2bo199bo$2bo199bo$2bo199bo4$224bo$224bo$224bo3$29bo$29bo$29bo5$b3o197b3o2$224bo$223bobo$222bo3bo$222bo3bo4$223b3o$220bob5o bo$28b3o189b9o$221bo5bo$2bo199bo$b3o197b3o$2ob2o195b2ob2o$213b2o19b2o$
28b3o182bo2bob4o5b4obo2bo$28b3o183bo2bob5ob5obo2bo$28b3o186bo3b3ob3o3b
o$26bo5bo179bo7bo7bo7bo$24b3o5b3o175b2o6bob4ob4obo6b2o$20b3o6bo6b3o 171bo6bobob3ob3obobo6bo$20bo7b3o7bo172b3o21b3o$20b3o2bob2ob2obo2b3o 173b2o21b2o$25b4ob4o179bo21bo$23b2ob2o3b2ob2o2$24b2o7b2o$25b2o5b2o$26b
o5bo!
Probably it would make sense to increase -genafter a little bit in this case. It might be interesting also to analyse results of this search to find reactions that change the distance between pi tracks.
Ivan Fomichev

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

... this doesn't show all solutions! There are some pi rakes, where the glider collides with one of the blinker trails to clenly destroy it. The en cap of teh caterpillar uses one of these.

The question is whether there is a shorter end cap for the caterpillar.

One more complex idea would be a double pi trail that creates a blinker trail on which a pi travels the sdestroy the two original trails.

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

is there a possibility to filter out the blinker trails of a specific width in the gencols results?

codeholic
Moderator
Posts: 1142
Joined: September 13th, 2011, 8:23 am
Location: Hamburg, Germany

### Re: gencols: techniques

HartmutHolzwart wrote:is there a possibility to filter out the blinker trails of a specific width in the gencols results?
I believe there is no trivial way. Usually I write quick-and-dirty Golly scripts for tasks like this. I've written a bunch of utility functions, that appeared to be quite useful, such as finding a subpattern. In this particular case I would probably find all blinkers, compare their x-coordinates pairwise and write the results in a file.
Ivan Fomichev

HartmutHolzwart
Posts: 463
Joined: June 27th, 2009, 10:58 am
Location: Germany

### Re: gencols: techniques

again I seem to be too dumb to use gencols!

How would I find all ways of stacking two 17c/45 pies on the same trail?

codeholic
Moderator
Posts: 1142
Joined: September 13th, 2011, 8:23 am
Location: Hamburg, Germany

### Re: gencols: techniques

It seems an overkill to use gencols in this case, but why not...

pi.life

Code: Select all

..*
..*
..*
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.***
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..*
..*
..*
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.***
.
.
.
.
.
.
.
.
.
.
.
.
..*
.***
**.**

pi_g136.life

Code: Select all

.
.***
.
.
.
.
.
.
.
.
.
.
.
.
..*
.***
**.**

pi2.life

Code: Select all

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..*
.***
**.**

pi2_g136.life

Code: Select all

..*
.***
**.**


Code: Select all

./gencols -pat pi2.life pi.life -nph 90 -tc 30 35 -gen 136 -test1 pi2_g136.life -test2 pi_g136.life -filt ap >result.col

Here are the results:

Code: Select all

x = 429, y = 373, rule = B3/S23
9b3o97b3o97b3o96b3o97b3o16$10bo99bo99bo98bo99bo$10bo99bo99bo98bo99bo$10bo99bo99bo98bo99bo16$9b3o97b3o97b3o96b3o97b3o7$308b3o97b3o$109b3o97b
3o197bo$9b3o198bo97bobo96b2ob2o$10bo98bobo194bo5bo91b11o$104b3o2bobo2b 3o188b3obob3o87b2o4bobobo4b2o$4b3o7b3o185b2ob11ob2o82b3obo7bob3o83bo5b
o3bo5bo$3bobo3b3o3bobo84b2o3bob3obo3b2o83b2ob2obobobob2ob2o81bobo4bobo bo4bobo82bo15bo$3bo13bo84bo4bo5bo4bo82bo4bo7bo4bo87bobobo90b2ob3o3b3ob
2o$3b2ob2o5b2ob2o84b2o2b2o5b2o2b2o83bo3bob2ob2obo3bo82b4o2b5o2b4o87bo 2bobo2bo$5bo3bobo3bo91bo5bo90b2o2bo3bo2b2o85b2o4bobo4b2o88b2obobob2o$5b3o5b3o89b3o5b3o88b2ob2o3b2ob2o85b5o5b5o88b2o5b2o$105b2o7b2o188b3o5b
3o90b3o3b3o4$104bo11bo86b2o11b2o82bo17bo$3b3o3b3o3b3o85bobo3b3o3bobo
83bo3bo3b3o3bo3bo80bo2b2o3b3o3b2o2bo82b2o5b3o5b2o$o2b3o9b3o2bo79bob2ob o9bob2obo79b2o3bo9bo3b2o81b3o9b3o83bo3bo9bo3bo$o19bo79bo3bo11bo3bo79b
2ob2o11b2ob2o79bo17bo82bobo11bobo$o19bo79bo19bo179bo17bo5$7bobobobo$9b obo$6bo2bobo2bo$6bo7bo2$10bo99bo99bo98bo99bo$9b3o97b3o97b3o96b3o97b3o$
8b2ob2o95b2ob2o95b2ob2o94b2ob2o95b2ob2o28$8b3o98b3o98b3o98b3o98b3o16$
9bo100bo100bo100bo100bo$9bo100bo100bo100bo100bo$9bo100bo100bo100bo100b
o16$8b3o98b3o98b3o98b3o98b3o3$413bo$211bo100bo99b3o$110bo99bobo97b2ob
2o96bo3bo$8b3o98b3o98bobo97b2ob2o96b2ob2o$8b3o97bo3bo97bobo$8b3o99bo$
6bo5bo93bo3bo3bo193bo7bo87bo17bo$4b3o5b3o86b2o3bo7bo3b2o82b2o2b3o5b3o 2b2o81b3o2bo9bo2b3o79b4o2b2o7b2o2b4o$3o6bo6b3o82b2o3bob5obo3b2o81bobo
2b2o7b2o2bobo79b2o3bobo7bobo3b2o77bob3o2b2o7b2o2b3obo$o7b3o7bo81bo6bob 3obo6bo79b2o6bo5bo6b2o77b2ob2o3bo7bo3b2ob2o75b3o3b2o2bo5bo2b2o3b3o$3o
2bob2ob2obo2b3o82b2o15b2o81b2ob3o9b3ob2o79b2ob6o5b6ob2o77bo5bo2bo5bo2b
o5bo$5b4ob4o87b5o9b5o82b3o2bo7bo2b3o81bo2bo13bo2bo79b5o3bo5bo3b5o$3b2o
b2o3b2ob2o89bo9bo87bo3b2o5b2o3bo83b2o15b2o81b2ob2o11b2ob2o$104bo2b2o3b 2o2bo87b2o2b2o3b2o2b2o85bo4bo5bo4bo83bo2bo11bo2bo$4b2o7b2o89b2ob2o3b2o
b2o87bo2b2obobob2o2bo85bo3bo7bo3bo84b2o13b2o$5b2o5b2o91bo2bo3bo2bo89bo 2b2o3b2o2bo88bo3bo3bo3bo$6bo5bo93b2o5b2o91b3o5b3o90b3o5b3o91bo7bo$307b 2o7b2o91bo7bo3$8b3o98b3o98b3o98b3o98b3o13$9bo100bo100bo100bo100bo$8b3o
98b3o98b3o98b3o98b3o$7b2ob2o96b2ob2o96b2ob2o96b2ob2o96b2ob2o28$13b3o
96b3o97b3o98b3o97b3o16$14bo98bo99bo100bo99bo$14bo98bo99bo100bo99bo$14b o98bo99bo100bo99bo13$414bo$314bo98b3o$212b3o98b3o96bo3bo$13b3o96b3o97b 3o96b2obob2o93bobobobo$113bo97bobobo95b2o3b2o92b3o3b3o$13bobo95b2ob2o 94b2o3b2o94bobobobo92b2o5b2o$13bobo95b2ob2o94b3ob3o97bo96bo2bo2bo$12bo 3bo193b3ob3o92b3o5b3o90b2obobob2o$12bo3bo93bo5bo93bo5bo92b3o5b3o91b2o
3b2o$12b2ob2o93b3ob3o93b2o3b2o93bobo3bobo$210b2o3b2o92b3o5b3o$207bo11b o88b3o7b3o88bo9bo$105b4o9b4o85b2o9b2o90bo7bo90bo9bo$10bo7bo85b5o9b5o 79b2o5bo7bo5b2o78bo21bo77bo4b3o7b3o4bo$2bob6obo5bob6obo75bob5o9b5obo
76bob4o13b4obo76bobo3b2o9b2o3bobo76b2o3b2o9b2o3b2o$3ob6o9b6ob3o71b2o8b 2o3b2o8b2o75bob4o3bo3bo3b4obo78b2o3b2o2bo3bo2b2o3b2o78b2obobobo5bobobo b2o$2bo2bo2b5o3b5o2bo2bo73b2o7bo2bobo2bo7b2o73bobo3b2o4bobo4b2o3bobo
75b3o3b2obobobobob2o3b3o77b2ob2o3b2ob2o3b2ob2o$2bobo4bobo5bobo4bobo74b o7b3o3b3o7bo74b2o7bobo3bobo7b2o73b5o3bo11bo3b5o75b2o2bo4bobo4bo2b2o$3b
o21bo76b2o19b2o75b2obo5b3o3b3o5bob2o74b4o4b2ob2ob2ob2o4b4o72b2o2b3o2bo
3bobo3bo2b3o2b2o$4b3obo11bob3o77b2o19b2o77bobo17bobo77b2obo5bo5bo5bob 2o74b3obo3bo2bo3bo2bo3bob3o$5b3o13b3o80bo17bo80bo19bo79b2o19b2o76b3o6b
o5bo6b3o$403bo21bo5$13b3o96b3o97b3o98b3o97b3o13$14bo98bo99bo100bo99bo$
13b3o96b3o97b3o98b3o97b3o$12b2ob2o94b2ob2o95b2ob2o96b2ob2o95b2ob2o28$
13b3o16$14bo$14bo$14bo12$14bo$13bobo$12bo3bo$12bo3bo4$13b3o$10bob5obo$
10b9o$11bo5bo4$3b2o19b2o$3bo2bob4o5b4obo2bo$4bo2bob5ob5obo2bo$7bo3b3ob 3o3bo$2bo7bo7bo7bo$2o6bob4ob4obo6b2o$o6bobob3ob3obobo6bo$b3o21b3o$2b2o
21b2o$3bo21bo4$13b3o13$14bo$13b3o\$12b2ob2o!
Ivan Fomichev