Aha, thx.lemon41625 wrote: ↑May 31st, 2020, 2:23 amUse this script by Saka and SuperSupermmario24 to generate a ruletable.Code: Select all
-- altRuleGen.lua -- Script to generate alternating non-totalistic rules. -- (Note: this makes no attempt to canonize the rulestrings.) -- -- Original Python script by Saka. -- -- Translated to Lua and then modified to include -- non-totalistic rules by SuperSupermario24. -- -- NOTE: NEVER ENTER B0 local g = golly() local gp = require "gplus" local r = g.getstring("Enter rule, in format Bx_Sx--Bx_Sx","B3_S2-i34q--B3_S23") local rule1, rule2 = gp.split(r, "--") local br1, sr1 = gp.split(rule1, "_") br1 = string.gsub(br1, "B", "") sr1 = string.gsub(sr1, "S", "") local br2, sr2 = gp.split(rule2, "_") br2 = string.gsub(br2, "B", "") sr2 = string.gsub(sr2, "S", "") trans0 = { ",0,0,0,0,0,0,0,0,y" } trans1 = { ["c"] = ",0,0,0,0,0,0,0,x,y", ["e"] = ",x,0,0,0,0,0,0,0,y" } trans2 = { ["c"] = ",0,x,0,0,0,0,0,x,y", ["e"] = ",x,0,0,0,0,0,x,0,y", ["k"] = ",0,0,x,0,0,0,0,x,y", ["a"] = ",x,0,0,0,0,0,0,x,y", ["i"] = ",x,0,0,0,x,0,0,0,y", ["n"] = ",0,0,0,x,0,0,0,x,y" } trans3 = { ["c"] = ",0,x,0,0,0,x,0,x,y", ["e"] = ",x,0,x,0,0,0,x,0,y", ["k"] = ",0,0,x,0,x,0,0,x,y", ["a"] = ",x,0,0,0,0,0,x,x,y", ["i"] = ",x,x,0,0,0,0,0,x,y", ["n"] = ",0,x,x,0,0,0,0,x,y", ["y"] = ",0,x,0,0,x,0,0,x,y", ["q"] = ",x,0,0,x,0,0,0,x,y", ["j"] = ",x,0,x,0,0,0,0,x,y", ["r"] = ",x,0,0,0,x,0,0,x,y" } trans4 = { ["c"] = ",0,x,0,x,0,x,0,x,y", ["e"] = ",x,0,x,0,x,0,x,0,y", ["k"] = ",0,x,0,0,x,0,x,x,y", ["a"] = ",x,x,x,0,0,0,0,x,y", ["i"] = ",0,x,x,0,0,0,x,x,y", ["n"] = ",x,x,0,0,0,x,0,x,y", ["y"] = ",0,x,x,0,0,x,0,x,y", ["q"] = ",x,0,0,x,0,0,x,x,y", ["j"] = ",x,0,x,0,x,0,0,x,y", ["r"] = ",x,0,x,0,0,0,x,x,y", ["t"] = ",x,x,0,0,x,0,0,x,y", ["w"] = ",x,0,x,x,0,0,0,x,y", ["z"] = ",x,0,0,x,x,0,0,x,y" } trans5 = { ["c"] = ",x,0,x,x,x,0,x,0,y", ["e"] = ",0,x,0,x,x,x,0,x,y", ["k"] = ",x,x,0,x,0,x,x,0,y", ["a"] = ",0,x,x,x,x,x,0,0,y", ["i"] = ",0,0,x,x,x,x,x,0,y", ["n"] = ",x,0,0,x,x,x,x,0,y", ["y"] = ",x,0,x,x,0,x,x,0,y", ["q"] = ",0,x,x,0,x,x,x,0,y", ["j"] = ",0,x,0,x,x,x,x,0,y", ["r"] = ",0,x,x,x,0,x,x,0,y" } trans6 = { ["c"] = ",x,0,x,x,x,x,x,0,y", ["e"] = ",0,x,x,x,x,x,0,x,y", ["k"] = ",x,x,0,x,x,x,x,0,y", ["a"] = ",0,x,x,x,x,x,x,0,y", ["i"] = ",0,x,x,x,0,x,x,x,y", ["n"] = ",x,x,x,0,x,x,x,0,y" } trans7 = { ["c"] = ",x,x,x,x,x,x,x,0,y", ["e"] = ",0,x,x,x,x,x,x,x,y" } trans8 = { ",x,x,x,x,x,x,x,x,y" } config0 = {1} config1 = {"c", "e"} config2 = {"c", "e", "k", "a", "i", "n"} config3 = {"c", "e", "k", "a", "i", "n", "y", "q", "j", "r"} config4 = {"c", "e", "k", "a", "i", "n", "y", "q", "j", "r", "t", "w", "z"} local function getChar(a, l) return string.sub(a, l, l) end transitions = { ["0"] = trans0, ["1"] = trans1, ["2"] = trans2, ["3"] = trans3, ["4"] = trans4, ["5"] = trans5, ["6"] = trans6, ["7"] = trans7, ["8"] = trans8 } configs = { ["0"] = config0, ["1"] = config1, ["2"] = config2, ["3"] = config3, ["4"] = config4, ["5"] = config3, ["6"] = config2, ["7"] = config1, ["8"] = config0 } local function fixTransition(s, n) if(n == 1) then s = string.gsub(s, "x", 1) s = string.gsub(s, "y", 2) elseif(n == 2) then s = string.gsub(s, "x", 2) s = string.gsub(s, "y", 1) end return s end local function genTransitions(B, S, n) t = {} for i in string.gmatch(B, "%d[%-%a]*") do if(getChar(i, 2) == "-") then local t2 = {table.unpack(configs[getChar(i, 1)])} for j = 3, string.len(i) do for k = 1, #t2 do if(getChar(i, j) == t2[k]) then table.remove(t2, k) end end end for j = 1, #t2 do table.insert(t, "0"..fixTransition(transitions[getChar(i, 1)][t2[j]], n)) end elseif(getChar(i, 2) == "") then for j = 1, #configs[i] do table.insert(t, "0"..fixTransition(transitions[i][configs[i][j]], n)) end else for j = 2, string.len(i) do table.insert(t, "0"..fixTransition(transitions[getChar(i, 1)][getChar(i, j)], n)) end end end for i in string.gmatch(S, "%d[%-%a]*") do if(getChar(i, 2) == "-") then local t2 = {table.unpack(configs[getChar(i, 1)])} for j = 3, string.len(i) do for k = 1, #t2 do if(getChar(i, j) == t2[k]) then table.remove(t2, k) end end end for j = 1, #t2 do table.insert(t, n..fixTransition(transitions[getChar(i, 1)][t2[j]], n)) end elseif(getChar(i, 2) == "") then for j = 1, #configs[i] do table.insert(t, n..fixTransition(transitions[i][configs[i][j]], n)) end else for j = 2, string.len(i) do table.insert(t, n..fixTransition(transitions[getChar(i, 1)][getChar(i, j)], n)) end end end return t end local function makeRuleTable(ruleName,nStates,neighborhood,symmetries,transitionsList) local rule = "@RULE "..ruleName.."\n\nAutomatically generated by a Lua script.\n\n" local ruletable = "@TABLE\n".."n_states:"..tostring(nStates).."\n".."neighborhood:"..neighborhood.."\n".."symmetries:"..symmetries.."\n" local transitions = "\n" for i = 1, #transitionsList do transitions = transitions..tostring(transitionsList[i]).."\n" end return rule..ruletable..transitions end local trans = {} local transr1 = genTransitions(br1, sr1, 1) local transr2 = genTransitions(br2, sr2, 2) table.insert(trans, "var a={0,1,2}") table.insert(trans, "var b=a") table.insert(trans, "var c=a") table.insert(trans, "var d=a") table.insert(trans, "var e=a") table.insert(trans, "var f=a") table.insert(trans, "var g=a") table.insert(trans, "var h=a") table.insert(trans, "#Rule 1") for i = 1, #transr1 do table.insert(trans, transr1[i]) end table.insert(trans, "1,a,b,c,d,e,f,g,h,0") table.insert(trans, "#Rule 2") for i = 1, #transr2 do table.insert(trans, transr2[i]) end table.insert(trans, "2,a,b,c,d,e,f,g,h,0") local theRule = makeRuleTable(r,3,"Moore","rotate4reflect",trans) local function fileExists(name) local a local f = io.open(name, "r") if f == nil then return false else f:close() return true end end local a = 0 local function saveRule(name, ruleFile) local ruledir = g.getdir("rules") local filename = ruledir..name..".rule" if not fileExists(filename) then a = 1 local file = assert(io.open(filename, "w"), "Unable to create rule table:\n"..filename) file:write(ruleFile) file:close() end end saveRule(r, theRule) g.setrule(r) if a == 1 then g.show("Created and switched to rule "..r..".") else g.show("Switched to rule "..r..".") end
B13/S|B47/S34 is a non-standard example of a collision rule.
Code: Select all
x = 99, y = 99, rule = B13/S|B47/S34
bo2bo4b2ob4o3bobob5obob3obobobobobo3b2ob3o2bo2bob5o2b3o4bo3b4obo4b2ob
3obob2o$b2o2b5o5b3o6b4o3b2ob3o2bobo4b2ob7obobobobob3obobo2b2ob6obo2b4o
b3o3bo$bo3b3ob3o3b2o5bo2bobo3bo7bob2obobob6o4b3o2b3obo5b4ob2o4bobob2o
4bo$2b2o2bobo4bob3o2bo6b2obob3o4b2o2b2o3bo2b2o2bob4ob2obobob4obo7b3o2b
ob2o6b2o$2bo5b2ob2o2b2o5bob2ob2ob2ob2o5b3obob8obo2b2ob2ob3o3b4ob5obo3b
o3bobo3b3o$4b3obo2b2o2b6obo2bo2b3obob2o2b2obob3o4bo4bo5b2ob4o2bob2o4b
3ob2o2bobob2ob2o2b2o$2obob3obob3o3b5obo2b3obo7bob2o3bobo3b2o3bo2bo3bob
ob2ob4o3bo6bobob4ob2ob3o$b2ob2o5bob4obo2bo3bo2bobobobobo2bob5o3b3o6bo
2bo2bobobobo6bo2b4o4b6o$2o2bo2bo3bo4b2o2bo2bo5bob4o3b4o3bob2o3bo5b2obo
2b3ob3ob2obo5b2ob4o3bob2o2b2o$2o2b3obo6b3o2b2o3bobo3bobo2b3ob3obob4obo
b3o2bob2o5bo4b2obobo3b4ob2o6b2obo$obo2b3ob5o7b3o2b3o3bo2bo3b3o2b2ob2o
2bob2ob2o5b3o2b2o2bob2o4b5o3b2o2bo4b2o$8b2obo2bob2o2b3o3b2o5bo3bob3o3b
obob4o5bob3obo2bobo3b3o5b3ob3o2bo2b2o$2bo2bo8bobobo2b2o4b2o2b2o8bobo3b
2o4b3obobob2o3b3ob3o2bo5bo3bo2bo3bobo$3b2ob2o2b4o6b5o3b2obobobo2b3o2bo
5bob3ob2obobob2ob2ob2obo2b2o3b2o7b3obo2b3o$2o2bobobobobo8bo2b2o3b4o5bo
3bo2b3o2bob2obob3o2bob2o2bo5b5ob2ob4o4b4o2b2o$2o6bob3obo3b4obo4b2o9b2o
bo2b2o3bob7o4b2ob2o3bobo2bo2b3o2b2ob2o2b2o2bob2o$2b3o2b2obob2ob3o2bo2b
2obob5ob5o2bob2obo2b4obob2o2bob5o2b6obobob2o3bob3o3bobob2o$3b2ob2obob
2obobo3bob3ob2obob2obo3bobobo3b3ob3obob2o3b4ob3obo4bobo2bo2b5o2bobo3bo
bo$bobobobob4obob3ob3o2bobo2b2o2b2o3b2ob2ob2ob2ob3ob2ob2o3bo3bob3o3bo
2b3obo3bo4b4o$2ob3ob2obo2b3o3b4o4b2obo2bo2b4obobobob2ob3o2bobobobo3bob
3o2b5o4bo4b3o3bobo3bo$4o3bo3bobob4obobobob2ob2obobob2ob12o2b5o2b3o3bo
2bo3b2o3bo2b5o2bob2o2b2ob2o$5bo3bo2bo6b3o2bob2o2b2o2b2o3bobob4o2bo2b2o
b2obo4b3ob2o3b7obob2obo2b2o3b4o$2ob3o2b5o3bobob6o7b2ob4o3b2o2b2o2b2o2b
2o8b4ob2obo4b2obo3b2o2b3o6bo$2obo2b2obobobo5b2obobobo2b2o2b2o4bo5b2o3b
o4b2o2bobob3obo3bob3ob2obo3b5o2bo2b4o$10obo2b3o2bo3bo2b3ob7ob2o2b7ob2o
5bob2o2bob2ob2o2bobobo2b2obob7o3bo2bo$2b2o4bobo2b2obo4b2o2bobo2bobo7bo
bob4o4bob3obobo3b2ob4o4b3ob3o3b2obo2bob6o$2ob2o5bo2bobob2obobob2obobob
2obob2o2b2o4b2o2bobobo4b3o3b6o3b2obo2bob3obo3b2o3bob2o$obo2bobob2o2bo
4bobo2b4ob5o6bo3b2o3bo3b3o3bo2b2o2b2o5b2ob3o3b8o3b2o2b2o$3o2b2o5bo2bob
ob2o2b2o3bo3bo2bo3b3o4bobobo3b4ob5obo3bo3b6o2b2o2bob2ob3o2bo2bo$2bob2o
2bo4bo2bobobo3b5ob3o3bobo3b3obob2o2b5ob2ob2obo2b3ob5obo2b2ob2obo2bobob
ob2o$4ob2o2b2o2b2o6bo5b3o2bo4b2o2b6obo2bo2bo2bo3b2o3bo2b2obo3b5o2bobo
2bo2b2o3bo$5obob2obo2b3ob2o2bob2obo3b6o2bobob3ob2o2b4ob2obobob4o5bobob
o2bo2bobo2b2o3bo3bobo$3obo4b2o3b5obob3ob2obobob2ob2ob3obo2b3obob4o2bob
3ob3o2bobo4bobo4bo2bo5bo3b2o$b2obobob2o2b3obo3b2obo6bobobobobo2b2o2bob
ob2ob5ob3obo2b3ob4obob3ob2o3bo2bob3o2b2o$2bo2b2ob4o7bobobo7bo5b3ob6obo
b2ob2o3bob3obo4b4o2bo2b2o7bo3b2o2bo$b3ob8obo2b4o2bo3bo3bob3ob4obo3b6o
6bob2ob3obob2obob2ob3obo2bo3bo2bo3b2o$3o2b2obo2bob4ob2o2b2o3b2o2bobo3b
3obo2bobo5bo4b5ob2ob2o4bob4ob4o2b3obob5ob2o$o4b3o2b2ob2o2b2o4bobo2bob
2o2b2o4bob2o3bobo4bob3o2bob3o5bobobob4obobo2b2o2bobo$b2obo2bo4b5o3b7o
3b2o2b2ob3o2b3obob2ob3o2b4obobo2b2ob2o3b2o5b3o2b8o3bo$ob4obo2b7ob2ob7o
bo2b3o2bob3o2bobob2o2bo2bo5b3obo4bo5bob2obo5b2o2b4o3bo$2obob4o4bobo2bo
6bo2b6o7b2o2bobo6bob2ob3ob4o3bo5b5o2b2o2b2obob7o$2o3b2ob3obo10bo3bob2o
bob11o4b2ob4o2b2o2bo2bob2o3bo2bo3b2ob2ob3ob2o3b3obo$3o2b5o2bo4bob6obo
2b2obo2b3o3b2ob2obo2bo2b3ob2ob2obo2bobo2b2o3b3obo2bo2bob2o4bo3bo$5o5bo
bo12bobob2o2b3obo2b3ob2ob3obob4o3bob2o3bo3bob4o2bo3b3obob3obo$2ob3o4bo
bob2o3b8o4b2o2b3o2bo2b4ob6obo2b3ob2ob3ob2o2bobobob2obobo2b2ob6obo$o4b
2o3b3obo3b2o6b3ob2ob4ob2obob4o3bo2b4ob4o2bob2o2b2o4b2obo3b2o2bob3obo2b
2o$o2b4o4b2ob2ob2obob3obob4o2bobo3b4ob2obo2bo2bob3ob2o2bob2obob3ob4obo
b4ob5o5bo$2o2bobo2b2ob2ob4o2bob3obobo3bobo5bo2bobo4b2ob5ob2o3bobob2ob
3obo5bo9bo2bo$b2o2b3o10bo3bobo3b11obo3bobob2o2bobobo3bobo3b2ob2o3b3o3b
2o3bob2o3bo4b2o$o3bobob4obob3ob7o2bob4o2bo3b2ob4obo5bobo2b4o5bobo3bo3b
4o4bo3b3o2b4o$obob4o3bo4bo2bob3o3b4o6b4o6b3o3bo2bobobob3o2bobob3obo5bo
bobo6b3o2bo$o3b2ob3ob5o2b2ob3o3bo3bo2bo2b7o4b4obob3ob3o2b3obob2o3bo4b
3o4b2o2b2o2bobo$ob4o4bobo2b2obob3o2bob4obo3bob5o2bo2b2o7b2o2bob4o2bob
3o3bob3obobo4bo2b3o$4obo5bo2bo3bo2b3ob2obob5ob3obo2bo2bo2bo3b2o2b4o2b
2o2b2obo3b2ob5o2bo2b2o2b2o4b2o$bob3obo7b2obob3o3bob2o2b4ob2o3b3o3b2ob
2obo4b3o2b2ob4o2b2o6bo3b2ob3obobob2o$obobo2b3ob3ob2ob8obo5bo2bo4b2o3b
6o4bo4b3obo3b3ob5ob4ob3obo3b3ob3o$bo2b2obo2bob3obobobo3b5ob3o2bo2bo2bo
b3ob2o2b5obo2b2obob2ob2obobo3bobo2b2obobo6bobo$ob7obobo2bobo3bob2o4b3o
2bo6bob4obo2b2o3bo2b4obobobo2bo2b2obo2b2o2bo2b8obobo$o8bob2obob2obobob
ob2o4bo2b3o5bob2ob3o2b6o2bo3bobo7bobo2bobo2bob2ob3obobo$2o2b2o5b2o3bo
2b2ob2o3bob5o6bo2b3o2bobobo2bobo3bo2bo4bobobo2b2ob2o4b2ob2o2b2obo$2obo
2b2obo3bo3b2o3b2obo6bo2bob2o3b4o3b2o3bo6b3o2b2ob3o2bob2o2bo2bo3bobo3bo
b3o$b7obo5bo2bob2o4b3obo2bo2bo4b2ob2ob2ob4obo3b2o4b2ob3o8bo3bob2o2bo2b
3o3bo$bob4o2b3o2b2o2bobo2b2ob3ob3obo3bo3bo2b2obobo5bob2ob3obo4b2o2bobo
b2o4b6o2b2ob2o$bob2o5b8ob3o2bobob3obob3ob2o2b2o2b2o4b5obo2b2o8bob2o3bo
2b4ob6o4b2o$o2bo3b5ob2obo2b2ob3o6bo4bo2bo2bo2b4o4bo3bo3bo2bo3b3obo4b4o
b4o2b4ob6o$obo5b3ob2o2bobo3b2o2bo3bo3b8obo3bobo3b3ob10o3bob2o3b3o2b3o
4bob5obo$o3bo2bobo2b4o2bob2obo2b5ob4o2bob3obo3b4obo2bobo2b2ob4ob2o2bo
3bobo2bo4bo4b2ob2obo$2b2o3bo2bo4bob5o3b2ob3obo4b2ob2o2bob3obo2bob3o7bo
b3o2bobo4b3obo3bob2ob4o2bo$bobob2o8bo2b4obo2bo7bobo2bo6b2o2b3o5b4o4b2o
2bob4o7b3obo5b3o$3b2o2bob6o3bobo2bobo6bobo4b3o5bob2o2b2o2bob2ob3o2bobo
bo3bobob2ob2ob4o2b4o2bo$b2o2b3o3bo4bob4ob4o6b2o3b2o2bo2b2obobo5b8o3bob
ob4o2bo3b2obob3obob2obo2bo$2o2bo2bob3o2b3obob2ob2o2b2ob3obo2b2o2b3ob4o
2b2ob3o3b2ob2o2bo2b3obo2b2o2bob2o3b2o3bobo2bo$2obobob2o3bobobobo2b2obo
4bob3o4bobo2bob3o2bo3bob2o3bo2b5ob2ob2ob6o6b2o4b2obo$bo2b2ob2o2bobob2o
7bobob5o2b2obobob2ob3o2bob2o2bob2ob3obo2bob2o2bo2b2obobo2bo3bob2obob3o
$ob3ob4obobo2b5o4b3ob3ob5obob2obob2o2bobo2b2obo7bobobob3o3b2obob2o2bo
3b3obo2bo$ob4obo4b2ob2o2b3ob6o2b2obobobo3b2obo3b2o4bob4o2bo2bo2bob4obo
bob2obobo2bobobobo2bo$ob3o2bob2o3b3o3bob5obobo5bo2bo8b3o4bo3bo2b3ob2ob
2ob2ob2obo3bo2b4o3b3o2bo$3bobo4b10o5b4o2b2ob2o3b2obo2b2obo2bobo3b2ob3o
2bo5b2o2b2obo2b2obo2b2o2bob4o$bobo3bo4b4o4b4ob3o3b3ob4o2bo2b2o2bob3o2b
5obobo4bo2bob3o2b5o3bo2b2o3b2o2bo$bo2b3obo2b4obobo3bobob2o3bobo3b2o3bo
b3ob2obob3ob2o2b8ob2o3bob2ob7obobo3b3o$bob3o4b3ob2ob3o2bo2b2o2bobobo5b
3obob3ob3o3b3o2bobo3b7o4bobo4bo4b2o6b2o$6bo2b3ob2o2b3obob2ob2ob2obobob
3ob3o2bobobob3ob4ob2ob5o2b3obob2obob7o2b2ob2o2bo$4o2b2ob2o2bobo2b3o6b
4o2bob2obob5o2bob2o4b2ob5ob2o4b2o3bo3b3ob2o6b3obo2bo$o3bob3ob4o8b2o3bo
bobo5bobo2b2o2bob3o5bobobo2b5ob2ob5ob2o2bo4bob2o3b2o2bo$o2b3ob3o4bobo
2bob2ob5o8b3obo2bob4o2bob2o4b2ob4ob2ob2o3bobobo4b3ob2obo3b2o$2bobo5bob
4ob3ob4o3bob4ob4obobo2bo2bobo2b2obobob2o3b2o3b2o4b2obobob2obo2bo2b4obo
$2o2b3o2bo2bo2b5o5b3obob2o3bobob2o2bob4o2bobobo3b2o4bo2b2o7bobob2o2bo
4bob5o$2bobob3o3bob3o3bo2bob3ob4o6bob3o3b2o3b4o2bo2b2ob2obob2obo6bob4o
3b3obo5bo$2o3bob3obob2obo2bo2b2obob2obo3bob6o2bo2b2o2b3o3bob2obo2b5obo
bobobo3bo3b2o5b2o2b3o$4bo2bobo2b7obo2b5ob5o2b6o3b2o4bo2b2o3b2o3bob2ob
2o2bo3bobob2o3bob7ob2o$obo2bo2bob3o2bo3bobo3b2obob2o3bo2bo2b2o2b6o3b3o
2b2ob2o3bo4bo4bobob2o2b5o3bo2bobo$3b2o3bo2b2ob2o8bo2bobobobobob3obo2b
3o3bo3b2obo3b2obo2b5o3bo2bob2ob3o3bob2o4b2o$2obob2obob2ob2o3b2ob2o6b2o
2bo3bo3b2obo5b2ob2obob2ob2o2bo2bo3b3o2b2ob3obobo2b2o4bobo$3ob2o5b2o2bo
2bob2ob2ob3ob2o4b2ob3o2b5obo2bo2bo4bob4o2bo2bo3bo2bob3o3bo3b2o2bobo$2b
obob3o3bob6o5bob2obo2bobobobobobo2b2o3bo3b6o2b2o2b3obo2b4o2bo2bobobobo
4bo2b2o$bob2ob6o2b3ob2obob3o2b2ob3obob2o2bobo4b5o2b6o3bob2ob4o2b5ob4o
2b2o2bo3bo$o4b4o3b2o2b3ob2o2bo2bobo7b4obob3o2bo3bob5ob2o3bo2bob7o2bob
3o4b2obo3b3o$obobob2o2b3o2bo2bob5o2b2o3b2o7b5ob2o3bob5obobobobo2b2o2b
3o2b2o4b2ob5ob3o2bo$3o6bobo2bo2bob4o2bo7b3o2b2o2b2o3b3obo2bob2obobo2bo
b3o2bo3b2o2b2o7b3o3bobobo!