Re: Random posts
Posted: February 11th, 2018, 7:32 pm
It has only been 6 days.Saka wrote:I thought that this thread was unsinkable
It has only been 6 days.Saka wrote:I thought that this thread was unsinkable
f(1) = 1Saka wrote:I have a function.
f(1) = 1
f(2) = 1
f(3) = 1
f(4 + 5) = 4
f(f(4) + f(5)) = 2
What is the function and what are
f(25)
f(23 - 11)
f(f(50) + f(21))
f(1), f(2), f(3) and f(9) are the only ones that are actually known. Your guesses for f(4), f(5) and f(6) are just that, guesses, because we don't have enough information to determine them exactly, as "f(f(4) + f(5)) = 2" is one equation with three unknowns (f(4), f(5) and f(whatever f(4) + f(5) is)).PHPBB12345 wrote:f(1) = 1
f(2) = 1
f(3) = 1
f(4) = 2
f(5) = 4
f(6) = 2
f(9) = 4
There are infinitely many functions possible.Saka wrote:I have a function.
f(1) = 1
f(2) = 1
f(3) = 1
f(4 + 5) = 4
f(f(4) + f(5)) = 2
What is the function and what are
f(25)
f(23 - 11)
f(f(50) + f(21))
Nope.72c20e wrote:i've not been here for half a year. are p19s discovered yet?
Code: Select all
x = 8, y = 12, rule = B3-ceky/S23-ci
b2o2b2o$3b2o$3b2o$obo2bobo$o6bo2$o6bo$b2o2b2o$2b4o2$3b2o$3b2o!Should you post that in Miscellaneous Discoveries?Gamedziner wrote:Copperhead minimum rule:(Yes, copperhead requires ALL s2 transitions.)Code: Select all
x = 8, y = 12, rule = B3-ceky/S23-ci b2o2b2o$3b2o$3b2o$obo2bobo$o6bo2$o6bo$b2o2b2o$2b4o2$3b2o$3b2o!
The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.KittyTac wrote: Should you post that in Miscellaneous Discoveries?
Script?Saka wrote: The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.
Gamedziner wrote:Script?Saka wrote: The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.
Code: Select all
import golly as g
from glife import validint
from string import replace
Hensel = [
['0'],
['1c', '1e'],
['2a', '2c', '2e', '2i', '2k', '2n'],
['3a', '3c', '3e', '3i', '3j', '3k', '3n', '3q', '3r', '3y'],
['4a', '4c', '4e', '4i', '4j', '4k', '4n', '4q', '4r', '4t', '4w', '4y', '4z'],
['5a', '5c', '5e', '5i', '5j', '5k', '5n', '5q', '5r', '5y'],
['6a', '6c', '6e', '6i', '6k', '6n'],
['7c', '7e'],
['8']
]
# Python versions < 2.4 don't have "sorted" built-in
try:
sorted
except NameError:
def sorted(inlist):
outlist = list(inlist)
outlist.sort()
return outlist
# --------------------------------------------------------------------
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i+n]
# --------------------------------------------------------------------
def rulestringopt(a):
result = ''
context = ''
lastnum = ''
lastcontext = ''
for i in a:
if i in 'BS':
context = i
result += i
elif i in '012345678':
if (i == lastnum) and (lastcontext == context):
pass
else:
lastcontext = context
lastnum = i
result += i
else:
result += i
result = replace(result, '4aceijknqrtwyz', '4')
result = replace(result, '3aceijknqry', '3')
result = replace(result, '5aceijknqry', '5')
result = replace(result, '2aceikn', '2')
result = replace(result, '6aceikn', '6')
result = replace(result, '1ce', '1')
result = replace(result, '7ce', '7')
return result
clist = []
rule = g.getrule().split(':')[0]
fuzzer = rule + '9'
oldrule = rule
rule = ''
context = ''
deletefrom = []
for i in fuzzer:
if i == '-':
deletefrom = [x[1] for x in Hensel[int(context)]]
elif i in '0123456789/S':
if deletefrom:
rule += ''.join(deletefrom)
deletefrom = []
context = i
if len(deletefrom) == 0:
rule += i
elif i in deletefrom:
deletefrom.remove(i)
rule = rule.strip('9')
if not (rule[0] == 'B' and '/S' in rule):
g.exit('Please set Golly to a Life-like rule.')
if g.empty():
g.exit('The pattern is empty.')
s = g.getstring('Enter the period:', '', 'Rules calculator')
if not validint(s):
g.exit('Bad number: %s' % s)
numsteps = int(s)
if numsteps < 1:
g.exit('Period must be at least 1.')
g.select(g.getrect())
g.copy()
s = int(s)
for i in range(0,s):
g.run(1)
clist.append(list(chunks(g.getcells(g.getrect()), 2)))
mcc = min(clist[i])
clist[i] = [[x[0] - mcc[0], x[1] - mcc[1]] for x in clist[i]]
g.show('Processing...')
ruleArr = rule.split('/')
ruleArr[0] = ruleArr[0].lstrip('B')
ruleArr[1] = ruleArr[1].lstrip('S')
b_need = []
b_OK = []
s_need = []
s_OK = []
context = ''
fuzzed = ruleArr[0] + '9'
for i in fuzzed:
if i in '0123456789':
if len(context) == 1:
b_need += Hensel[int(context)]
b_OK += Hensel[int(context)]
context = i
elif context != '':
b_need.append(context[0] + i)
b_OK.append(context[0] + i)
context += context[0]
context = ''
fuzzed = ruleArr[1] + '9'
for i in fuzzed:
if i in '0123456789':
if len(context) == 1:
s_need += Hensel[int(context)]
s_OK += Hensel[int(context)]
context = i
elif context != '':
s_need.append(context[0] + i)
s_OK.append(context[0] + i)
context += context[0]
for i in [iter2 for iter1 in Hensel for iter2 in iter1]:
if not i in b_OK:
b_OK.append(i)
execfor = 1
# B0 and nontotalistic rulestrings are mutually exclusive
try:
g.setrule(rulestringopt('B' + ''.join(b_OK) + '/S' + ruleArr[1]))
except:
b_OK.remove(i)
execfor = 0
for j in range(0, s * execfor):
g.run(1)
try:
dlist = list(chunks(g.getcells(g.getrect()), 2))
mcc = min(dlist)
dlist = [[x[0] - mcc[0], x[1] - mcc[1]] for x in dlist]
if not(clist[j] == dlist):
b_OK.remove(i)
break
except:
b_OK.remove(i)
break
g.new('')
g.paste(0, 0, 'or')
g.select(g.getrect())
b_OK.sort()
if not i in s_OK:
s_OK.append(i)
execfor = 1
# B0 and nontotalistic rulestrings are mutually exclusive
try:
g.setrule(rulestringopt('B' + ruleArr[0] + '/S' + ''.join(s_OK)))
except:
s_OK.remove(i)
execfor = 0
for j in range(0, s * execfor):
g.run(1)
try:
dlist = list(chunks(g.getcells(g.getrect()), 2))
mcc = min(dlist)
dlist = [[x[0] - mcc[0], x[1] - mcc[1]] for x in dlist]
if not(clist[j] == dlist):
s_OK.remove(i)
break
except:
s_OK.remove(i)
break
g.new('')
g.paste(0, 0, 'or')
g.select(g.getrect())
s_OK.sort()
if i in b_need:
b_need.remove(i)
g.setrule(rulestringopt('B' + ''.join(b_need) + '/S' + ruleArr[1]))
for j in range(0, s):
g.run(1)
try:
dlist = list(chunks(g.getcells(g.getrect()), 2))
mcc = min(dlist)
dlist = [[x[0] - mcc[0], x[1] - mcc[1]] for x in dlist]
if not(clist[j] == dlist):
b_need.append(i)
break
except:
b_need.append(i)
break
g.new('')
g.paste(0, 0, 'or')
g.select(g.getrect())
b_need.sort()
if i in s_need:
s_need.remove(i)
g.setrule(rulestringopt('B' + ruleArr[0] + '/S' + ''.join(s_need)))
for j in range(0, s):
g.run(1)
try:
dlist = list(chunks(g.getcells(g.getrect()), 2))
mcc = min(dlist)
dlist = [[x[0] - mcc[0], x[1] - mcc[1]] for x in dlist]
if not(clist[j] == dlist):
s_need.append(i)
break
except:
s_need.append(i)
break
g.new('')
g.paste(0, 0, 'or')
g.select(g.getrect())
s_need.sort()
g.setrule(oldrule)
ruleres = 'B' + ''.join(sorted(b_need)) + '/S' + ''.join(sorted(s_need))
ruleres = rulestringopt(ruleres)
g.setrule(ruleres)
Rhombic wrote:Gamedziner wrote:Script?Saka wrote: The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.Code: Select all
import golly as g from glife import validint from string import replace Hensel = [ ['0'], ['1c', '1e'], ['2a', '2c', '2e', '2i', '2k', '2n'], ['3a', '3c', '3e', '3i', '3j', '3k', '3n', '3q', '3r', '3y'], ['4a', '4c', '4e', '4i', '4j', '4k', '4n', '4q', '4r', '4t', '4w', '4y', '4z'], ['5a', '5c', '5e', '5i', '5j', '5k', '5n', '5q', '5r', '5y'], ['6a', '6c', '6e', '6i', '6k', '6n'], ['7c', '7e'], ['8'] ] # Python versions < 2.4 don't have "sorted" built-in try: sorted except NameError: def sorted(inlist): outlist = list(inlist) outlist.sort() return outlist # -------------------------------------------------------------------- def chunks(l, n): for i in range(0, len(l), n): yield l[i:i+n] # -------------------------------------------------------------------- def rulestringopt(a): result = '' context = '' lastnum = '' lastcontext = '' for i in a: if i in 'BS': context = i result += i elif i in '012345678': if (i == lastnum) and (lastcontext == context): pass else: lastcontext = context lastnum = i result += i else: result += i result = replace(result, '4aceijknqrtwyz', '4') result = replace(result, '3aceijknqry', '3') result = replace(result, '5aceijknqry', '5') result = replace(result, '2aceikn', '2') result = replace(result, '6aceikn', '6') result = replace(result, '1ce', '1') result = replace(result, '7ce', '7') return result clist = [] rule = g.getrule().split(':')[0] fuzzer = rule + '9' oldrule = rule rule = '' context = '' deletefrom = [] for i in fuzzer: if i == '-': deletefrom = [x[1] for x in Hensel[int(context)]] elif i in '0123456789/S': if deletefrom: rule += ''.join(deletefrom) deletefrom = [] context = i if len(deletefrom) == 0: rule += i elif i in deletefrom: deletefrom.remove(i) rule = rule.strip('9') if not (rule[0] == 'B' and '/S' in rule): g.exit('Please set Golly to a Life-like rule.') if g.empty(): g.exit('The pattern is empty.') s = g.getstring('Enter the period:', '', 'Rules calculator') if not validint(s): g.exit('Bad number: %s' % s) numsteps = int(s) if numsteps < 1: g.exit('Period must be at least 1.') g.select(g.getrect()) g.copy() s = int(s) for i in range(0,s): g.run(1) clist.append(list(chunks(g.getcells(g.getrect()), 2))) mcc = min(clist[i]) clist[i] = [[x[0] - mcc[0], x[1] - mcc[1]] for x in clist[i]] g.show('Processing...') ruleArr = rule.split('/') ruleArr[0] = ruleArr[0].lstrip('B') ruleArr[1] = ruleArr[1].lstrip('S') b_need = [] b_OK = [] s_need = [] s_OK = [] context = '' fuzzed = ruleArr[0] + '9' for i in fuzzed: if i in '0123456789': if len(context) == 1: b_need += Hensel[int(context)] b_OK += Hensel[int(context)] context = i elif context != '': b_need.append(context[0] + i) b_OK.append(context[0] + i) context += context[0] context = '' fuzzed = ruleArr[1] + '9' for i in fuzzed: if i in '0123456789': if len(context) == 1: s_need += Hensel[int(context)] s_OK += Hensel[int(context)] context = i elif context != '': s_need.append(context[0] + i) s_OK.append(context[0] + i) context += context[0] for i in [iter2 for iter1 in Hensel for iter2 in iter1]: if not i in b_OK: b_OK.append(i) execfor = 1 # B0 and nontotalistic rulestrings are mutually exclusive try: g.setrule(rulestringopt('B' + ''.join(b_OK) + '/S' + ruleArr[1])) except: b_OK.remove(i) execfor = 0 for j in range(0, s * execfor): g.run(1) try: dlist = list(chunks(g.getcells(g.getrect()), 2)) mcc = min(dlist) dlist = [[x[0] - mcc[0], x[1] - mcc[1]] for x in dlist] if not(clist[j] == dlist): b_OK.remove(i) break except: b_OK.remove(i) break g.new('') g.paste(0, 0, 'or') g.select(g.getrect()) b_OK.sort() if not i in s_OK: s_OK.append(i) execfor = 1 # B0 and nontotalistic rulestrings are mutually exclusive try: g.setrule(rulestringopt('B' + ruleArr[0] + '/S' + ''.join(s_OK))) except: s_OK.remove(i) execfor = 0 for j in range(0, s * execfor): g.run(1) try: dlist = list(chunks(g.getcells(g.getrect()), 2)) mcc = min(dlist) dlist = [[x[0] - mcc[0], x[1] - mcc[1]] for x in dlist] if not(clist[j] == dlist): s_OK.remove(i) break except: s_OK.remove(i) break g.new('') g.paste(0, 0, 'or') g.select(g.getrect()) s_OK.sort() if i in b_need: b_need.remove(i) g.setrule(rulestringopt('B' + ''.join(b_need) + '/S' + ruleArr[1])) for j in range(0, s): g.run(1) try: dlist = list(chunks(g.getcells(g.getrect()), 2)) mcc = min(dlist) dlist = [[x[0] - mcc[0], x[1] - mcc[1]] for x in dlist] if not(clist[j] == dlist): b_need.append(i) break except: b_need.append(i) break g.new('') g.paste(0, 0, 'or') g.select(g.getrect()) b_need.sort() if i in s_need: s_need.remove(i) g.setrule(rulestringopt('B' + ruleArr[0] + '/S' + ''.join(s_need))) for j in range(0, s): g.run(1) try: dlist = list(chunks(g.getcells(g.getrect()), 2)) mcc = min(dlist) dlist = [[x[0] - mcc[0], x[1] - mcc[1]] for x in dlist] if not(clist[j] == dlist): s_need.append(i) break except: s_need.append(i) break g.new('') g.paste(0, 0, 'or') g.select(g.getrect()) s_need.sort() g.setrule(oldrule) ruleres = 'B' + ''.join(sorted(b_need)) + '/S' + ''.join(sorted(s_need)) ruleres = rulestringopt(ruleres) g.setrule(ruleres)
Doesn't that also give a max rule?KittyTac wrote:
Is thare one for a maximum rule?
Either way, I couldn't find the max rule.Saka wrote:Doesn't that also give a max rule?KittyTac wrote:
Is thare one for a maximum rule?
Post the output hereKittyTac wrote: Either way, I couldn't find the max rule.
It just automatically opens the minimum rule, no output file or anything.Saka wrote:Post the output hereKittyTac wrote: Either way, I couldn't find the max rule.
Both the totalistic and isotropic version of this script can be found in this post on the Golly scripts thread. There's lots of good stuff there, it's a shame it tends to be hard to find things if you don't know that they're there.Gamedziner wrote:Script?Saka wrote: The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.
Code: Select all
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