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:
import random
def bingo():
nome = 'BINGO'
cartao = dict()
for i,letra in enumerate(nome):
lista = list(range(i*15 +1, i*15 + 16))
numeros = random.sample(lista,5)
numeros.sort()
cartao[letra] = numeros
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:
def mostra_bingo(cartao):
numeros_colunas = list(cartao.values())
numeros_linhas = list(zip(*numeros_colunas))
print('%2s\t%2s\t%2s\t%2s\t%2s\t'% tuple('BINGO'))
print('_' * 35)
for linha in numeros_linhas:
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:
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.
B I N G O
_______________
2 17 33 49 61
5 18 34 50 62
8 26 35 56 66
11 27 37 57 72
13 28 40 60 74
Fonte: https://programacaocompython.blogspot.com/2017/12/bingo.html