quinta-feira, 14 de dezembro de 2017

BINGO!

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

Sem comentários:

Enviar um comentário