Advertisement
Guest User

thingy

a guest
Nov 29th, 2019
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.87 KB | None | 0 0
  1. from copy import deepcopy
  2.  
  3. def interlacing(r1, r2):
  4.   l1 = [v for v in r1 if v not in r2]
  5.   l2 = [v for v in r2 if v not in r1]
  6.   k = len(l1)
  7.   if k<=1:
  8.     return k
  9.   if all(l1[i]<l2[i] for i in range(k)):
  10.     if all(l1[i+1]>l2[i] for i in range(k-1)):
  11.       return k
  12.   if all(l2[i]<l1[i] for i in range(k)):
  13.     if all(l2[i+1]>l1[i] for i in range(k-1)):
  14.       return k
  15.   return -1
  16.  
  17. def possible_xM(left, xM = [0 for _ in range(10)], pos = 1):
  18.   if pos == 9:
  19.     xM[pos] = left
  20.     s = sum(xM)
  21.     q = sum(x*x for x in xM) - s*s/9
  22.     if q == 2:
  23.       yield xM[:]
  24.   elif pos < 9:
  25.     for i in range(min(left,9)+1):
  26.       xM[pos] = i
  27.       yield from possible_xM(left-i, xM, pos+1)
  28.    
  29. def gen_helper(M, xM, past_inter3 = False, row = 1):
  30.   Mr0 = M[row-1][0]
  31.   Mr1 = M[row-1][1]
  32.   for a in range(1,10):
  33.     if xM[a] == 0:
  34.       continue
  35.     for b in range(max(a,Mr0)+1,10):
  36.       if xM[b] == 0:
  37.         continue
  38.       for c in range(max(b,Mr1)+1,10):
  39.         if xM[c] == 0:
  40.           continue
  41.        
  42.         this_row = [a,b,c]
  43.        
  44.         inter3 = past_inter3
  45.         i = 0
  46.         for r in range(1,row):
  47.           i = interlacing(M[r], this_row)
  48.           if i == -1:
  49.             break
  50.           if i == 3:
  51.             inter3 = True
  52.         if i == -1:
  53.           continue
  54.          
  55.         xM[a] -= 1
  56.         xM[b] -= 1
  57.         xM[c] -= 1
  58.         M[row] = this_row
  59.        
  60.         if row == len(M)-1:
  61.           if inter3:
  62.             yield deepcopy(M[1:])
  63.         elif row < len(M)-1:
  64.           yield from gen_helper(M, xM, inter3,row+1)
  65.          
  66.         xM[a] += 1
  67.         xM[b] += 1
  68.         xM[c] += 1
  69.        
  70.          
  71. def generate(m):
  72.   validM = []
  73.   M = [[0,0,0] for _ in range(m+1)]
  74.   for xM in possible_xM(3*m):
  75.     for R in gen_helper(M, xM):
  76.       validM.append(R)
  77.   return validM
  78.  
  79.  
  80. all_valid_matrices = generate(5)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement