Question 2


In [5]:
import numpy as np
from ipythonblocks import BlockGrid as bg
from IPython.html.widgets import interact, interactive, fixed
from IPython.html import widgets
from IPython.display import display
import timeit

In [60]:
#Creating interacts that allow the user to choose the percent of each color, 
#size of the grid, the individual box size, satisfaction percentage.
def interacts(size1):
    return size1
def interacts1(satisfaction_1):
    return satisfaction_1
def interacts2(orange_1):
    return orange_1
def interacts3(blue_1, ):
    return blue_1
def interacts4(block_size1):
    return block_size1
def interacts5(magenta_1):
    return magenta_1

j = interactive(interacts, size1 = (1,100))
p = interactive(interacts1, satisfaction_1 = (0,1,0.01))
o = interactive(interacts2, orange_1 = (0,1,0.01))
b = interactive(interacts3, blue_1 = (0,1,0.01))
bs = interactive(interacts4, block_size1 = (0,30,0.1))
m = interactive(interacts5, magenta_1 = (0,1,0.01))


display(bs)
display(j)
display(m)
display(b)
display(o)
display(p)

In [56]:
#Creates an nxn numpy grid with a chosen percent of 1's and 2's which correspond to orange and blue blocks.
k = j.result
size_of_block = bs.result
satisfaction_percentage = p.result
blue = b.result
orange = o.result
magenta = m.result
black = 1 - blue - orange - magenta
y = k - 1
grid = np.random.choice([0,1,2,3],size=(k,k),p = [black,orange,blue,magenta])
print (grid)
grid2 = np.hstack(grid)
print (grid2)
grid1 = bg(k,k, block_size=size_of_block)
grid3 = bg(k,k, block_size=size_of_block)
grid4 = bg(k,k, block_size=size_of_block)


[[1 3 3 ..., 2 1 0]
 [0 3 3 ..., 2 3 3]
 [0 2 2 ..., 0 3 3]
 ..., 
 [0 2 3 ..., 1 3 1]
 [2 3 1 ..., 3 0 2]
 [0 1 2 ..., 0 3 3]]
[1 3 3 ..., 0 3 3]

In [57]:
#Creates an nxn IPythonBlocks grid. 
def make_grid():
    x = 0
    orange2 = 0
    blue2 = 0
    magenta2 = 0
    black2 = 0
    for i in grid4:     
        if grid2[x]==1:
            orange2 += 1
            i.set_colors(300, 178, 34)
        elif grid2[x]==2:
            blue2 += 1
            i.set_colors(90, 300, 420)
        elif grid2[x]==3:
            magenta2+=1
            i.set_colors(600, 42, 200)
        else:
            black2+=1
        x += 1
    return orange2,blue2,black2,magenta2
orange3, blue3, black3, magenta3 = make_grid()
display(grid4)
print ('Orange', orange3) 
print ('Blue', blue3)
print ('Black', black3)
print ('Magenta', magenta3)
%timeit -n1 -r1 make_grid()


Orange 1810
Blue 2473
Black 1875
Magenta 3251
1 loops, best of 1: 259 ms per loop

