Ciao, Acquafresca.
Grazie del programma anche su ruota e unite.
Non capisco però, i mx storici sono molto esigui, si spiega se vi sono solo 28 estrazioni caricate.
E' così? Potresti mettere l'archivio dal 15/09/2009 ( estr. 8117)? Grazie
Vedi l'allegato 2316380
ho dato un'occhiata ma sinceramente non ho capito da dove esce quel 28, allego lo script ,dove mi sono accorto che non avevo modificato le parentesi nella zona Tutte le ruote ,io ho l'archivio completo dal 1871 ho fatto delle prove e il 28 è sempre li ,come nel screenshot ,ma il file era quello modificato da
InRicordo ,posto lo script cosi magari qualcuno più esperto riesca a capire da dove proviene quel (28): codice :
import os
import time
import random
import re
import sys
import tkinter as tk
from tkinter import scrolledtext
# CONFIGURAZIONE STRATEGICA OPERATIVA
SOGLIA_MAX_STO = 135
SOGLIA_MAX_STO_UNITE = 20
MAX_TENTATIVI = 500000
RUOTE_MAPPATURA = ['BA', 'CA', 'FI', 'GE', 'MI', 'NA', 'PA', 'RM', 'RN', 'TO', 'VE']
# ---------------------------------------------------------
# CARICAMENTO ARCHIVIO
# ---------------------------------------------------------
def carica_archivio_veloce():
os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))
archivio = []
try:
with open("estrazioni.csv", mode='r', encoding='utf-8', errors='ignore') as f:
for riga in f:
riga = riga.strip()
if not riga:
continue
parti = riga.split(',')
numeri = []
for p in parti[1:]:
try:
n = int(p)
if 1 <= n <= 90:
numeri.append

except:
continue
if len(numeri) == 55:
archivio.append(numeri)
return archivio[-2600:]
except:
return []
# ---------------------------------------------------------
# VERIFICA AMBO (debug)
# ---------------------------------------------------------
def verifica_ambo(num1, num2, ruota_idx=None):
archivio = carica_archivio_veloce()
if not archivio:
print("Archivio non caricato.")
return
if ruota_idx is not None:
cinquine = [set(e[ruota_idx * 5: ruota_idx * 5 + 5]) for e in archivio]
etichetta = RUOTE_MAPPATURA[ruota_idx]
else:
cinquine = [set(e) for e in archivio]
etichetta = "RUOTE UNITE"
rit_cor = 0
rit_max = 0
ultima_uscita = None
for i, cinquina in enumerate(cinquine):
if num1 in cinquina and num2 in cinquina:
rit_max = max(rit_max, rit_cor)
ultima_uscita = i
rit_cor = 0
else:
rit_cor += 1
rit_max = max(rit_max, rit_cor)
print(f"\n[{etichetta}] Ambo {num1}-{num2}")
print(f" Estrazioni analizzate : {len(archivio)}")
print(f" Ritardo attuale : {rit_cor}")
print(f" Ritardo massimo sto. : {rit_max}")
if ultima_uscita is not None:
print(f" Ultima uscita a indice: {ultima_uscita} ({len(archivio) - 1 - ultima_uscita} estr. fa)")
else:
print(f" Mai uscito nell'archivio!")
# ---------------------------------------------------------
# SCANSIONE SU TUTTE LE RUOTE (una per una)
# ---------------------------------------------------------
def esegui_scansione_super_veloce(log_func):
tempo_inizio = time.time()
archivio = carica_archivio_veloce()
if not archivio:
log_func("ERRORE: File 'estrazioni.csv' non trovato o non valido.\n")
return
tot_estrazioni = len(archivio)
log_func(f"Archivio caricato: {tot_estrazioni} estrazioni dal 2009 ad oggi.\n")
log_func(f"Avvio scanner su {MAX_TENTATIVI} combinazioni per TUTTE le ruote...\n")
log_func("-" * 95 + "\n")
combinazioni_valide = 0
numeri_90 = list(range(1, 91))
cinquine_archivio_per_ruota = []
for idx_ruota in range(11):
lista_ruota = []
for estrazione in archivio:
cinquina = set(estrazione[idx_ruota * 5: idx_ruota * 5 + 5])
lista_ruota.append(cinquina)
cinquine_archivio_per_ruota.append(lista_ruota)
for _ in range(MAX_TENTATIVI):
dieci_numeri = random.sample(numeri_90, 10)
pentambo_ambi = [
(dieci_numeri[0], dieci_numeri[1]),
(dieci_numeri[2], dieci_numeri[3]),
(dieci_numeri[4], dieci_numeri[5]),
(dieci_numeri[6], dieci_numeri[7]),
(dieci_numeri[8], dieci_numeri[9])
]
for idx_ruota, nome_ruota in enumerate(RUOTE_MAPPATURA):
rit_cor = 0
rit_max = 0
for cinquina in cinquine_archivio_per_ruota[idx_ruota]:
esito = any(ambo[0] in cinquina and ambo[1] in cinquina for ambo in pentambo_ambi)
if esito:
rit_max = max(rit_max, rit_cor)
rit_cor = 0
else:
rit_cor += 1
rit_max = max(rit_max, rit_cor)
if 0 < rit_max <= SOGLIA_MAX_STO and 0 < rit_cor < rit_max:
combinazioni_valide += 1
formazione_str = " ".join([f"{a[0]:02d}.{a[1]:02d}" for a in pentambo_ambi])
diff = rit_max - rit_cor
stato_str = "

CALDO" if diff <= 5 else "In accumulo"
log_func(
f"{nome_ruota} -> {formazione_str} | MaxSto {rit_max} | RitAtt {rit_cor} | {stato_str}\n"
)
if combinazioni_valide >= 30:
log_func("\n[INFO] Raggiunto limite massimo.\n")
return
tempo_totale = time.time() - tempo_inizio
log_func(f"\nScansione completata in {tempo_totale:.2f} secondi.\n")
# ---------------------------------------------------------
# SCANSIONE RUOTE UNITE
# ---------------------------------------------------------
def esegui_scansione_ruote_unite(log_func):
tempo_inizio = time.time()
archivio = carica_archivio_veloce()
if not archivio:
log_func("ERRORE: File 'estrazioni.csv' non trovato o non valido.\n")
return
tot_estrazioni = len(archivio)
log_func(f"Archivio caricato: {tot_estrazioni} estrazioni dal 2009 ad oggi.\n")
log_func(f"Avvio scanner RUOTE UNITE su {MAX_TENTATIVI} combinazioni (soglia MaxSto ≤ {SOGLIA_MAX_STO_UNITE})...\n")
log_func("-" * 95 + "\n")
combinazioni_valide = 0
numeri_90 = list(range(1, 91))
estrazioni_unite = [set(riga) for riga in archivio]
for _ in range(MAX_TENTATIVI):
dieci_numeri = random.sample(numeri_90, 10)
pentambo_ambi = [
(dieci_numeri[0], dieci_numeri[1]),
(dieci_numeri[2], dieci_numeri[3]),
(dieci_numeri[4], dieci_numeri[5]),
(dieci_numeri[6], dieci_numeri[7]),
(dieci_numeri[8], dieci_numeri[9])
]
rit_cor = 0
rit_max = 0
for estr_unica in estrazioni_unite:
esito = any(ambo[0] in estr_unica and ambo[1] in estr_unica for ambo in pentambo_ambi)
if esito:
rit_max = max(rit_max, rit_cor)
rit_cor = 0
else:
rit_cor += 1
rit_max = max(rit_max, rit_cor)
if 0 < rit_max <= SOGLIA_MAX_STO_UNITE and 0 < rit_cor < rit_max:
combinazioni_valide += 1
formazione_str = " ".join([f"{a[0]:02d}.{a[1]:02d}" for a in pentambo_ambi])
diff = rit_max - rit_cor
stato_str = "

CALDO" if diff <= 5 else "In accumulo"
log_func(
f"RUOTE UNITE -> {formazione_str} | MaxSto {rit_max} | RitAtt {rit_cor} | {stato_str}\n"
)
if combinazioni_valide >= 100:
log_func("\n[INFO] Raggiunto limite massimo.\n")
return
tempo_totale = time.time() - tempo_inizio
log_func(f"\nScansione completata in {tempo_totale:.2f} secondi.\n")
# ---------------------------------------------------------
# INTERFACCIA GRAFICA
# ---------------------------------------------------------
class AppLotto:
def __init__(self, root):
self.root = root
self.root.title("Python Lotto Ultra-Scanner (Pentambi v4.5)")
self.root.geometry("950x600")
top = tk.Frame(root, pady=10, bg="#2c3e50")
top.pack(fill=tk.X)
tk.Button(
top,
text="

SCANSIONE PER RUOTA",
command=self.start,
bg="#27ae60",
fg="white",
font=("Arial", 11, "bold"),
pady=8
).pack()
tk.Button(
top,
text="

SCANSIONE RUOTE UNITE",
command=self.start_ruote_unite,
bg="#2980b9",
fg="white",
font=("Arial", 11, "bold"),
pady=8
).pack()
self.txt = scrolledtext.ScrolledText(
root,
font=("Consolas", 10),
bg="#0c0c0c",
fg="#00ff00"
)
self.txt.pack(expand=True, fill=tk.BOTH, padx=10, pady=10)
def start(self):
self.txt.delete(1.0, tk.END)
esegui_scansione_super_veloce(lambda m: (self.txt.insert(tk.END, m), self.root.update()))
def start_ruote_unite(self):
self.txt.delete(1.0, tk.END)
esegui_scansione_ruote_unite(lambda m: (self.txt.insert(tk.END, m), self.root.update()))
if __name__ == "__main__":
rt = tk.Tk()
AppLotto(rt)
rt.mainloop()