|  Topic awaiting preservation: Unique Shuffle, Chaos-n-Chains  | |
|---|---|
| Author | Thread | 
| Maniac (V) Mad Scientist From:  |  posted 12-10-2018 16:02 When I started looking into latin squares and sudoku, I came across an interesting code: 0 1 2 3 1 2 3 0 
 code: 0 1 2 3 0 2 3 1 
 code: 0 1 2 3 1 2 3 0 01 12 23 30 len(chain)=[4] 
 code: a b c d e f g h 0 1 3 3 0 1 d a c b e f g h 
 code: 0 1 2 3 1 0 3 2 len(chain)=[2,2] 
 code: len(master_chain)=6 [2,2,2] [2,4] [6] 
 code: n=6 coins=[2,3,4,6] [2, 2, 2] [2, 4] [6] 
 code: n=6 ([2, 2, 2], 15) ([2, 4], 30) ([3, 3], 40) ([4, 2], 60) ([6], 120) g00dcount=265 badcount=455 720 
 code: #!/usr/bin/env python
from math import factorial as fact
def nchoser_min1(n,r):
   # permutation without repetition
   # with a reduction in possibilities
    n=n-1
    r=r-1
    return fact(n)/fact(n-r)
 code: #!/usr/bin/env python
from math import factorial as fact
def nchoser_min1(n,r):
   # permutation without repetition
   # with reduction in possibilities
    n=n-1
    r=r-1
    return fact(n)/fact(n-r)
print('n=6')
print('')
#[2, 2, 2] 15
a=nchoser_min1(6,2)
b=nchoser_min1(4,2)
c=nchoser_min1(2,2)
print('[2, 2, 2] {}*{}*{}={}'.format(a,b,c,a*b*c))
gc0=a*b*c
#[2, 4], 30
a=nchoser_min1(6,2)
b=nchoser_min1(4,4)
print('[2,4] {}*{}={}'.format(a,b,a*b))
gc1=a*b
#[3, 3] 40
a=nchoser_min1(6,3)
b=nchoser_min1(3,3)
print('[3,3] {}*{}={}'.format(a,b,a*b))
gc2=a*b
#[4, 2], 60
a=nchoser_min1(6,4)
b=nchoser_min1(2,2)
print('[4,2] {}*{}={}'.format(a,b,a*b))
gc3=a*b
#[6], 120
a=nchoser_min1(6,6)
print('[6] {}'.format(a))
gc4=a
print('')
print('g00dcount={}'.format(gc0+gc1+gc2+gc3+gc4))
 code: brute force n chose r n=6 n=6 ([2, 2, 2], 15) [2, 2, 2] 5*3*1=15 ([2, 4], 30) [2,4] 5*6=30 ([3, 3], 40) [3,3] 20*2=40 ([4, 2], 60) [4,2] 60*1=60 ([6], 120) [6] 120 g00dcount=265 g00dcount=265 
 code: n=6 0 1 2 3 4 5 based on probability, the chain picked is: [2,4] expand into mini-chains: 0 0 1 1 1 1 shuffle all willy-nilly: 1 0 1 1 1 0 take each mini-chain in turn and daisy chain shuffle put it all back together . 0 . . . 0 1 . 1 1 1 . 1 0 1 1 1 0 . 1 . . . 5 0 . 2 3 4 . 0 1 2 3 4 5 . 5 . . . 1 2 . 4 0 3 . 2 5 4 0 3 1 [2]=15 51 [4]=02 24 43 30 
 | 
| Maniac (V) Mad Scientist From:  |  posted 12-10-2018 22:21 Let's take a closer look at this and why I am using -1 for both variables: code: def nchoser_min1(n,r):
    n=n-1
    r=r-1
    return fact(n)/fact(n-r)
 code: n=6 0=[0, 1, 2, 3, 4, 5] 1=[0, 1, 2, 3, 4, 5] 2=[0, 1, 2, 3, 4, 5] 3=[0, 1, 2, 3, 4, 5] 4=[0, 1, 2, 3, 4, 5] 5=[0, 1, 2, 3, 4, 5] 
 code: n=6 0=[1, 2, 3, 4, 5] 1=[0, 2, 3, 4, 5] 2=[0, 1, 3, 4, 5] 3=[0, 1, 2, 4, 5] 4=[0, 1, 2, 3, 5] 5=[0, 1, 2, 3, 4] 
 code: n=6 c=[3,3] 0=[1, 2, 3, 4, 5] 1=[0, 2, 3, 4, 5] 2=[0, 1, 3, 4, 5] 3=[0, 1, 2, 4, 5] 4=[0, 1, 2, 3, 5] 5=[0, 1, 2, 3, 4] pick 02 prune 0=2 1=[3, 4, 5] 2=[1, 3, 4, 5] 3=[1, 4, 5] 4=[1, 3, 5] 5=[1, 3, 4] mini-chain=[02] 
 code: pick 21 prune 0=2 1=[3, 4, 5] 2=1 3=[4, 5] 4=[3, 5] 5=[3, 4] mini-chain=[02, 21] 
 code: end of chain has to be 10 0=2 1=0 2=1 3=[4, 5] 4=[3, 5] 5=[3, 4] mini-chain=[02, 21, 10] 
 code: 0 1 2 3 4 5 2 0 1 4 5 3 
 code: n=6 c=[3,3] 0: starting point, 5 possibilities, can't be self, prune and set aside 2: 3 possibilities, can't be self, previous, or starting point, pick-n-prune 1: only one possibility, link-back to start 
 code: ([2, 4], 30) ([4, 2], 60) 
 code: [2, 4] = 0 0 1 1 1 1 [4, 2] = 0 0 0 0 1 1 :shuffle: [2, 4] = 1 1 0 0 1 1 [4, 2] = 0 0 1 1 0 0 
 | 