In [52]:
#Finds the neighbors of the grid and checks to see if the neighbors
#have the same value and then calculates the satisfaction of that block.
def satisfaction_percent():
    same_c1 = 0
    same_c2 = 0
    same_c3 = 0
    same_c4 = 0
    same_col_1 = 0
    same_col_2 = 0
    same_row_1 = 0
    same_row_2 = 0
    satisfaction_c1 = 0
    satisfaction_c2 = 0
    satisfaction_c3 = 0
    satisfaction_c4 = 0
    satisfaction_col_1 = 0
    satisfaction_col_2 = 0
    satisfaction_row_1 = 0
    satisfaction_row_2 = 0    
    sat_col_1=[] 
    sat_col_2=[] 
    sat_row_1=[] 
    sat_row_2=[] 
    sat_1=[] 
    same = 0
    row = 0
    col = 0
    i_5 = 0
    i_6 = 0
    i_7 = 0
    i_8 = 0
    i_9 = 0
    for n in grid:
        if row==0 and col==0:
            if grid[0,0]==0:
                same_c1+=3
            else:
                if grid[0,0]==grid[1,0]:
                    same_c1+=1
                if grid[0,0]==grid[0,1]:
                    same_c1+=1
                if grid[0,0]==grid[1,1]:
                    same_c1+=1
            satisfaction_c1 = same_c1/3
            print ('satisfaction_c1', satisfaction_c1)
        if row==0 and col==y:
            if grid[0,y]==0:
                same_c2+=3
            else:
                if grid[0,y]==grid[0,y-1]:
                    same_c2+=1
                if grid[0,y]==grid[1,y-1]:
                    same_c2+=1
                if grid[0,y]==grid[1,y]:
                    same_c2+=1
            satisfaction_c2 = same_c2/3
            print ('satisfaction_c2',satisfaction_c2)
        if row==y and col==0:
            if grid[y,0]==0:
                same_c3+=3
            else:
                if grid[y,0]==grid[y-1,0]:
                    same_c3+=1
                if grid[y,0]==grid[y-1,1]:
                    same_c3+=1
                if grid[y,0]==grid[y,1]:
                    same_c3+=1
            satisfaction_c3 = same_c3/3
            print ('satisfaction_c3',satisfaction_c3)
        if row==y and col==y:
            if grid[y,y]==0:
                same_c4+=3
            else:
                if grid[y,y]==grid[y-1,y]:
                    same_c4+=1
                if grid[y,y]==grid[y,y-1]:
                    same_c4+=1
                if grid[y,y]==grid[y-1,y-1]:
                    same_c4+=1
            satisfaction_c4 = same_c4/3
            print ('satisfaction_c4', satisfaction_c4)
        if row==0 and col!=(0 or y):
            i_5+=1
            if grid[row,col]==0:
                same_col_1+=5
            else:
                if grid[row,col]==grid[row,col-1]:
                    same_col_1+=1
                if grid[row,col]==grid[row,col+1]:
                    same_col_1+=1
                if grid[row,col]==grid[row+1,col-1]:
                    same_col_1+=1
                if grid[row,col]==grid[row+1,col]:
                    same_col_1+=1
                if grid[row,col]==grid[row+1,col+1]:
                    same_col_1+=1
            satisfaction_col_1 = same_col_1/5
            sat_col_1.append(satisfaction_col_1)
            true_satisfaction_col_1 = np.hstack(sat_col_1) 
            if i_5>y-1:
                sats_col_1 = true_satisfaction_col_1
                print ('sats_col_1',sats_col_1)

        elif row==y and col!=(0 or y):
            i_6+=1
            if grid[row,col]==0:
                same_col_2+=5
            else:
                if grid[row,col]==grid[row,col-1]:
                    same_col_2+=1
                if grid[row,col]==grid[row,col+1]:
                    same_col_2+=1
                if grid[row,col]==grid[row-1,col-1]:
                    same_col_2+=1
                if grid[row,col]==grid[row-1,col]:
                    same_col_2+=1
                if grid[row,col]==grid[row-1,col+1]:
                    same_col_2+=1
            satisfaction_col_2 = same_col_2/5
            sat_col_2.append(satisfaction_col_2)
            true_satisfaction_col_2 = np.hstack(sat_col_2) 
            if i_6>y-1:
                sats_col_2 = true_satisfaction_col_2
                print ('sats_col_2',sats_col_2)
        elif row!=(0 or y) and col==0:
            i_7+=1
            if grid[row,col]==0:
                same_row_1+=5
            else:
                if grid[row,col]==grid[row-1,col]:
                    same_row_1+=1
                if grid[row,col]==grid[row+1,col]:
                    same_row_1+=1
                if grid[row,col]==grid[row-1,col+1]:
                    same_row_1+=1
                if grid[row,col]==grid[row,col+1]:
                    same_row_1+=1
                if grid[row,col]==grid[row+1,col+1]:
                    same_row_1+=1
            satisfaction_row_1 = same_row_1/5
            sat_row_1.append(satisfaction_row_1)
            true_satisfaction_row_1 = np.hstack(sat_row_1) 
            if i_7>y-1:
                sats_row_1 = true_satisfaction_row_1
                print ('sats_row_1',sats_row_1)
        elif row!=(0 or y) and col==y:
            i_8+=1
            if grid[row,col]==0:
                same_row_2+=5
            else:
                if grid[row,col]==grid[row-1,col]:
                    same_row_2+=1
                if grid[row,col]==grid[row+1,col]:
                    same_row_2+=1
                if grid[row,col]==grid[row-1,col-1]:
                    same_row_2+=1
                if grid[row,col]==grid[row,col-1]:
                    same_row_2+=1
                if grid[row,col]==grid[row+1,col-1]:
                    same_row_2+=1
            satisfaction_row_2 = same_row_2/5
            sat_row_2.append(satisfaction_row_2)
            true_satisfaction_row_2 = np.hstack(sat_row_2) 
            if i_8>y-1:
                sats_row_2 = true_satisfaction_row_2
                print ('sats_row_2',sats_row_2)
        else:
            i_9+=1
            if grid[row,col]==0:
                same+=8
            else:
                if grid[row,col]==grid[row-1,col]:
                    same+=1
                if grid[row,col]==grid[row,col-1]:
                    same+=1
                if grid[row,col]==grid[row-1,col-1]:
                    same+=1
                if grid[row,col]==grid[row+1,col]:
                    same+=1
                if grid[row,col]==grid[row,col+1]:
                    same+=1
                if grid[row,col]==grid[row+1,col+1]:
                    same+=1
                if grid[row,col]==grid[row-1,col+1]:
                    same+=1
                if grid[row,col]==grid[row+1,col-1]:
                    same+=1
            satisfaction = same/8
            sat_1.append(satisfaction)
            true_satisfaction_1 = np.hstack(sat_1) 
            if i_9>y-2:
                sats_1 = true_satisfaction_1
                print ('sats_1',sats_1)
        col+=1
        if col>=10:
            col = col - 10
            row+=1
    
    sat_c_1_1 = []
    sat_c_2_1 = []
    sat_c_3_1 = []
    sat_c_4_1 = []
    sat_col_1_1 = []
    sat_col_2_1 = []
    sat_row_1_1 = []
    sat_row_2_1 = []
    sat_1_1 = []
    m_1=0
    m_2=0
    m_3=0
    m_4=0
    m_5=0
    m_6=0
    m_7=0
    m_8=0
    m_9=0
    
    for n in sat_col_1:
        if m_5==0:
            new_value_5 = sat_col_1[0]
            sat_col_1_1.append(new_value_5)
            s_col_1 = np.hstack(sat_col_1_1)
            m_5+=1
        else:
            new_value_5 = sat_col_1[m_5] - sat_col_1[m_5-1]
            sat_col_1_1.append(new_value_5)
            m_5+=1     
    
    for n in sat_col_2:
        if m_6==0:
            new_value_6 = sat_col_2[0]
            sat_col_2_1.append(new_value_6)
            s_col_2 = np.hstack(sat_col_2_1)
            m_6+=1 


        else:
            new_value_6 = sat_col_2[m_6] - sat_col_2[m_6-1]
            sat_col_2_1.append(new_value_6)
            m_6+=1 
        
    for n in sat_row_1:
        if m_7==0:
            new_value_7 = sat_row_1[0]
            sat_row_1_1.append(new_value_7)
            sat_row_1 = np.hstack(sat_row_1_1)
            m_7+=1
        else:
            new_value_7 = sat_row_1[m_7] - sat_row_1[m_7-1]
            sat_row_1_1.append(new_value_7)
            m_7+=1 
    for n in sat_row_2:
        if m_8==0:
            new_value_8 = sat_row_2[0]
            sat_row_2_1.append(new_value_8)
            s_row_2 = np.hstack(sat_row_2_1)
            m_8+=1
        else:
            new_value_8 = sat_row_2[m_8] - sat_row_2[m_8-1]
            sat_row_2_1.append(new_value_8)
            m_8+=1 
        
    for n in sat_1:
        if m_9==0:
            new_value_9 = sat_1[0]
            sat_1_1.append(new_value_9)
            sat_1 = np.hstack(sat_1_1)
            m_9+=1
        else:
            new_value_9 = sat_1[m_9] - sat_1[m_9-1]
            sat_1_1.append(new_value_9)
            m_9+=1 
        
        
    s_col_1 = np.hstack(sat_col_1_1)
    print ("satisfaction of 1st row", s_col_1)

