segunda-feira, 10 de junho de 2024

Contando faces de calendários cubos usando Python

Comprei um calendário baseado em 2 cubos para os números e paralelepípedos para os meses, conforme a foto ao lado. Bem prático, bonitinho, bem feito. Comprei este em Parnaíba-PI a um preço muito mais vantajoso do que aqueles vendidos na Tok&Stok (outro lugar em que encontramos esse tipo de calendário. Do nada tive a curiosidade de descobrir qual seria a face que mais seria utilizada em um ano não bissexto e que claro o usuário tivesse o cuidado cotidiano de sempre mudar as faces. 

Pensei que fazendo em Python seria relativamente simples. Mas apanhei muito para uma tarefa bem simples, acho que por isso não tenho muito futuro como programador. Decidido o projeto, escolhi fazer no Google Colab e usar estruturas dicionário do Python para contar as ocorrências. Ou seja decisões ruins sucessivas. Abandonei as estruturas dicionário pois o comportamento e funções para usá-las não foram bem assimiladas. Então optei por usar vetores bidimensionais. Uma dimensão guardaria o nome da face, e a outra acumularia as ocorrências. 

Lembrando que são 2 cubos. O cubo 1 contém os números 0, 1, 2, 3, 4, 5 e o cubo 2 contém os números 0, 1, 2, 6 (que também ser para o dígito 9), 7 e 8. Então declarei dois vetores bidimensionais e 3 funções. Uma para contar os meses de 31 dias, uma para contar os meses de 30 dias e uma outra para contar o fevereiro. Essas três invocam uma função contadora que recebe um valor referente a cada dia específico e incrementa as faces com compõem o número. Os valores são acumulados e ao final tem o quantitativo. 

Ideia pronto então ora de por a mão na massa, digitei o código e não consegui depurar adequadamente no Colab, precisava acompanhar os valores das variáveis para confirmar se estava fazendo certo e mesmo importando o pacote ipdb a experiência não foi boa. Abandonei então o Colab, baixei o VSCode e seus componentes e finalmente pude rodar e depurar o programa que entregou o resultado correto.

Com o resultado em mãos percebi que tinha deficiências para apresentar o resultado, a saída do print é bem simples, servindo mais para saber o resultado estava correto, daí comecei a pesquisa se havia uma forma mais elaborada de apresentar o resultado seja via uma imagem seja via integração HTML. Para esta última tem a opção do PyScript e/ou Flask, mas eu vou levar muito tempo para fazer isso.

Então para não ficar no básico, vamos apelar para boa e sólida matplotlib e fazer o gráfico das frequências de cada face. Só importar a biblioteca no VSCode, instalar e fazer as chamadas e voilà !


Mas eis a saída do print:


A face campeã é o "1" do cubo 1 e se o ano for bissexto há um empate entre o 1 e 2 do cubo 1.

Porém o resultado não é definitivo pois se pode forçar que uma determinada face seja mais utilizada nos dias em os dígitos 0, 1 e 2 são utilizados, pois ambos os cubos possuem esses dígitos. O código disponibilizado não contabiliza essa possibilidade.

O código está disponível no GitHub.