Page 46 of 238

Re: Random posts

Posted: February 11th, 2018, 7:32 pm
by AforAmpere
Saka wrote:I thought that this thread was unsinkable
It has only been 6 days.

Titanus is unsinkkkfcabIe!

Posted: February 12th, 2018, 10:09 am
by Saka
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))

Re: Titanus is unsinkkkfcabIe!

Posted: February 12th, 2018, 10:31 am
by PHPBB12345
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))
f(1) = 1
f(2) = 1
f(3) = 1
f(4) = 2
f(5) = 4
f(6) = 2
f(9) = 4

Re: Titanus is unsinkkkfcabIe!

Posted: February 12th, 2018, 4:12 pm
by 77topaz
PHPBB12345 wrote:f(1) = 1
f(2) = 1
f(3) = 1
f(4) = 2
f(5) = 4
f(6) = 2
f(9) = 4
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)).

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.

Re: (Function)

Posted: February 12th, 2018, 6:56 pm
by Gamedziner
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))
There are infinitely many functions possible.

Re: Random posts

Posted: February 12th, 2018, 7:17 pm
by Saka
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

Re: Random posts

Posted: February 12th, 2018, 9:29 pm
by AforAmpere

Re: Random posts

Posted: February 13th, 2018, 9:20 am
by KittyTac
QM37VoM.png
QM37VoM.png (2.01 KiB) Viewed 844 times
I couldn't resist.

We walk in circles

Posted: February 13th, 2018, 10:04 am
by Saka
Can't you stop what's happening?

Re: Random posts

Posted: February 13th, 2018, 10:17 am
by KittyTac
Stop what? It's just a pun.

Re: Random posts

Posted: February 14th, 2018, 8:00 am
by KittyTac
I have a new avatar!

Re: Random posts

Posted: February 14th, 2018, 8:12 am
by 72c20e
i've not been here for half a year. are p19s discovered yet?

Re: Random posts

Posted: February 14th, 2018, 8:16 am
by KittyTac
72c20e wrote:i've not been here for half a year. are p19s discovered yet?
Nope.

Re: Random posts

Posted: February 15th, 2018, 8:59 am
by Gamedziner
Copperhead minimum rule:

Code: Select all

x = 8, y = 12, rule = B3-ceky/S23-ci
 b2o2b2o$3b2o$3b2o$obo2bobo$o6bo2$o6bo$b2o2b2o$2b4o2$3b2o$3b2o!
(Yes, copperhead requires ALL s2 transitions.)

Re: Random posts

Posted: February 15th, 2018, 9:53 am
by KittyTac
Gamedziner wrote:Copperhead minimum rule:

Code: Select all

x = 8, y = 12, rule = B3-ceky/S23-ci
 b2o2b2o$3b2o$3b2o$obo2bobo$o6bo2$o6bo$b2o2b2o$2b4o2$3b2o$3b2o!
(Yes, copperhead requires ALL s2 transitions.)
Should you post that in Miscellaneous Discoveries?

Re: Random posts

Posted: February 15th, 2018, 9:54 am
by Saka
KittyTac wrote: Should you post that in Miscellaneous Discoveries?
The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.

Re: Re: Re:Re: Re: Re:Re: Re: Re: Random posts

Posted: February 15th, 2018, 6:17 pm
by Gamedziner
Saka wrote: The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.
Script?

Re: Re: Re:Re: Re: Re:Re: Re: Re: Random posts

Posted: February 16th, 2018, 7:40 pm
by Rhombic
Gamedziner wrote:
Saka wrote: The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.
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

Posted: February 17th, 2018, 8:40 am
by KittyTac
Rhombic wrote:
Gamedziner wrote:
Saka wrote: The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.
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?

Re: ndom posts

Posted: February 17th, 2018, 8:42 am
by Saka
KittyTac wrote:

Is thare one for a maximum rule?
Doesn't that also give a max rule?

Re: ndom posts

Posted: February 17th, 2018, 8:51 am
by KittyTac
Saka wrote:
KittyTac wrote:

Is thare one for a maximum rule?
Doesn't that also give a max rule?
Either way, I couldn't find the max rule.

Re: ndom posts

Posted: February 17th, 2018, 8:53 am
by Saka
KittyTac wrote: Either way, I couldn't find the max rule.
Post the output here

Re: ndom posts

Posted: February 17th, 2018, 9:03 am
by KittyTac
Saka wrote:
KittyTac wrote: Either way, I couldn't find the max rule.
Post the output here
It just automatically opens the minimum rule, no output file or anything.

Re: Random posts

Posted: February 17th, 2018, 10:23 am
by wildmyron
Gamedziner wrote:
Saka wrote: The minimal rule for any given pattern in any NT or totalistic rule can be easily found using the script.
Script?
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.

P.S. See my post two posts down for a copy/paste friendly output format

[b]Ecksdee[/b]

Posted: February 18th, 2018, 2:21 am
by Saka

Code: Select all

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