| Maniac (V) Mad Scientist From:  |  posted 12-11-2018 01:50 This all started because I wanted to do a unique shuffle by code: 0 1 2 3 4 1 2 3 4 0 01 12 23 34 40 
 code: 0 1 2 3 4 1 0 3 4 2 
 code: 0 1 2 3 4 5 1 2 3 4 0 . 
 code: 0 1 1 2 2 3 3 4 4 [5, 0] 5 [0] 
 code: 0 1 0 1 0 1 1 2 1 2 1 2 2 3 2 3 2 3 3 4 3 4 3 4 4 [5, 0] 4 [5] 4 5 5 [0] 5 0 5 0 0 1 2 3 4 5 1 2 3 4 5 0 
 code: n=7 [2, 2, 3], 48 3% [2, 3, 2], 72 4% [3, 2, 2], 90 5% [2, 5], 144 8% [5, 2], 360 16% [3, 4], 180 10% [4, 3], 240 13% [7], 720 38% g00dcount=1854 
 code: n=7 i=1000 [2, 2, 3], 29, 3% [2, 3, 2], 31, 3% [3, 2, 2], 43, 4% [2, 5], 65, 7% [5, 2], 191, 19% [3, 4], 97, 10% [4, 3], 151, 15% [7], 393, 39% len=8 
 code: #!/usr/bin/env python
import random
import copy
def find_chains(aseq,bseq):
    keepme=0
    findme=[]
    rlist=[]
    while aseq:
        if findme==[]:
            pcount=1
            keepme=aseq.pop(0)
            findme=bseq.pop(0)
        else:
            t=aseq.index(findme)
            aseq.pop(t)
            findme=bseq.pop(t)
            pcount+=1
        if keepme==findme:
            findme=[]
            rlist.append(pcount)
    return rlist
def unique_shuffle(mpool):
    fpool=[]
    # build the pools
    for i in range(len(mpool)):
        t=copy.deepcopy(mpool)
        t.remove(mpool[i])
        fpool.append(t)
    for i in range(len(mpool)):
        # find minimum length
        minl=len(mpool)+1
        for p in fpool:
            if isinstance(p,list):
                t=len(p)
                if t<minl: minl=t
        # build list of minimums
        ml=[]
        for p in range(len(fpool)):
            if isinstance(fpool[p],list):
                if len(fpool[p])==minl:
                    ml.append(p)
        # pick a pool
        a=random.choice(ml)
        # pick random from pool
        b=random.choice(fpool[a])
        fpool[a]=b
        # prune
        for i in range(len(fpool)):
            if isinstance(fpool[i],list):
                if b in fpool[i]:
                    fpool[i].remove(b)
    return fpool
tl=list(range(7))
mlist=[]
olist=[]
for i in range(1000):
    x=unique_shuffle(tl)
    y=find_chains(copy.deepcopy(tl),copy.deepcopy(x))
    if y not in mlist:
        mlist.append(y)
        olist.append(1)
    else: # it is already in mlist[]
        j=mlist.index(y)
        k=olist[j]
        olist[j]=k+1
ts=sum(olist)
for i in range(len(mlist)):
    print(mlist[i],olist[i],float(olist[i])/float(ts) )
print('\nlen={}'.format(len(olist)))
 | 
| Maniac (V) Mad Scientist From:  |  posted 12-26-2018 23:00 Been meaning to get back to this, but I keep getting side-tracked. Been hanging with | 
| Maniac (V) Inmate From: The Pool Of Life |  posted 01-04-2019 03:04 |