Prova 3: espalhe()

Prova 3: espalhe()

by José Coelho de Pina -
Number of replies: 4

Comentários?

Usa o fato que True tem valor 1 e False tem valor 0.
Isso já rolou no tópico Dúvida2 EP1.


def espalhe(tab, viz):

    # calcule instáveis
    instaveis = tab >= viz

    # remova grãos a serem espalhados
    tab[instaveis] -= viz[instaveis]    

    # espalhe: usa o fato do valor de True ser 1 e False ser 0
    tab[1:-1,  :-2] += instaveis[1:-1,1:-1] # espalhe para esquerda 
    tab[1:-1, 2:  ] += instaveis[1:-1,1:-1] # espalhe para direita
    tab[ :-2, 1:-1] += instaveis[1:-1,1:-1] # espalhe para cima
    tab[2:  , 1:-1] += instaveis[1:-1,1:-1] # espalhe para baixo
    
    # limpe bordas
    tab[0, :] = tab[-1,:] = tab[:,0] = tab[:,-1] = 0
In reply to José Coelho de Pina

Re: Prova 3: espalhe()

by José Coelho de Pina -

Comentários?


def espalhe(tab, viz):

    # 'núcleo' para os espalhamentos
    kernel = np.array([[0,1,0],
                       [1,0,1],
                       [0,1,0]])
    
    # calcule posições instáveis
    instaveis = tab >= viz 

    # remova grãos a serem espalhados
    tab[instaveis] -= viz[instaveis]

    # espalhe os grãos removidos
    nlins, ncols = tab.shape
    for i in range(1,nlins-1):
        for j in range(1,ncols-1):
            if instaveis[i,j]:
                tab[i-1:i+2,j-1:j+2] += kernel

    # limpe as bordas 
    tab[0,:] = tab[-1,:] = tab[:,0] = tab[:,-1] = 0

In reply to José Coelho de Pina

Re: Prova 3: espalhe()

by José Coelho de Pina -

Comentários?


def espalhe(tab, viz):

    # remova e espalhe os grãos
    nlins, ncols = tab.shape
    for i in range(1,nlins-1):
        for j in range(1,ncols-1):
            if tab[i,j] >= viz[i,j]:
                tab[i,j] -= viz[i,j]
                tab[i-1,j  ] += 1
                tab[i+1,j  ] += 1
                tab[i  ,j-1] += 1
                tab[i  ,j+1] += 1

    # limpe as bordas 
    tab[0,:] = tab[-1,:] = tab[:,0] = tab[:,-1] = 0
In reply to José Coelho de Pina

Re: Prova 3: espalhe()

by José Coelho de Pina -

Comentários?


def espalhe(tab, viz):
    
    # calcule instáveis
    instaveis = tab >= viz

    # remova grãos a serem espalhados
    tab[instaveis] -= viz[instaveis]

    # espalhe: usa o fato do valor de True ser 1 e False ser 0
    tab[1:-1,1:-1] += (  instaveis[1:-1,  :-2]   # espalha para direita
                       + instaveis[1:-1, 2:  ]   # espalha para esquerda
                       + instaveis[2:  , 1:-1]   # espalha para cima
                       + instaveis[ :-2, 1:-1] ) # espalha para baixo

    # limpe bordas: 
    tab[0, : ] = tab[-1, : ] = tab[ : ,0] = tab[ : ,-1] = 0
In reply to José Coelho de Pina

Re: Prova 3: espalhe()

by José Coelho de Pina -

Comentários?


def espalhe(tab, viz):
    
    # calcule instáveis: posições com 0 não são instáveis
    instaveis = (tab >= viz) & (tab > 0)
    
    # remova grãos a serem espalhados
    tab[instaveis] -= viz[instaveis]

    # espalhe: usa o fato do valor de True ser 1 e False ser 0
    tab[1:-1,1:-1] += (  instaveis[1:-1,  :-2]   # espalha para direita
                       + instaveis[1:-1, 2:  ]   # espalha para esquerda
                       + instaveis[2:  , 1:-1]   # espalha para cima
                       + instaveis[ :-2, 1:-1] ) # espalha para baixo