Em 2010 criei uma rotina para mapear todos os jogos da lotofácil. Tendo inclusivi postado um arquivo contendo todos os jogos no 4shared: http://www.4shared.com/rar/zXmPWszM/lot ... cale=pt-BR.
Infelizmente perdi o código fonte e aí neste sábado resolvi recriá-lo. O código fonte original ficou bem menor, mas não me lembro a lógica que usei.
Neste escrevi um pouco mais mas o resultado é idêntico: um arquivo .txt com todos as 3.268.760 combinações.
Por curiosidade, ou caso seja de interesse de algum de vocês segue aqui o código fonte.
Código: Selecionar todos
/**
====================================================================================================
MAPEANDO TODOS OS JOGOS DA LOTO-FÁCIL
----------------------------------------------------------------------------------------------------
PROGRAMADOR: YUGI
====================================================================================================
*/
function main()
LOCAL ct:=0
PUBLIC vet1:=array(6), vet2:=array(6), vet3:=array(6), vet4:=array(6), vet5:=array(6)
PUBLIC jog1:={}, jog2:={}, jog3:={}, jog4:={}, jog5:={}
inicializa() // Preenchendo os vetores de inicialização
calcularJogadas() // calculando todas as jogadas possíveis por blocos
? time()
criarArquivo("a.txt")
calcularJogo() // calcular todos os jogos possíveis para lotofacil
fecharArquivo()
? time()
return
/**
====================================================================================================
Cria um arquivo texto permitindo escrever nele como se estivesse mostrando informações na tela
do computador
====================================================================================================
*/
function criarArquivo(wArq)
set printer on
set device to printer
set console off
set printer to &wArq
return
/**
====================================================================================================
Fecha um arquivo Texto e retorna o direcionamento para a tela
====================================================================================================
*/
function fecharArquivo()
set printer off
set device to screen
set console on
set printer to
return
/**
====================================================================================================
Preenche os vetores de inicialização para calcular todas as jogadas
====================================================================================================
*/
function inicializa()
LOCAL ct:=0
vet1[1] = ""
for ct:= 2 to 6
vet1[ct] = strzero(ct-1,2,0)
next
vet2[1] = ""
for ct:= 2 to 6
vet2[ct] = strzero(5 + val(vet1[ct]),2,0)
next
vet3[1] = ""
for ct:= 2 to 6
vet3[ct] = strzero(10 + val(vet1[ct]),2,0)
next
vet4[1] = ""
for ct:= 2 to 6
vet4[ct] = strzero(15 + val(vet1[ct]),2,0)
next
vet5[1] = ""
for ct:= 2 to 6
vet5[ct] = strzero(20 + val(vet1[ct]),2,0)
next
return
/**
====================================================================================================
Calcula todas as jogadas para cada um dos 5 grupos
====================================================================================================
*/
function calcularJogadas()
LOCAL ct:=0, vetorTmp := {}, contador:={1,1,1,1,1,1}, cStr:="", modelo := {1,2,3,4,5}
do while .t.
cStr = vet1[contador[1]] + vet1[contador[2]] + vet1[contador[3]] + vet1[contador[4]] + vet1[contador[5]] + vet1[contador[6]]
++ contador[1]
if (contador[1]>6)
contador[1] = 1
++ contador[2]
endif
if (contador[2]>6)
contador[2] = 1
++ contador[3]
endif
if (contador[3]>6)
contador[3] = 1
++ contador[4]
endif
if (contador[4]>6)
contador[4] = 1
++ contador[5]
endif
if (contador[5]>6)
contador[5] = 1
++ contador[6]
endif
if (contador[6]>6)
exit
endif
if jogadaValida(cStr)
cStr = ordenaJogada(cStr)
if !contemJogada(vetorTmp,formata(cStr))
aadd(vetorTmp, formata(cStr))
endif
endif
enddo
jog1 = vetorTmp
// calculando as outras jogadas
tam := len(jog1)
valor = 5
for ct:= 1 to tam
cstr = jog1[ct]
for ct2:= 1 to 5
cstr = strtran(cStr,strzero(modelo[ct2],2,0),strzero(modelo[ct2]+valor,2,0))
next
aadd(jog2,cStr)
next
valor = 10
for ct:= 1 to tam
cstr = jog1[ct]
for ct2:= 1 to 5
cstr = strtran(cStr,strzero(modelo[ct2],2,0),strzero(modelo[ct2]+valor,2,0))
next
aadd(jog3,cStr)
next
valor = 15
for ct:= 1 to tam
cstr = jog1[ct]
for ct2:= 1 to 5
cstr = strtran(cStr,strzero(modelo[ct2],2,0),strzero(modelo[ct2]+valor,2,0))
next
aadd(jog4,cStr)
next
valor = 20
for ct:= 1 to tam
cstr = jog1[ct]
for ct2:= 1 to 5
cstr = strtran(cStr,strzero(modelo[ct2],2,0),strzero(modelo[ct2]+valor,2,0))
next
aadd(jog5,cStr)
next
return
/**
====================================================================================================
formata a jogada colocando espaços entre os números
====================================================================================================
*/
function formata(jogada)
local ret := ""
do case
case len(jogada) = 10
ret = substr(jogada,1,2) + " " + substr(jogada,3,2) + " " + substr(jogada,5,2) + " " + substr(jogada,7,2) + " " + ;
substr(jogada,9,2)
case len(jogada) = 8
ret = substr(jogada,1,2) + " " + substr(jogada,3,2) + " " + substr(jogada,5,2) + " " + substr(jogada,7,2)
case len(jogada) = 6
ret = substr(jogada,1,2) + " " + substr(jogada,3,2) + " " + substr(jogada,5,2)
case len(jogada) = 4
ret = substr(jogada,1,2) + " " + substr(jogada,3,2)
case len(jogada) = 2
ret = jogada
endcase
return ret
/**
====================================================================================================
Verifica se a jogada é valida
====================================================================================================
*/
function jogadaValida(jogada)
local ct:=0, valida := "0102030405", verifica:= 1, tam:= 0
if len(jogada) <= 2
return .T.
endif
if len(jogada) > 10
return .F.
endif
if len(jogada) = 2
if (substr(jogada,1,2) == substr(jogada,3,2))
return .F.
else
return .T.
endif
endif
tam = len(jogada)
for ct:= 1 to tam step 2
if substr(jogada,ct,2) $ valida
valida = strtran(valida,substr(jogada,ct,2),"")
else
verifica = 0
exit
endif
next
if verifica == 1
return .T.
endif
return .F.
/**
====================================================================================================
Verifica se a jogada já foi adicionada ao vetor
====================================================================================================
*/
function contemJogada(vetor,jogada)
LOCAL tam:= 0
tam := len(vetor)
for ct:= 1 to tam
if (jogada == vetor[ct])
return .T.
endif
next
return .F.
/**
====================================================================================================
Ordena uma jogada de forma ascendente
====================================================================================================
*/
function ordenaJogada(cStr)
local ret := "", vet := {}
if len(cStr) <= 2
return cStr
endif
for ct:= 1 to len(cStr) step 2
aadd(vet,val(substr(cStr,ct,2)))
next
asort(vet)
ret := ""
for ct:= 1 to len(vet)
ret := ret + strzero(vet[ct],2,0)
next
return ret
/**
====================================================================================================
Verifica se uma jogada completa é valida
====================================================================================================
*/
function verificaJogada(cStr)
local ct:= 0, tam := 0, valida := "01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25"
cStr := strtran(cStr," ","")
tam := len(cStr)
if tam <> 30
return .F.
endif
for ct:= 1 to tam step 2
if substr(cStr,ct,2) $ valida
valida = strtran(valida,substr(cStr,ct,2),"")
else
return .F.
endif
next
return .T.
/**
====================================================================================================
Calcular Jogo
====================================================================================================
*/
function calcularJogo()
local contador:={1,1,1,1,1}, limite:= len(jog1), ct:= 1
do while.t.
cStr := jog1[contador[1]] + " " + jog2[contador[2]] + " " + jog3[contador[3]] + " " + jog4[contador[4]] + " " + jog5[contador[5]]
if verificaJogada(cStr)
if ct = 1
?? strzero(ct,7) + ": " + Alltrim(strtran(cStr," "," "))
else
? strzero(ct,7) + ": " + Alltrim(strtran(cStr," "," "))
endif
++ ct
endif
++ contador[1]
if (contador[1]>limite)
contador[1] = 1
++ contador[2]
endif
if (contador[2]>limite)
contador[2] = 1
++ contador[3]
endif
if (contador[3]>limite)
contador[3] = 1
++ contador[4]
endif
if (contador[4]>limite)
contador[4] = 1
++ contador[5]
endif
if (contador[5]>limite)
exit
endif
enddo
returnYugi.


