Funções Xadrez

Autor:cronuxs
Data:06/03/2009
1 # Colocar impar na coluna
2 lin = 200
3 col = 800
  • Criando o tabuleiro com uma linha de codigo (Maneira iterativa)

A idéia deste método é realizar dois fors um dentro do outro, no momento da criação da matriz xadrez contendo o modulo da soma dos dois índices.

1 def xadrezIterativo(lin, col):
2     I = [[ (i+j)%2 for i in range(0,col) ] for j in range(0,lin) ]
3     return array(I)
4 
5 t1 = time.time()                                #Pega o tempo Inicial
6 I = xadrezIterativo(lin,col)
7 t2 = time.time()                                #Pega o tempo Final
8 T = t2-t1
9 mmshow(I, title= "Tempo = " + str(T) + "s");
Warning: downcasting image from int32 to uint16 (may lose precision)

Tempo = 0.0505499839783s

  • Criando o tabuleiro de maneira matricial (slices)

Este método consiste de criar uma matriz de zeros, e logo em seguida preencher as linhas pares (a partir da segunda casa pulando um), e depois as linhas impares (a partir da primeira casa pulando um)

 1 def xadrezSlice(lin, col):
 2     I = numpy.zeros([lin,col])
 3     I[0:lin:2,1:col:2] = 1
 4     I[1:lin:2,0:col:2] = 1
 5     #Cria o tabuleiro
 6     return array(I)
 7 
 8 t1 = time.time()                                #Pega o tempo Inicial
 9 I = xadrezSlice(lin,col)
10 t2 = time.time()                                #Pega o tempo Final
11 T = t2-t1
12 mmshow(I, title= "Tempo = " + str(T) + "s");
Warning: downcasting image from double to uint16 (may lose precision)

Tempo = 0.0022988319397s

  • Criando o tabuleiro usando copias de vetores

A idéia deste método é criar um modelo para a primeira e para segunda linha, e logo em seguida montar as linhas seguintes copiando este modelo.

 1 def xadrezTile(lin, col):
 2     t1 = time.time()                                #Pega o tempo inicial
 3 
 4     i = 0
 5     aux1 = [];
 6     aux2 = [];
 7     for i in range(0,col):
 8         aux1.append(i%2)
 9         aux2.append((i+1)%2)
10 
11     i = 0
12     I = []
13     for j in range(0,lin):
14         if (i):
15             i = 0
16             I.append(aux2)
17         else:
18             i = 1
19             I.append(aux1)
20 
21     #Cria o tabuleiro
22     t2 = time.time()                                #Pega o tempo final
23     return array(I)
24 
25 t1 = time.time()                                #Pega o tempo Inicial
26 I = xadrezTile(lin,col)
27 t2 = time.time()                                #Pega o tempo Final
28 T = t2-t1
29 mmshow(I, title= "Tempo = " + str(T) + "s");
Warning: downcasting image from int32 to uint16 (may lose precision)

Tempo = 0.022656917572s

  • Criando um tabuleiro usando reshape

este método consiste em criar uma matriz com numeros sequenciais, mudar a estrutura da mesma, de forma a ter um numero diferente de colunas e linhas e logo em seguida calcular um mod 2 da matriz.

PS: caso a matriz tenha numero de colunas par, é necessário somar um em cada linha par para continuar com o efeito de tabuleiro de xadrez.

 1 def xadrezReshape(lin,col):
 2     t1 = time.time()                                #Pega o tempo inicial
 3     I = arange(lin*col).reshape(lin,col)
 4     if col % 2 == 0:
 5         I = transpose(transpose(I) + [i%2 for i in range(lin)])
 6 
 7     I = mod(I,2)
 8     t2 = time.time()                                #Pega o tempo final
 9     return I
10 
11 t1 = time.time()                                #Pega o tempo Inicial
12 I = xadrezReshape(lin,col)
13 t2 = time.time()                                #Pega o tempo Final
14 T = t2-t1
15 mmshow(I, title= "Tempo = " + str(T) + "s");
Warning: downcasting image from int32 to uint16 (may lose precision)

Tempo = 0.00534510612488s

Comparando os métodos

 1 def getTimeAndShow(I,texto):
 2 
 3     t1 = time.time()                                #Pega o tempo Inicial
 4     I = xadrezTile(lin,col)
 5     t2 = time.time()                                #Pega o tempo Final
 6     T = t2-t1
 7     mmshow(I, title= texto+" = " + str(T) + "s");
 8 
 9 getTimeAndShow(xadrezIterativo(lin,col),"Método Iterativo");
10 getTimeAndShow(xadrezSlice(lin,col),"Slice");
11 getTimeAndShow(xadrezTile(lin,col),"Tile");
12 
13 if (col%2==0):
14     getTimeAndShow(xadrezReshape(lin,col),"Reshape (caso coluna par)");
15 else:
16     getTimeAndShow(xadrezReshape(lin,col),"Reshape (caso coluna impar)");
17 if (col%2==1):
18     getTimeAndShow(xadrezReshape(lin,col+1),"Reshape (caso coluna par)");
19 else:
20     getTimeAndShow(xadrezReshape(lin,col+1),"Reshape (caso coluna impar)");
Warning: downcasting image from int32 to uint16 (may lose precision)
Warning: downcasting image from int32 to uint16 (may lose precision)
Warning: downcasting image from int32 to uint16 (may lose precision)
Warning: downcasting image from int32 to uint16 (may lose precision)
Warning: downcasting image from int32 to uint16 (may lose precision)

Método Iterativo = 0.0232589244843s

Slice = 0.0230538845062s

Tile = 0.0230429172516s

Reshape (caso coluna par) = 0.0230660438538s

Reshape (caso coluna impar) = 0.023106098175s

É possível notar que o método que preenche individualmente os itens usando iteradores do python dentro do numpy é a maneira mais eficiente entre as testadas neste exercício, isto se deve pelo fato de tanto o numpy (para cálculos em matrizes) e o python (para uso ágil de iteradores) foram bem otimizados para este fim.