quarta-feira, 17 de dezembro de 2014

Análise dos números da Mega Sena versão 2

Com o ganho de experiência, aprende-se a resolver os mesmos problemas de forma otimizada. Há um tempo foi apresentado o Análise dos números da Mega Sena e ao executar o mesmo script, resulta em erros porque a formatação dos dados foi alterada. Com algumas novas "sacadas", há uma nova versão disponível acompanhada dos comentários.

Com relação às melhorias, lista-se:

  • Saída sem exibir as respostas do unzip;
  • Ao invés de localizar um bloco que contém os números sorteados, localiza-se a data do sorteio e armazena-se as 6 linhas abaixo (as dezenas sorteadas);
  • Como consequência do item anterior, menos tags HTML para manipular.

Abaixo o shell script comentado mostrando a frequência de cada dezena sorteada e os 6 números mais frequentes.


#!/bin/bash
# Created in dez/26/2012 by murilofujita@gmail.com
# Modified in dez/14/2014
# Optimized in dez/16/2014

if [ -f D_mgsasc.zip ]
  then
    rm D_mgsasc.zip
fi

if [ -f T2.GIF ]
  then
    rm T2.GIF
fi

if [ -f /tmp/sena1.txt ]
  then
    rm /tmp/sena*.txt
fi

wget http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_mgsasc.zip
unzip D_mgsasc.zip >& /dev/null

tr -d '\r' < d_megasc.htm > $$
mv $$ d_megasc.htm

ano_atual=`date +%Y`

# Quantidade de jogos realizados
for ano in `seq $ano_atual 1 $ano_atual`
    do
      jogo=`sed -n "/$ano/{x;p;};h" d_megasc.htm | sed 's/<[^>]*>//g'` 
    done 

# sorteios=`echo "$jogo"`
printf "Dados dos `echo "$jogo" | tail -n 1` sorteios"

# Obtendo os números sorteados
# "/ano" é a palavra para ser localizada. Se for apenas "ano" o numero 2000 pode aparecer 
# em outro campo. Por exemplo: 2000 é o número de ganhadores da quadra em 28/04/2004
  for ano in `seq 1996 1 $ano_atual` 
    do  
      awk "/\/$ano/ {for(i=1; i<=6; i++) {getline; print}}" d_megasc.htm 
    done > /tmp/sena1.txt

# Necessário remover as tags para que a massa de dados contenha apenas os números sorteados
sed 's/<[^>]*>//g' /tmp/sena1.txt > $$ 
mv $$ /tmp/sena1.txt

echo 
echo Exibindo a frequência dos números sorteados da Mega Sena
  for i in `seq 9`
    do
      printf "0$i `grep 0$i /tmp/sena1.txt | wc -l`  "
    done
  printf "10 `grep 10 /tmp/sena1.txt | wc -l` "
  printf "\n"

  for i in `seq 11 1 60`
    do
      printf "$i `grep $i /tmp/sena1.txt | wc -l`  "
      if [ $((i % 10)) -eq 0 ]
        then
          printf "\n"
      fi
    done
  printf "\n"

for i in `seq 9`; do printf "0$i `grep 0$i /tmp/sena1.txt | wc -l`\n" ; done >> /tmp/sena2.txt
for i in `seq 10 1 60`; do printf "$i `grep $i /tmp/sena1.txt | wc -l`\n" ; done >> /tmp/sena2.txt
awk '{printf "%3s %3s\n",$2, $1}' /tmp/sena2.txt | sort -n | tail -n 6 > /tmp/sena3.txt

echo Os números mais sorteados são:
echo Dezena Frequência

for i in `seq 6`
  do
     tail -n $i /tmp/sena3.txt | head -n 1 | awk '{printf "%4s %8s\n",$2, $1}'
  done

printf "\n"

awk '{printf "%s\n",$2}' /tmp/sena2.txt | paste -s -d"+"

if [ -f d_megasc.htm ]
  then
    rm d_megasc.htm
fi

Até a data de publicação foram realizados 1661 sorteios e o resultado é exibido abaixo:

Dados dos 1661 sorteios
Exibindo a frequência dos números sorteados da Mega Sena
01 159  02 170  03 157  04 192  05 196  06 163  07 168  08 170  09 143  10 176 
11 154  12 168  13 177  14 151  15 149  16 174  17 181  18 161  19 153  20 159  
21 145  22 137  23 178  24 182  25 148  26 137  27 169  28 176  29 175  30 170  
31 167  32 172  33 184  34 166  35 157  36 173  37 164  38 166  39 143  40 158  
41 175  42 184  43 178  44 173  45 151  46 160  47 170  48 150  49 179  50 173  
51 187  52 177  53 186  54 187  55 144  56 164  57 155  58 162  59 163  60 160  

Os números mais sorteados são:
Dezena Frequência
  05      196
  04      192
  54      187
  51      187
  53      186
  42      184

159+170+157+192+196+163+168+170+143+176+154+168+177+151+149+174+181+161+153+159+145+137+178+182+148+137+169+176+175+170+
167+172+184+166+157+173+164+166+143+158+175+184+178+173+151+160+170+150+179+173+187+177+186+187+144+164+155+162+163+160

A razão desta última linha é fazer uma checagem. Analise:

1661 sorteios * 6 números sorteados = 9966 números.

Basta copiar a linha do somatório e colar em uma calculadora ou célula de planilia eletrônica para verificar se coincide com a mesma quantidade dos números sorteados.

Conclusão: Por causa da diferença no formato da tabela, invalidou o primeiro script da "mega sena" e forçou uma otimização na forma de lidar com novo arquivo. O tempo de processamento diminuiu e é possível fazer uma verificação se todos os números foram contabilizados.