It has only been 6 days.Saka wrote:I thought that this thread was unsinkable
Random posts
-
- Posts: 1334
- Joined: July 1st, 2016, 3:58 pm
Re: Random posts
I manage the 5S project, which collects all known spaceship speeds in Isotropic Non-totalistic rules. I also wrote EPE, a tool for searching in the INT rulespace.
Things to work on:
- Find (7,1)c/8 and 9c/10 ships in non-B0 INT.
- EPE improvements.
Things to work on:
- Find (7,1)c/8 and 9c/10 ships in non-B0 INT.
- EPE improvements.
Titanus is unsinkkkfcabIe!
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) = 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))
- PHPBB12345
- Posts: 1096
- Joined: August 5th, 2015, 11:55 pm
- Contact:
Re: Titanus is unsinkkkfcabIe!
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(2) = 1
f(3) = 1
f(4) = 2
f(5) = 4
f(6) = 2
f(9) = 4
Re: Titanus is unsinkkkfcabIe!
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
Because of how limited the information Saka gave about the function is, I think we are supposed to guess it as a "well-known" function.
-
- Posts: 795
- Joined: May 30th, 2016, 8:47 pm
- Location: Milky Way Galaxy: Planet Earth
Re: (Function)
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))
Code: Select all
x = 81, y = 96, rule = LifeHistory
58.2A$58.2A3$59.2A17.2A$59.2A17.2A3$79.2A$79.2A2$57.A$56.A$56.3A4$27.
A$27.A.A$27.2A21$3.2A$3.2A2.2A$7.2A18$7.2A$7.2A2.2A$11.2A11$2A$2A2.2A
$4.2A18$4.2A$4.2A2.2A$8.2A!
Re: Random posts
Yes it is probably impossible. It's the number of "sharp edges" in the number/equation without doing the equation unless there are more of the function in the equation.
Whatever,let's carion.
bjhwxy.com
Whatever,let's carion.
bjhwxy.com
-
- Posts: 1334
- Joined: July 1st, 2016, 3:58 pm
Re: Random posts
I manage the 5S project, which collects all known spaceship speeds in Isotropic Non-totalistic rules. I also wrote EPE, a tool for searching in the INT rulespace.
Things to work on:
- Find (7,1)c/8 and 9c/10 ships in non-B0 INT.
- EPE improvements.
Things to work on:
- Find (7,1)c/8 and 9c/10 ships in non-B0 INT.
- EPE improvements.
We walk in circles
Can't you stop what's happening?
Re: Random posts
Stop what? It's just a pun.
Re: Random posts
i've not been here for half a year. are p19s discovered yet?
Code: Select all
x = 15, y = 36, rule = B38/S23-
bo$2bo$3o14$13bo$12bo$12b3o2$11bo$12bo$10b3o4$12b3o$12bo$13bo2$10bo$8b
obo$9b2o$6b2o$5bobo$7bo!
Re: Random posts
Nope.72c20e wrote:i've not been here for half a year. are p19s discovered yet?
-
- Posts: 795
- Joined: May 30th, 2016, 8:47 pm
- Location: Milky Way Galaxy: Planet Earth
Re: Random posts
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!
Code: Select all
x = 81, y = 96, rule = LifeHistory
58.2A$58.2A3$59.2A17.2A$59.2A17.2A3$79.2A$79.2A2$57.A$56.A$56.3A4$27.
A$27.A.A$27.2A21$3.2A$3.2A2.2A$7.2A18$7.2A$7.2A2.2A$11.2A11$2A$2A2.2A
$4.2A18$4.2A$4.2A2.2A$8.2A!
Re: Random posts
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!
Re: Random posts
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?
-
- Posts: 795
- Joined: May 30th, 2016, 8:47 pm
- Location: Milky Way Galaxy: Planet Earth
Re: Re: Re:Re: Re: Re:Re: Re: Re: Random posts
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
x = 81, y = 96, rule = LifeHistory
58.2A$58.2A3$59.2A17.2A$59.2A17.2A3$79.2A$79.2A2$57.A$56.A$56.3A4$27.
A$27.A.A$27.2A21$3.2A$3.2A2.2A$7.2A18$7.2A$7.2A2.2A$11.2A11$2A$2A2.2A
$4.2A18$4.2A$4.2A2.2A$8.2A!
Re: Re: Re:Re: Re: Re:Re: Re: Re: Random posts
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)
Re: Re: Re:Re: Re: Re:Re: Re: Re: Random posts
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)
Is there one for a maximum rule?
Last edited by KittyTac on February 17th, 2018, 8:50 am, edited 1 time in total.
Re: ndom posts
Doesn't that also give a max rule?KittyTac wrote:
Is thare one for a maximum rule?
Re: ndom posts
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?
Re: ndom posts
Post the output hereKittyTac wrote: Either way, I couldn't find the max rule.
Re: ndom posts
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.
Re: Random posts
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.
P.S. See my post two posts down for a copy/paste friendly output format
The 5S project (Smallest Spaceships Supporting Specific Speeds) is now maintained by AforAmpere. The latest collection is hosted on GitHub and contains well over 1,000,000 spaceships.
Semi-active here - recovering from a severe case of LWTDS.
Semi-active here - recovering from a severe case of LWTDS.
[b]Ecksdee[/b]
Code: Select all
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