import itertools
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
from tqdm import tqdm
# Funzione per leggere i dati delle estrazioni da un file di testo
def leggi_estrazioni(file_path):
with open(file_path, 'r') as file:
estrazioni = [list(map(int, line.strip().split('.'))) for line in file]
return estrazioni
# Funzione per verificare se una terzina ha frequenza 0 per ambo in un ciclo considerando tutte le ruote
def has_zero_frequency_for_ambo(terzina, ciclo_ruote):
for ciclo in ciclo_ruote:
for estrazione in ciclo:
if set(terzina).issubset(estrazione):
return False
return True
# Funzione per calcolare il colpo di sfaldamento per una terzina
def calcola_colpo_sfaldamento(terzina, estrazioni_ruote):
colpo = 0
for estrazioni in estrazioni_ruote:
if all(all(num not in estrazione for estrazione in ruota) for num in terzina):
colpo += 1
else:
break
return colpo
# Leggi i dati delle estrazioni da tutti i file
ruote = ['BA', 'CA', 'FI', 'GE', 'MI', 'NA', 'PA', 'RO', 'TO', 'VE', 'NZ']
estrazioni = {ruota: leggi_estrazioni(f'estrazioni-{ruota}.txt') for ruota in ruote}
# Genera tutte le possibili terzine
all_numbers = set(range(1, 91)) # Numeri del lotto vanno da 1 a 90
terzine = list(itertools.combinations(all_numbers, 3))
# Suddividi le estrazioni in cicli di 178
def suddividi_in_cicli(estrazioni):
for i in range(0, len(estrazioni), 178):
yield estrazioni[i:i+178]
# Analizza ogni ciclo considerando tutte le ruote simultaneamente
max_colpo_teorico = 0
def analizza_ciclo(ciclo_index, cicli_ruote, terzine, pbar):
global max_colpo_teorico
print(f"Inizio analisi ciclo {ciclo_index}")
terzine_zero_frequency = [terzina for terzina in terzine if has_zero_frequency_for_ambo(terzina, cicli_ruote)]
print(f"Terzine con frequenza 0 per ambo trovate: {len(terzine_zero_frequency)}")
for terzina in terzine_zero_frequency:
colpo = calcola_colpo_sfaldamento(terzina, [estrazioni[ruota][ciclo_index*178:] for ruota in ruote])
if colpo > max_colpo_teorico:
max_colpo_teorico = colpo
pbar.update(1)
pbar.set_description(f"Ciclo {ciclo_index} completato.")
print(f"Ciclo {ciclo_index} completato. Progresso: {pbar.n}/{pbar.total}")
return max_colpo_teorico
# Analizza tutti i cicli considerando tutte le ruote simultaneamente
start_time = time.time()
total_cicli = 60 # 60 cicli per ogni ruota
cicli_ruote = [list(suddividi_in_cicli(estrazioni[ruota])) for ruota in ruote]
with tqdm(total=total_cicli, desc="Progresso totale") as pbar:
with ThreadPoolExecutor() as executor:
futures = [executor.submit(analizza_ciclo, i, [ciclo[i] for ciclo in cicli_ruote], terzine, pbar) for i in range(total_cicli)]
for future in as_completed(futures):
future.result()
end_time = time.time()
print(f"Il colpo massimo teorico del relativo sfaldamento è: {max_colpo_teorico}")
print(f"Tempo totale di esecuzione: {end_time - start_time} secondi")