In [53]:
satisfaction_percent()


satisfaction_c1 0.0
satisfaction of 1st row [ 0.2  0.2  1.   0.2  1.   0.2  0.   0.2  1.   1. ]

In [58]:
#If the block's satisfaction is below the satisfaction percentage chosen by the user
#then the blocks moves to another position in the nxn grid.
def move_unsatisfied():
    row = 0
    col = 0
    ii = 0
    for n in grid:
        if sat_c_1_1 < satisfaction_percentage:
            n.set_color(0,0,0)
            if grid[0,0]==1:
                if grid[row,col]==0:   
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
            if grid[0,0]==2:
                if grid[row,col]==0:   
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
            if grid[0,0]==3:
                if grid[row,col]==0:   
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
        if sat_c_2_1 < satisfaction_percentage:
            n.set_color(0,0,0)
            if grid[0,y]==1:
                if grid[row,col]==0:   
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
            if grid[0,y]==2:
                if grid[row,col]==0:   
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
            if grid[0,y]==3: 
                if grid[row,col]==0:   
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
        if sat_c_3_1 < satisfaction_percentage: 
            n.set_color(0,0,0)
            if grid[y,0]==1:
                if grid[row,col]==0:   
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
            if grid[y,0]==2:
                if grid[row,col]==0:   
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
            if grid[y,0]==3: 
                if grid[row,col]==0:   
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
        if sat_c_4_1 < satisfaction_percentage:
            n.set_color(0,0,0)
            if grid[y,y]==1:
                if grid[row,col]==0:   
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
            if grid[y,y]==2:
                if grid[row,col]==0:   
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
            if grid[y,y]==3: 
                if grid[row,col]==0:   
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                    if col>=10:
                        col = col - 10
                        row+=1
        if sat_col_1_1[ii] < satisfaction_percentage:
            n.set_color(0,0,0)
            if grid[row,col]==1:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==2:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==3:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
        if sat_col_2_1[ii] < satisfaction_percentage:
            n.set_color(0,0,0)
            if grid[row,col]==1:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==2:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==3:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
        if sat_row_1_1[ii] < satisfaction_percentage:
            n.set_color(0,0,0)
            if grid[row,col]==1:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==2:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==3:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
        if sat_row_2_1[ii] < satisfaction_percentage:
            n.set_color(0,0,0)
            if grid[row,col]==1:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==2:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==3:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
        if sat_1_1[ii] < satisfaction_percentage:
            n.set_color(0,0,0)
            if grid[row,col]==1:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(90, 300, 420)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==2:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(300, 178, 34)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
            if grid[row,col]==3:
                if grid[row+ii,col+ii]==0:
                    n.set_colors(600, 42, 200)
                else:
                    col+=1
                if col>=10:
                    col = col - 10
                    row+=1
        ii+=1
        col+=1
        if col>=10:
            col = col - 10
            row+=1
    return grid

In [59]:
#Displays the final grid after all the blocks are at their max satisfaction.
def final_grid():
    x = 0
    orange4 = 0
    blue4 = 0
    black4 = 0
    magenta4 = 0
    for i in grid3:
        if orange3 > orange4:
            i.set_colors(300, 178, 34)
            orange4+=1
        elif black3 > black4: 
            i.set_colors(0,0,0)
            black4+=1
        elif magenta3 > magenta4:
            i.set_colors(600, 42, 200)
            magenta4+=1
        else:
            i.set_colors(90, 300, 420)
    print ('Orange', orange3)
    print ('Blue', blue3)
    print ('Black', black3)
    display(grid3)
%timeit -n1 -r1 final_grid()


Orange 1810
Blue 2473
Black 1875
1 loops, best of 1: 240 ms per loop

In [ ]: