Se pensar primeiro é fundamental em programação, também sabemos que conhecer bem a linguagem em que vamos expressar a solução é igualmente importante. Numa das fichas recente de exercícios vinha a seguinte questão:
Os cartões para jogar BINGO têm 5 colunas, cada uma com 5 números. As colunas têm associado as letras B, para a primeira coluna, I para a segunda, N para a terceira, G para a quarta e O para a quinta. Nas primeira colunas os números podem ser entre 1 e 15, na segunda entre 16 e 30, na terceira entre 31 e 45, na quarta entre 46 e 60 e na quinta entre 61 e 75. Escreva um programa que permita gerar e guardar de modo apropriado um cartão de bingo. Escreva um segundo programa que permita visualizar um cartão de bingo.
Vejamos a solução para a primeira questão:
01.
import
random
02.
03.
def
bingo():
04.
nome
=
'BINGO'
05.
cartao
=
dict()
06.
for
i,letra
in
enumerate(nome):
07.
lista
=
list(range(i
*
15
+
1
, i
*
15
+
16
))
08.
numeros
=
random.sample(lista,
5
)
09.
numeros.sort()
10.
cartao[letra]
=
numeros
11.
return
cartao
O que tem de especial a solução? Desde logo usamos um
dicionário para guardar a representação de um cartão. A chave é uma das letras de ‘BINGO’ e o valor são os 5 números. Usamos o método
sample do módulo
random para gerar os 5 números. Este método garante que os números serão todos diferentes. Finalmente usamos o método
enumerate para poder ter uma forma simples de gerar os diferentes intervalos dos números.
A segunda questão era a da visualização do cartão. Aqui vai a solução:
1.
def
mostra_bingo(cartao):
2.
numeros_colunas
=
list(cartao.values())
3.
numeros_linhas
=
list(zip(
*
numeros_colunas))
4.
print
(
'%2s\t%2s\t%2s\t%2s\t%2s\t'
%
tuple(
'BINGO'
))
5.
print
(
'_'
*
35
)
6.
for
linha
in
numeros_linhas:
7.
print
(
'%2s\t%s\t%s\t%s\t%s\t'
%
linha)
Qual era a dificuldade deste problema? O facto de termos de passar de listas de números associados a letras para uma visualização por colunas. Esta é uma situação onde a operação
zip mostra todo o seu esplendor. O facto de fazermos:
1.
numeros_linhas
=
list(zip(
*
numeros_colunas))
tem a seguinte explicação. Primeiro,
zip é um iterador pelo que para obtermos todos os seus elementos de uma vez temos que usar list sobre o resultado de
zip. Depois, o
asterisco (*) resulta de
zip se aplicar a uma sequência de argumentos e
numeros_colunas ter apenas um.
numeros_colunas é uma lista em que cada elemento é uma lista de 5 listas cada uma com 5 números. Com o
asterisco passamos a ter as 5 listas como argumentos do zip.
1.
B I N G O
2.
__________________
3.
2
17
33
49
61
4.
5
18
34
50
62
5.
8
26
35
56
66
6.
11
27
37
57
72
7.
13
28
40
60
74