As estatísticas abaixo foram obtidas do arquivo D_megase.zip, proveniente do site da Caixa Econômica Federal.
1. O último prêmio distribuído foi em 20/03/2019 (sorteio nº 2135),
no valor de R$ 32.689.083,52.
As dezenas ganhadoras deste sorteio foram:23, 48, 59, 28, 40, 9
2. O maior prêmio já distribuído foi de R$
306.718.743,68, que foi sorteado em
31/12/2017 (sorteio nº 2000).
Esse sorteio teve 17 ganhador(es).
As dezenas ganhadoras deste sorteio foram:
3. O sorteio com o maior número de ganhadores foi o de nº
2110, de 31/12/2018.
52
pessoas dividiram o prêmio de R$ 302.536.382,72, ficando com R$
5.818.007,36 cada.
As dezenas ganhadoras deste sorteio foram:
01 (211) |
02 (218) |
03 (199) |
04 (235) |
05 (242) |
06 (222) |
07 (200) |
08 (213) |
09 (190) |
10 (244) |
11 (213) |
12 (214) |
13 (222) |
14 (199) |
15 (194) |
16 (219) |
17 (225) |
18 (217) |
19 (202) |
20 (206) |
21 (185) |
22 (189) |
23 (234) |
24 (230) |
25 (198) |
26 (173) |
27 (224) |
28 (224) |
29 (217) |
30 (223) |
31 (204) |
32 (220) |
33 (231) |
34 (221) |
35 (216) |
36 (217) |
37 (223) |
38 (213) |
39 (201) |
40 (209) |
41 (217) |
42 (225) |
43 (222) |
44 (220) |
45 (207) |
46 (210) |
47 (206) |
48 (195) |
49 (210) |
50 (217) |
51 (228) |
52 (224) |
53 (241) |
54 (234) |
55 (183) |
56 (221) |
57 (194) |
58 (209) |
59 (211) |
60 (199) |
01 (8) |
02 (4) |
03 (4) |
04 (18) |
05 (3) |
06 (1) |
07 (8) |
08 (14) |
09 (0) |
10 (14) |
11 (7) |
12 (6) |
13 (5) |
14 (12) |
15 (12) |
16 (5) |
17 (14) |
18 (3) |
19 (2) |
20 (2) |
21 (1) |
22 (27) |
23 (0) |
24 (7) |
25 (15) |
26 (2) |
27 (9) |
28 (0) |
29 (14) |
30 (3) |
31 (6) |
32 (6) |
33 (25) |
34 (1) |
35 (3) |
36 (5) |
37 (14) |
38 (15) |
39 (3) |
40 (0) |
41 (15) |
42 (16) |
43 (11) |
44 (8) |
45 (31) |
46 (1) |
47 (11) |
48 (0) |
49 (13) |
50 (12) |
51 (2) |
52 (2) |
53 (5) |
54 (1) |
55 (5) |
56 (12) |
57 (2) |
58 (9) |
59 (0) |
60 (3) |
6. E aqui vai o código-fonte que gerou as estatísticas:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Mining statistics from lottery results</title>
<style type="text/css">
body, td, p {
font-family: Verdana; font-size: small;
}
table, td {
border:1px solid #444;
border-collapse: collapse;
}
caption {
height: 4em;
font-weight: bold;
padding-top: 5px;
background-color: #eee;
}
td {
text-align: center;
width: 3.5em;
height: 3em;
}
code {
background-color: #eee;
font-family: Courier New;
font-size: 9pt;
display: block;
width: 800px; height: 300px;
overflow: auto;
}
.err {
display: auto;
color: #f00;
}
.msg {display: none;}
.niv1 {background-color: #7F7F7F;}
.niv2 {background-color: #999999;}
.niv3 {background-color: #B2B2B2;}
.niv4 {background-color: #CCCCCC;}
.niv5 {background-color: #E5E5E5;}
.niv6 {background-color: #FFFFFF;}
</style>
</head>
<body>
<?php
/**
* Exercício de data mining em PHP
* O objetivo é ler o arquivo de resultados da Mega-Sena, baixado do site da Caixa Econômica Federal, e extrair estatísticas.
* Professor: Cristiano
* Aluno: Felipe Plattek
* Início: 24/10/2007 13:00:00 BRST (GMT-2)
* Ultima edição: 03/09/2014 10:20:00 BRT (GMT-3)
* Teor da últ. ed.: O arquivo da Caixa mudou, acrescentando duas novas colunas: Cidade e UF
* O índice das colunas após a 9 teve de aumentar em 2.
* Efetuadas alterações na lógica de extração de linhas para evitar erros.
*/
//error_reporting(E_ALL);
//ini_set("display_errors",1);
//constantes que refletem a estrutura do arquivo de resultados da Mega-Sena
define('NUM_SORT',0);
define('DAT_SORT',1);
define('DEZ1',2);
define('DEZ2',3);
define('DEZ3',4);
define('DEZ4',5);
define('DEZ5',6);
define('DEZ6',7);
define('QNT_GANHA',9);
define('VAL_GANHA',11);
define('QNT_QUINA',12);
define('VAL_QUINA',13);
define('QNT_QUADRA',14);
define('VAL_QUADRA',15);
define('IS_ACUMUL',16);
define('VAL_ACUMUL',17);
//vetor que vai armazenar o numero de vezes que cada dezena foi sorteada.
//a função array_fill inicializa todos os elementos do vetor com o numero 0.
$frequencia = array_fill(0,60,0);
$ultimas = array_fill(0,60,0);
$encalhadas = array_fill(0,60,0);
$ult_dezenas = array_fill(0,6,0);
$dezenas = array_fill(0,6,0);
$maior_premio = 0.0;
$ganhadores_maior = 0;
$data_maior = '0';
$num_sorteio_maior = 0;
$frequencia_maior = '';
$mais_ganhadores = 0;
$mais_ganha_premio = 0;
$mais_ganha_premio_parc = 0;
$mais_ganha_data = '0';
$mais_ganha_sorteio = 0;
$mais_ganha_dezenas = '';
$mais_encalhadas = array();
$line_counter = 0;
$termina_linha = '</tr>';
// baixa o zip do site da caixa
if (function_exists('curl_init')) {
// initialize a new curl resource
$ch = curl_init();
// set the url to fetch
curl_setopt($ch, CURLOPT_URL,
'http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip');
// don't give me the headers just the content
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_COOKIE, "security=true; path=/");
//download only if file modified since last download
if(file_exists('D_megase.zip') && $cTime = @filectime('D_megase.zip')){
curl_setopt($ch, CURLOPT_HTTPHEADER, array('If-Modified-Since: '.date('r',$cTime)));
}
// return the value instead of printing the response to browser
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// use a user agent to mimic a browser
curl_setopt($ch, CURLOPT_USERAGENT,
'Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.7.5) Gecko/20041107 Firefox/1.0');
$content = curl_exec($ch);
curl_close($ch);
} else {
// curl library is not installed so we better die
die('<div class="err">Não foi possível baixar o arquivo do site da CEF</div>');
}
echo '<div class="msg">...cURL session over!</div>';
//escreve o zip no diretório se tiver sido mudado
if(strlen($content)>10){
if(!$fd = fopen('D_megase.zip','w')) die('<div class="err">Não foi possível abrir o arquivo para escrita</div>');
if(!fwrite($fd,$content)) die('<div class="err">Não foi possível salvar o arquivo</div>');
fclose($fd);
echo '<div class="msg">...Zip stored!</div>';
}else{
echo '<div class="msg">...Zip not modified!</div>';
}
// extrai o arquivo de resultados (não funciona em windows)
$tmp=array();
$res=-1;
$tmp2 = exec( 'unzip -o D_megase.zip -x', $tmp, $res);
if($res!=0) die('<div class="err">Não foi possível extrair o arquivo compactado.</div>');
echo '<div class="msg">...Zip Extracted!</div>';
//Finalmente, abre o arquivo para leitura
if(!$fd = fopen('D_MEGA.HTM','r')) die('<div class="err">Não foi possível abrir o arquivo para leitura!</div>');
echo '<div class="msg">...File Opened!</div>';
//esse loop vai posicionar o ponteiro no ponto onde começa a informação desejada
//pois a informação começa logo após o primeiro tag de final de TR.
$file_buffer = '12345';
$res=0;
while (!feof($fd) && (strcasecmp($file_buffer,$termina_linha)!=0)) {
if(strlen($file_buffer)>=5) $file_buffer = substr($file_buffer,1,4); // pula o primeiro caractere
$file_buffer .= trim(fgetc($fd)); // acrescenta ao buffer 1 caractere
$res++;
//echo htmlentities($file_buffer)."<br/>\r\n";
//if($res>2906) break;
}
//echo '<div class="err">'.$res.'</div>';
//esse loop vai correr até o fim do arquivo, extraindo dados de cada TR.
while (!feof($fd)){
$file_buffer = '';
$line_buffer = '';
//esse loop lê linhas do arquivo, até encontrar um final de TR
//e armazena a linha em $line_buffer
while (!feof($fd) && (strcasecmp($termina_linha,substr($file_buffer,-5,5))!=0)) {
$file_buffer = trim(fgets($fd));
$line_buffer .= ($file_buffer=='')?'':$file_buffer.':';
}
if(isset($_GET['dump']) && $_GET['dump']=='true') echo $line_buffer,'<br/>';
//aqui transformamos o $line buffer em um array com a função explode
$line_array = explode(':',trim(strip_tags($line_buffer),': \t\n\r\0\x0B'));
// se a linha extraída não possui todas as colunas, ignora a linha
if(count($line_array) < VAL_ACUMUL) continue;
// por alguma razão, ainda não debugada, existem algumas linhas que geram index -1 e eu estou as IGNORANDO
// e ignoramos também as linhas onde não houveram ganhadores da quadra (registros irregulares)
if((ltrim($line_array[DEZ1],'0'))<1 || $line_array[QNT_QUADRA]==0) continue;
$last_good_line = $line_array;
$line_counter++; //contando quantos sorteios tem no arquivo
for($i=0;$i<60;$ultimas[$i++]++); //acrescentando 1 a todas as dezenas na contagem de ultimas sorteadas
//registramos a ocorrencia das diferentes dezenas no sorteio.
//cumulativamente teremos a estatística de frequências
for($i=DEZ1;$i<=DEZ6;$i++){
$index = ltrim($line_array[$i],'0')-1; // subtraímos 1 para ficar com a primeira dezena no index 0
$frequencia[$index]++;
// registra quanto tempo essa dezena esteve 'encalhada' e zera o contador
$mais_encalhadas[$ultimas[$index]][0] = isset($mais_encalhadas[$ultimas[$index]])?$mais_encalhadas[$ultimas[$index]][0]+1:1;
$mais_encalhadas[$ultimas[$index]][1] = array($index+1,$line_array[DAT_SORT]);
$ultimas[$index]=0;
$dezenas[$i-DEZ1] = $index+1; //armazenamos as dezenas do ultimo sorteio
}
//utilizamos a função str_replace para reformatar o valor do rateio
$premio_parc = str_replace(',','.',str_replace('.','',$line_array[VAL_GANHA]));
//multiplica-se o valor do rateio pelo número de ganhadores
$premio = $line_array[QNT_GANHA]*$premio_parc;
//armazena os dados do ultimo sorteio premiado
if($premio>0){
$ult_premio = $premio;
$ult_sorteio = $line_array[NUM_SORT];
$ult_data = $line_array[DAT_SORT];
for($i=DEZ1;$i<=DEZ6;$i++) $ult_dezenas[$i-DEZ1] = ltrim($line_array[$i],'0');
}
//se esse é o maior prêmio até então, armazenamos os dados sobre ele
if($premio>$maior_premio){
$maior_premio = $premio;
$ganhadores_maior = $line_array[QNT_GANHA];
$num_sorteio_maior = $line_array[NUM_SORT];
$data_maior = $line_array[DAT_SORT];
for($i=DEZ1;$i<=DEZ6;$i++) $frequencia_maior[$i-DEZ1] = $line_array[$i];
}//end if
//se esse é o maior número de ganhadores até então, armazenamos os dados
if($line_array[QNT_GANHA]>$mais_ganhadores){
$mais_ganhadores = $line_array[QNT_GANHA];
$mais_ganha_premio = $premio;
$mais_ganha_premio_parc = $line_array[VAL_GANHA];
$mais_ganha_sorteio = $line_array[NUM_SORT];
$mais_ganha_data = $line_array[DAT_SORT];
for($i=DEZ1;$i<=DEZ6;$i++) $mais_ganha_dezenas[$i-DEZ1] = $line_array[$i];
}//end if
}//end while
//fechamos o arquivo
fclose($fd);
echo '<div class="msg">...File closed!</div>';
//formatando o valor do premio com separadores de milhar e virgula decimal
$ult_premio = number_format($ult_premio,2,',','.');
$maior_premio = number_format($maior_premio,2,',','.');
$mais_ganha_premio = number_format($mais_ganha_premio,2,',','.');
//formatando as dezenas ganhadoras como um string
$ult_dezenas = join(', ',$ult_dezenas);
$frequencia_maior = join(', ',$frequencia_maior);
$mais_ganha_dezenas = join(', ',$mais_ganha_dezenas);
?>
<h2>Data Mining - Mega Sena</h2>
<p>As estatísticas abaixo foram obtidas do arquivo <a href="D_megase.zip">D_megase.zip</a>,
proveniente do site da <a
href="http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip">Caixa Econômica Federal</a>.</p>
<?php if($last_good_line[IS_ACUMUL]=='SIM'):?>
<p><strong>0.</strong> O último sorteio (nº <?=$last_good_line[NUM_SORT]?>) foi em <?=$last_good_line[DAT_SORT]?>.
As dezenas sorteadas foram: <?php for($i=DEZ1;$i<DEZ6;++$i) echo $last_good_line[$i],', '; echo $last_good_line[DEZ6];?>.<br/>
O valor acumulado para o próximo sorteio é de <strong>R$ <?=$last_good_line[VAL_ACUMUL];?></strong>.
</p>
<?php endif;?>
<p><strong>1.</strong> O último prêmio distribuído foi em <?=$ult_data?> (sorteio nº <?=$ult_sorteio?>),
no valor de <strong>R$ <?=$ult_premio?></strong>.<br/>
As dezenas ganhadoras deste sorteio foram:<?=$ult_dezenas?>
</p>
<p><strong>2.</strong> O maior prêmio já distribuído foi de <strong>R$
<?=$maior_premio?></strong>, que foi sorteado em
<?=$data_maior?> (sorteio nº <?=$num_sorteio_maior?>).<br/>
Esse sorteio teve <?=$ganhadores_maior?> ganhador(es).<br/>
As dezenas ganhadoras deste sorteio foram:
<?=$frequencia_maior?>
</p>
<p><strong>3.</strong> O sorteio com o maior número de ganhadores foi o de nº
<?=$mais_ganha_sorteio, ', de ',$mais_ganha_data,'.<br/>',$mais_ganhadores?>
pessoas dividiram o prêmio de <strong>R$ <?=$mais_ganha_premio?></strong>, ficando com R$
<?=$mais_ganha_premio_parc?> cada.<br/>
As dezenas ganhadoras deste sorteio foram: <?=$mais_ganha_dezenas?>
</p>
<table border="1">
<caption>4. Frequência de sorteio das dezenas, em <?=$line_counter?> sorteios:</caption>
<tr>
<?php
//calculando níveis de frequência, para atribuir cores diferentes na tabela
$nivel_min = min($frequencia);
$nivel_max = max($frequencia);
$nivel_range = floor(($nivel_max-$nivel_min)/5);
for($i=0;$i<60;$i++){
if($i>0&&$i%10==0) echo '
</tr><tr>';
$bgclass = 'niv'.(floor(($nivel_max-$frequencia[$i])/$nivel_range)+1);
echo '
<td class="',$bgclass,'"><strong>',str_pad(($i+1),2,'00',STR_PAD_LEFT)
,'</strong><br/>(',$frequencia[$i],')</td>';
}
?>
</tr>
</table>
<p></p>
<table border="1">
<caption>5. Há quantos sorteios as dezenas foram sorteadas pela última vez?</caption>
<tr>
<?php
//calculando
$nivel_min = 0;
$nivel_max = max($ultimas);
$nivel_range = floor($nivel_max/5);
for($i=0;$i<60;$i++){
if($i>0&&$i%10==0) echo '
</tr><tr>';
$bgclass = 'niv'.(floor(($nivel_max-$ultimas[$i])/$nivel_range)+1);
echo '
<td class="',$bgclass,'"><strong>',str_pad(($i+1),2,'00',STR_PAD_LEFT)
,'</strong><br/>(',$ultimas[$i],')</td>';
}
?>
</tr>
</table>
<p></p>
<p>6. E aqui vai o código-fonte que gerou as estatísticas:</p>
<p><?php highlight_file('index.php');?></p>
</body>
</html>