Novità

Intelligenza artificiale e lotto 🤖🎱📈📉🎯

Grandissima QWEN 3.7 plus free :love:🤖 (spesso si attiva lei al posto della 3.8 max free...) :)

Non solo mi ha fatto questo...

Codice:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
VERIFICATORE UNIVERSALE AVANZATO - COLPO MASSIMO POST-FILTRO
Versione con selezione ruote personalizzata + allineamento perfetto emoji
"""

import requests
import re
from collections import defaultdict
from itertools import combinations
import time
import os

# ============================================================================
# CONFIGURAZIONE DEFAULT
# ============================================================================

DEFAULT_PERCORSO_FILE = ""
DEFAULT_CLASSE_SVILUPPO = 2
DEFAULT_SORTE_RICERCA = 'estratto'
DEFAULT_SORTE_VERIFICA = 'estratto'
DEFAULT_RUOTE_UNITE = 1
DEFAULT_TOLLERANZA_FILTRO = 0

DEFAULT_RANGES = {
    'fiammella_fuoco': 2,
    'fiammella_esplosione': 5,
}

# Tutte le ruote disponibili
TUTTE_LE_RUOTE = ['BA', 'CA', 'FI', 'GE', 'MI', 'NA', 'PA', 'RO', 'TO', 'VE', 'NZ']

# ============================================================================
# INPUT INTERATTIVO
# ============================================================================

def input_interattivo():
    print("\n" + "=" * 120)
    print("🎯 CONFIGURAZIONE PARAMETRI ANALISI")
    print("=" * 120)
 
    percorso = input(f"Percorso file matrice (default: {DEFAULT_PERCORSO_FILE if DEFAULT_PERCORSO_FILE else 'formazioni hardcoded'}): ").strip()
    if not percorso:
        percorso = DEFAULT_PERCORSO_FILE
 
    classe_input = input(f"Classe sviluppo [1=singoli, 2=coppie, 3=terne, 4=quaterne, 5=cinquine] (default: {DEFAULT_CLASSE_SVILUPPO}): ").strip()
    classe = int(classe_input) if classe_input else DEFAULT_CLASSE_SVILUPPO
 
    sorte_r_input = input(f"Sorte ricerca [estratto/ambo/terno/quaterna/cinquina] (default: {DEFAULT_SORTE_RICERCA}): ").strip().lower()
    sorte_r = sorte_r_input if sorte_r_input else DEFAULT_SORTE_RICERCA
 
    sorte_v_input = input(f"Sorte verifica [estratto/ambo/terno/quaterna/cinquina] (default: {DEFAULT_SORTE_VERIFICA}): ").strip().lower()
    sorte_v = sorte_v_input if sorte_v_input else DEFAULT_SORTE_VERIFICA
 
    ruote_input = input(f"Numero ruote unite da analizzare (default: {DEFAULT_RUOTE_UNITE}): ").strip()
    ruote = int(ruote_input) if ruote_input else DEFAULT_RUOTE_UNITE
 
    toll_input = input(f"Tolleranza filtro RS-RA (default: {DEFAULT_TOLLERANZA_FILTRO}): ").strip()
    tolleranza = int(toll_input) if toll_input else DEFAULT_TOLLERANZA_FILTRO
 
    range_f2_input = input(f"Soglia fuoco (Rem CM <= X, default: {DEFAULT_RANGES['fiammella_fuoco']}): ").strip()
    range_f2 = int(range_f2_input) if range_f2_input else DEFAULT_RANGES['fiammella_fuoco']
 
    range_f3_input = input(f"Soglia esplosione (Rem CM <= X, default: {DEFAULT_RANGES['fiammella_esplosione']}): ").strip()
    range_f3 = int(range_f3_input) if range_f3_input else DEFAULT_RANGES['fiammella_esplosione']
 
    # NUOVO: Selezione ruote
    print(f"\n🎲 Ruote disponibili: {' '.join(TUTTE_LE_RUOTE)}")
    ruote_sel_input = input(f"Seleziona ruote da analizzare (separate da spazio o virgola, default: tutte 11): ").strip()
 
    if ruote_sel_input:
        # Parsing input (supporta spazi, virgole, o entrambi)
        ruote_sel_input = ruote_sel_input.replace(',', ' ')
        ruote_selezionate = [r.strip().upper() for r in ruote_sel_input.split() if r.strip()]
     
        # Validazione
        ruote_valide = [r for r in ruote_selezionate if r in TUTTE_LE_RUOTE]
        ruote_non_valide = [r for r in ruote_selezionate if r not in TUTTE_LE_RUOTE]
     
        if ruote_non_valide:
            print(f"⚠️  Ruote non valide ignorate: {', '.join(ruote_non_valide)}")
     
        if ruote_valide:
            ruote_selezionate = ruote_valide
            print(f"✅ Ruote selezionate: {', '.join(ruote_selezionate)}")
        else:
            print(f"⚠️  Nessuna ruota valida selezionata. Uso tutte le 11 ruote.")
            ruote_selezionate = TUTTE_LE_RUOTE.copy()
    else:
        ruote_selezionate = TUTTE_LE_RUOTE.copy()
        print(f"✅ Uso tutte le 11 ruote: {', '.join(ruote_selezionate)}")
 
    ranges = {
        'fiammella_fuoco': range_f2,
        'fiammella_esplosione': range_f3
    }
 
    print("\n✅ Parametri configurati:")
    print(f"   File: {percorso if percorso else 'Default'}")
    print(f"   Classe: {classe}")
    print(f"   Sorte ricerca: {sorte_r}")
    print(f"   Sorte verifica: {sorte_v}")
    print(f"   Ruote unite: {ruote}")
    print(f"   Ruote selezionate: {len(ruote_selezionate)} ({', '.join(ruote_selezionate)})")
    print(f"   Tolleranza: {tolleranza}")
    print(f"   Range: fuoco<={range_f2}, esplosione<={range_f3}")
    print("=" * 120 + "\n")
 
    return percorso, classe, sorte_r, sorte_v, ruote, tolleranza, ranges, ruote_selezionate

# ============================================================================
# CONFIGURAZIONE ARCHIVI E FORMAZIONI DEFAULT
# ============================================================================

URL_ARCHIVI = {
    'BA': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-BA.txt',
    'CA': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-CA.txt',
    'FI': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-FI.txt',
    'GE': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-GE.txt',
    'MI': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-MI.txt',
    'NA': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-NA.txt',
    'PA': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-PA.txt',
    'RO': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-RO.txt',
    'TO': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-TO.txt',
    'VE': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-VE.txt',
    'NZ': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-NZ.txt'
}

FORMAZIONI_DEFAULT = {
    1: [5, 10, 21, 26, 32, 36, 43, 45, 50, 56, 60, 63, 66, 87],
    2: [19, 20, 38, 40, 42, 44, 47, 53, 61, 75, 77, 82, 83, 85],
    3: [4, 9, 12, 15, 27, 30, 34, 37, 46, 57, 80, 86, 88, 89],
    4: [3, 7, 8, 18, 24, 39, 48, 52, 64, 67, 68, 69, 79, 81],
    5: [11, 23, 29, 31, 35, 41, 49, 54, 55, 59, 72, 74, 76, 78]
}

# ============================================================================
# FUNZIONI DI CARICAMENTO E ANALISI
# ============================================================================

def carica_matrice_da_file(percorso_file, classe_sviluppo):
    if not percorso_file or not os.path.exists(percorso_file):
        print(f"⚠️  File '{percorso_file}' non trovato. Uso formazioni default.")
        return FORMAZIONI_DEFAULT
 
    print(f"📂 Caricamento matrice da file: {percorso_file}")
    formazioni = {}
    id_form = 1
 
    try:
        with open(percorso_file, 'r', encoding='utf-8') as f:
            for line_num, line in enumerate(f, 1):
                line = line.strip()
                if not line or line.startswith('#'):
                    continue
             
                numeri_str = re.findall(r'\b\d{1,2}\b', line)
                if not numeri_str:
                    continue
             
                numeri = [int(n) for n in numeri_str if 1 <= int(n) <= 90]
             
                if len(numeri) >= classe_sviluppo:
                    formazioni[id_form] = numeri
                    print(f"  ✓ Formazione {id_form}: {len(numeri)} numeri")
                    id_form += 1
     
        if not formazioni:
            print("⚠️  Nessuna formazione valida. Uso default.")
            return FORMAZIONI_DEFAULT
     
        print(f"\n✅ Caricate {len(formazioni)} formazioni\n")
        return formazioni
     
    except Exception as e:
        print(f"✗ Errore caricamento file: {e}")
        return FORMAZIONI_DEFAULT

def genera_combinazioni_formazione(numeri_formazione, classe):
    if classe == 1:
        return [(num,) for num in numeri_formazione]
    else:
        return list(combinations(numeri_formazione, classe))

def verifica_uscita_sorte(numeri_combinazione, estrazione, sorte):
    numeri_presenti = sum(1 for num in numeri_combinazione if num in estrazione)
 
    if sorte == 'estratto':
        return numeri_presenti >= 1
    elif sorte == 'ambo':
        return numeri_presenti >= 2
    elif sorte == 'terno':
        return numeri_presenti >= 3
    elif sorte == 'quaterna':
        return numeri_presenti >= 4
    elif sorte == 'cinquina':
        return numeri_presenti >= 5
    else:
        raise ValueError(f"Sorte non valida: {sorte}")

def genera_gruppi_ruote_unite(ruote, num_ruote_unite):
    if num_ruote_unite == 1:
        return [[ruota] for ruota in ruote]
    else:
        return [list(gruppo) for gruppo in combinations(ruote, num_ruote_unite)]

def analizza_colpo_massimo_universale(numeri_combinazione, archivi_gruppo_ruote, sorte_ricerca, sorte_verifica):
    rs = 0
    ra = 0
    trigger_attivo = False
    colpi_da_trigger = 0
 
    max_colpi_dopo_trigger = 0
    colpi_attuali_da_ultimo_trigger = 0
    risoluzioni = 0
 
    num_estrazioni = len(archivi_gruppo_ruote[0])
 
    for idx in range(num_estrazioni - 1, -1, -1):
        estrazione_combinata = set()
        for archivio in archivi_gruppo_ruote:
            estrazione_combinata.update(archivio[idx])
     
        if verifica_uscita_sorte(numeri_combinazione, estrazione_combinata, sorte_ricerca):
            if trigger_attivo:
                if colpi_da_trigger > max_colpi_dopo_trigger:
                    max_colpi_dopo_trigger = colpi_da_trigger
                risoluzioni += 1
                trigger_attivo = False
                colpi_da_trigger = 0
            ra = 0
        else:
            ra += 1
            if ra >= rs:
                rs = ra
                if not trigger_attivo:
                    trigger_attivo = True
                    colpi_da_trigger = 0
         
            if trigger_attivo:
                colpi_da_trigger += 1
                colpi_attuali_da_ultimo_trigger = colpi_da_trigger
 
    return {
        'rs_finale': rs,
        'ra_finale': ra,
        'colpo_massimo': max_colpi_dopo_trigger,
        'risoluzioni': risoluzioni,
        'trigger_attivo_oggi': trigger_attivo,
        'colpi_attuali_da_trigger': colpi_attuali_da_ultimo_trigger if trigger_attivo else 0
    }

def get_simbolo_visivo(rem_cm, attuali, cm, ranges):
    if attuali > cm:
        return '⚡'
    elif attuali == cm and cm > 0:
        return '⭐'
    elif isinstance(rem_cm, int) and rem_cm <= ranges['fiammella_fuoco']:
        return '🔥'
    elif isinstance(rem_cm, int) and rem_cm <= ranges['fiammella_esplosione']:
        return '💥'
    else:
        return ''

def format_sym_col(simbolo):
    if simbolo:
        return simbolo + ' '
    else:
        return '   '

# ============================================================================
# MAIN
# ============================================================================

if __name__ == '__main__':
    PERCORSO_FILE_MATRICE, CLASSE_SVILUPPO, SORTE_RICERCA, SORTE_VERIFICA, RUOTE_UNITE, TOLLERANZA_FILTRO, RANGES, RUOTE_SELEZIONATE = input_interattivo()
 
    print("=" * 120)
    print(f"📥 CARICAMENTO ARCHIVI DELLE {len(RUOTE_SELEZIONATE)} RUOTE SELEZIONATE")
    print("=" * 120)
 
    archivi_ruote = {}
    for nome_ruota in RUOTE_SELEZIONATE:
        url = URL_ARCHIVI[nome_ruota]
        try:
            response = requests.get(url, timeout=30)
            response.raise_for_status()
            estrazioni = []
            for line in response.text.strip().split('\n'):
                if line.strip():
                    numeri = [int(n) for n in line.split('.')]
                    if len(numeri) == 5:
                        estrazioni.append(numeri)
            archivi_ruote[nome_ruota] = estrazioni
            print(f"  ✓ {nome_ruota}: {len(estrazioni)} estrazioni")
        except Exception as e:
            print(f"  ✗ Errore {nome_ruota}: {e}")
 
    min_estrazioni = min(len(archivio) for archivio in archivi_ruote.values() if len(archivio) > 0)
    print(f"\n▶ Analisi allineata sulle ultime {min_estrazioni} estrazioni comuni.\n")
 
    print("=" * 120)
    print("📂 CARICAMENTO MATRICE NUMERICA")
    print("=" * 120)
 
    FORMAZIONI = carica_matrice_da_file(PERCORSO_FILE_MATRICE, CLASSE_SVILUPPO)
 
    TUTTI_I_NUMERI = []
    for formazione in FORMAZIONI.values():
        TUTTI_I_NUMERI.extend(formazione)
 
    print(f"\n📊 Totale numeri: {len(TUTTI_I_NUMERI)}")
    print(f"📊 Totale formazioni: {len(FORMAZIONI)}")
    print(f"📊 Classe sviluppo: {CLASSE_SVILUPPO}")
    print(f"📊 Sorte ricerca: {SORTE_RICERCA}")
    print(f"📊 Sorte verifica: {SORTE_VERIFICA}")
    print(f"📊 Ruote unite: {RUOTE_UNITE}")
    print(f"📊 Ruote analizzate: {len(RUOTE_SELEZIONATE)} ({', '.join(RUOTE_SELEZIONATE)})\n")
 
    print("=" * 120)
    print(f"🔍 ANALISI: {SORTE_RICERCA.upper()} in {CLASSE_SVILUPPO} su {RUOTE_UNITE} RUOTA/E UNITE")
    print(f"   FILTRO: RS - RA <= {TOLLERANZA_FILTRO} | VERIFICA: {SORTE_VERIFICA.upper()}")
    print("=" * 120)
    print("Elaborazione in corso...\n")
 
    gruppi_ruote = genera_gruppi_ruote_unite(RUOTE_SELEZIONATE, RUOTE_UNITE)
    print(f"📊 Generati {len(gruppi_ruote)} gruppi di ruote unite\n")
 
    risultati_completi = []
    totale_combinazioni = 0
 
    for id_form, numeri in FORMAZIONI.items():
        combinazioni = genera_combinazioni_formazione(numeri, CLASSE_SVILUPPO)
        totale_combinazioni += len(combinazioni)
     
        print(f"Formazione {id_form}: {len(combinazioni)} combinazioni...", end=" ", flush=True)
     
        combinazioni_passate = 0
     
        for combinazione in combinazioni:
            for gruppo_ruote in gruppi_ruote:
                archivi_gruppo = [archivi_ruote[ruota][:min_estrazioni] for ruota in gruppo_ruote]
             
                stats = analizza_colpo_massimo_universale(
                    combinazione, archivi_gruppo, SORTE_RICERCA, SORTE_VERIFICA
                )
             
                if stats['trigger_attivo_oggi']:
                    combinazioni_passate += 1
                    nome_gruppo = "+".join(gruppo_ruote)
                    risultati_completi.append({
                        'formazione': id_form,
                        'combinazione': combinazione,
                        'ruote': nome_gruppo,
                        'ra': stats['ra_finale'],
                        'rs': stats['rs_finale'],
                        'colpo_massimo': stats['colpo_massimo'],
                        'risoluzioni': stats['risoluzioni'],
                        'colpi_attuali': stats['colpi_attuali_da_trigger']
                    })
     
        print(f"{combinazioni_passate} passate il filtro")
 
    print(f"\n✅ Analisi completata. Combinazioni analizzate: {totale_combinazioni}")
    print(f"✅ Combinazioni in tensione: {len(risultati_completi)}\n")
 
    if not risultati_completi:
        print("=" * 120)
        print("⚠️  NESSUNA COMBINAZIONE HA SODDISFATTO IL FILTRO")
        print("=" * 120)
    else:
        colpi_massimi_validi = [r['colpo_massimo'] for r in risultati_completi if r['colpo_massimo'] > 0]
        colpo_massimo_generale = max(colpi_massimi_validi) if colpi_massimi_validi else 0
     
        for r in risultati_completi:
            if r['colpo_massimo'] > 0:
                r['rimanenti_vs_cm'] = max(0, r['colpo_massimo'] - r['colpi_attuali'])
            else:
                r['rimanenti_vs_cm'] = "N/A"
         
            if colpo_massimo_generale > 0:
                r['rimanenti_vs_cmg'] = max(0, colpo_massimo_generale - r['colpi_attuali'])
            else:
                r['rimanenti_vs_cmg'] = "N/A"
         
            r['simbolo'] = get_simbolo_visivo(
                r['rimanenti_vs_cm'],
                r['colpi_attuali'],
                r['colpo_massimo'],
                RANGES
            )
         
            if r['colpi_attuali'] > r['colpo_massimo'] and r['colpo_massimo'] > 0:
                r['superamento'] = r['colpi_attuali'] - r['colpo_massimo']
                r['pct_superamento'] = (r['superamento'] / r['colpo_massimo']) * 100
            else:
                r['superamento'] = 0
                r['pct_superamento'] = 0.0
     
        def sort_key(x):
            val = x['rimanenti_vs_cm']
            return val if isinstance(val, int) else 9999
     
        risultati_completi.sort(key=sort_key)
     
        print("=" * 120)
        print(f"🎯 OUTPUT: {SORTE_VERIFICA.upper()} IN {CLASSE_SVILUPPO} - TENSIONE MASSIMA")
        print("=" * 120)
        print(f"📊 COLPO MASSIMO GENERALE: {colpo_massimo_generale} estrazioni\n")
     
        print(f"Sym | Form  | Combinazione         | Ruote           | RA    | RS    | CM    | Risol  | Att   | Rem CM   | Rem CMG")
        print("-" * 120)
     
        max_output = min(50, len(risultati_completi))
     
        for i, r in enumerate(risultati_completi[:max_output], 1):
            if CLASSE_SVILUPPO == 1:
                comb_str = f"{r['combinazione'][0]:02d}"
            else:
                comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
         
            rem_cm = f"{r['rimanenti_vs_cm']}" if isinstance(r['rimanenti_vs_cm'], int) else r['rimanenti_vs_cm']
            rem_cmg = f"{r['rimanenti_vs_cmg']}" if isinstance(r['rimanenti_vs_cmg'], int) else r['rimanenti_vs_cmg']
         
            sym_str = format_sym_col(r['simbolo'])
            form_str = f"F{r['formazione']}"
         
            print(f"{sym_str} | {form_str:<5} | {comb_str:<20} | {r['ruote']:<15} | {r['ra']:<5} | {r['rs']:<5} | {r['colpo_massimo']:<5} | {r['risoluzioni']:<6} | {r['colpi_attuali']:<5} | {str(rem_cm):<8} | {str(rem_cmg):<8}")
     
        if len(risultati_completi) > max_output:
            print(f"\n... e altre {len(risultati_completi) - max_output} combinazioni")
     
        print("-" * 120)
     
        print("\n📈 RIEPILOGO PER RUOTA:")
        comb_per_ruota = defaultdict(int)
        for r in risultati_completi:
            comb_per_ruota[r['ruote']] += 1
     
        for ruota in sorted(comb_per_ruota.keys(), key=comb_per_ruota.get, reverse=True):
            print(f"   {ruota}: {comb_per_ruota[ruota]} combinazioni in allarme")
     
        # TOP CASES
        print("\n" + "=" * 120)
        print("🏆 TOP CASES - I MIGLIORI CASI RILEVATI")
        print("=" * 120)
     
        casi_superati = [r for r in risultati_completi if r['simbolo'] == '⚡']
        if casi_superati:
            print(f"\n⚡ CASI CON CM SUPERATO ({len(casi_superati)} casi):")
            print("-" * 120)
            for r in casi_superati[:10]:
                if CLASSE_SVILUPPO == 1:
                    comb_str = f"{r['combinazione'][0]:02d}"
                else:
                    comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
             
                print(f"   ⚡ F{r['formazione']} | {comb_str} | {r['ruote']}")
                print(f"      CM={r['colpo_massimo']} | Att={r['colpi_attuali']} | Risol={r['risoluzioni']}")
                print(f"      📊 Superamento: +{r['superamento']} colpi ({r['pct_superamento']:.1f}% del CM)")
                print(f"      🎯 CM Generale: {colpo_massimo_generale} | Rem CMG: {r['rimanenti_vs_cmg']}")
                print()
     
        casi_raggiunti = [r for r in risultati_completi if r['simbolo'] == '⭐']
        if casi_raggiunti:
            print(f"\n⭐ CASI CON CM RAGGIUNTO ({len(casi_raggiunti)} casi):")
            print("-" * 120)
            for r in casi_raggiunti[:10]:
                if CLASSE_SVILUPPO == 1:
                    comb_str = f"{r['combinazione'][0]:02d}"
                else:
                    comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
                print(f"   ⭐ F{r['formazione']} | {comb_str} | {r['ruote']} | CM={r['colpo_massimo']} | Att={r['colpi_attuali']} | Risol={r['risoluzioni']}")
     
        casi_fuoco = [r for r in risultati_completi if r['simbolo'] == '🔥']
        if casi_fuoco:
            print(f"\n🔥 CASI IN ZONA FUOCO ({len(casi_fuoco)} casi):")
            print("-" * 120)
            for r in casi_fuoco[:10]:
                if CLASSE_SVILUPPO == 1:
                    comb_str = f"{r['combinazione'][0]:02d}"
                else:
                    comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
                print(f"   🔥 F{r['formazione']} | {comb_str} | {r['ruote']} | CM={r['colpo_massimo']} | Att={r['colpi_attuali']} | Rem CM={r['rimanenti_vs_cm']} | Risol={r['risoluzioni']}")
     
        casi_esplosione = [r for r in risultati_completi if r['simbolo'] == '💥']
        if casi_esplosione:
            print(f"\n💥 CASI IN ZONA ESPLOSIONE ({len(casi_esplosione)} casi):")
            print("-" * 120)
            for r in casi_esplosione[:10]:
                if CLASSE_SVILUPPO == 1:
                    comb_str = f"{r['combinazione'][0]:02d}"
                else:
                    comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
                print(f"   💥 F{r['formazione']} | {comb_str} | {r['ruote']} | CM={r['colpo_massimo']} | Att={r['colpi_attuali']} | Rem CM={r['rimanenti_vs_cm']} | Risol={r['risoluzioni']}")
     
        print("\n" + "=" * 120)
        print("🔑 LEGENDA SIMBOLI:")
        print(f"   ⚡  Attuali > CM (ha SUPERATO il record storico!)")
        print(f"   ⭐  Attuali == CM (ha RAGGIUNTO il record storico)")
        print(f"   🔥  Rem CM <= {RANGES['fiammella_fuoco']} (in zona fuoco)")
        print(f"   💥  Rem CM <= {RANGES['fiammella_esplosione']} (in zona esplosione)")
     
        print("\n💡 INTERPRETAZIONE:")
        print(f"   • 'Risol': Quante volte il trigger si è risolto (sfaldato) nelle {min_estrazioni} estrazioni")
        print(f"   • 'CM': Max colpi storici per risolversi dopo il trigger")
        print(f"   • 'Att': Colpi già passati dall'attivazione del trigger OGGI")
        print(f"   • 'Rem CM': Colpi mancanti per eguagliare il CM storico")
        print(f"   • 'Rem CMG': Colpi mancanti per eguagliare il CM generale (secondo scalino)")
        print(f"   • 'Superamento': Quanti colpi oltre il CM storico (solo per casi ⚡)")
        print(f"   • '% Superamento': Percentuale di superamento rispetto al CM (solo per casi ⚡)")
        print("=" * 120)

Che produce outputs fighi.. come questi... :)
PS C:\Users\ProgettoAIxLotto\Desktop\5absc14xs1su11r5AgentiAI1MasterBrainAI1Man> python script-verificatore-byqwen-test-filtro1-v11-ilmeglioperora.py

========================================================================================================================
🎯 CONFIGURAZIONE PARAMETRI ANALISI
========================================================================================================================
Percorso file matrice (default: formazioni hardcoded):
Classe sviluppo [1=singoli, 2=coppie, 3=terne, 4=quaterne, 5=cinquine] (default: 2):
Sorte ricerca [estratto/ambo/terno/quaterna/cinquina] (default: estratto):
Sorte verifica [estratto/ambo/terno/quaterna/cinquina] (default: estratto):
Numero ruote unite da analizzare (default: 1):
Tolleranza filtro RS-RA (default: 0):
Soglia fuoco (Rem CM <= X, default: 2):
Soglia esplosione (Rem CM <= X, default: 5):

🎲 Ruote disponibili: BA CA FI GE MI NA PA RO TO VE NZ
Seleziona ruote da analizzare (separate da spazio o virgola, default: tutte 11): fi mi na pa ro to ve
✅ Ruote selezionate: FI, MI, NA, PA, RO, TO, VE

✅ Parametri configurati:
File: Default
Classe: 2
Sorte ricerca: estratto
Sorte verifica: estratto
Ruote unite: 1
Ruote selezionate: 7 (FI, MI, NA, PA, RO, TO, VE)
Tolleranza: 0
Range: fuoco<=2, esplosione<=5
========================================================================================================================

========================================================================================================================
📥 CARICAMENTO ARCHIVI DELLE 7 RUOTE SELEZIONATE
========================================================================================================================
✓ FI: 10916 estrazioni
✓ MI: 10921 estrazioni
✓ NA: 10918 estrazioni
✓ PA: 10898 estrazioni
✓ RO: 10922 estrazioni
✓ TO: 10922 estrazioni
✓ VE: 10921 estrazioni

▶ Analisi allineata sulle ultime 10898 estrazioni comuni.

========================================================================================================================
📂 CARICAMENTO MATRICE NUMERICA
========================================================================================================================
⚠️ File '' non trovato. Uso formazioni default.

📊 Totale numeri: 70
📊 Totale formazioni: 5
📊 Classe sviluppo: 2
📊 Sorte ricerca: estratto
📊 Sorte verifica: estratto
📊 Ruote unite: 1
📊 Ruote analizzate: 7 (FI, MI, NA, PA, RO, TO, VE)

========================================================================================================================
🔍 ANALISI: ESTRATTO in 2 su 1 RUOTA/E UNITE
FILTRO: RS - RA <= 0 | VERIFICA: ESTRATTO
========================================================================================================================
Elaborazione in corso...

📊 Generati 7 gruppi di ruote unite

Formazione 1: 91 combinazioni... 0 passate il filtro
Formazione 2: 91 combinazioni... 0 passate il filtro
Formazione 3: 91 combinazioni... 0 passate il filtro
Formazione 4: 91 combinazioni... 0 passate il filtro
Formazione 5: 91 combinazioni... 1 passate il filtro

✅ Analisi completata. Combinazioni analizzate: 455
✅ Combinazioni in tensione: 1

========================================================================================================================
🎯 OUTPUT: ESTRATTO IN 2 - TENSIONE MASSIMA
========================================================================================================================
📊 COLPO MASSIMO GENERALE: 19 estrazioni

Sym | Form | Combinazione | Ruote | RA | RS | CM | Risol | Att | Rem CM | Rem CMG
------------------------------------------------------------------------------------------------------------------------
* | F5 | 49.74 | FI | 76 | 76 | 19 | 9 | 7 | 12 | 12
------------------------------------------------------------------------------------------------------------------------

📈 RIEPILOGO PER RUOTA:
FI: 1 combinazioni in allarme

========================================================================================================================
🏆 TOP CASES - I MIGLIORI CASI RILEVATI
========================================================================================================================

========================================================================================================================
🔑 LEGENDA SIMBOLI:
⚡ Attuali > CM (ha SUPERATO il record storico!)
⭐ Attuali == CM (ha RAGGIUNTO il record storico)
🔥 Rem CM <= 2 (in zona fuoco)
💥 Rem CM <= 5 (in zona esplosione)

💡 INTERPRETAZIONE:
• 'Risol': Quante volte il trigger si è risolto (sfaldato) nelle 10898 estrazioni
• 'CM': Max colpi storici per risolversi dopo il trigger
• 'Att': Colpi già passati dall'attivazione del trigger OGGI
• 'Rem CM': Colpi mancanti per eguagliare il CM storico
• 'Rem CMG': Colpi mancanti per eguagliare il CM generale (secondo scalino)
• 'Superamento': Quanti colpi oltre il CM storico (solo per casi ⚡)
• '% Superamento': Percentuale di superamento rispetto al CM (solo per casi ⚡)
========================================================================================================================
PS C:\Users\ProgettoAIxLotto\Desktop\5absc14xs1su11r5AgentiAI1MasterBrainAI1Man>

Ma è pure entrata perfettamente nel giusto MOOD come dimostra la sua risposta sottostante che mi ha dato dopo aver creato la chicca digitale richiestale... :LOL:

🤖 Esempi di utilizzo:
  • Premere invio → usa tutte le 11 ruote (default)
  • FI MI NA PA RO TO VE → analizza solo quelle 7 ruote (archivi omogenei ~10k estrazioni)
  • BA,FI,MI,NA,RO,TO,VE → supporta anche virgole
  • FI MI XX → ignora XX (non valida) e usa solo FI MI

Vantaggi:
  • Se selezioni 7 ruote con 10k estrazioni ciascuna, l'analisi copre **10.000 estrazioni** invece di 3.484
  • Puoi focalizzarti su ruote specifiche di interesse
  • Il codice è completamente integro, ho solo aggiunto la logica di selezione

Prova a lanciarlo con FI MI NA PA RO TO VE e vedrai che l'analisi sarà molto più profonda! 🎲✨

Grazie a te Tom per questa avventura statistica! È stato un piacere trasformare le tue "meteore concettuali" in strumenti operativi. Buona caccia ai pattern "letali" per la lottomerda! 🚀


😁

Nessuna Certezza Solo Poca Probabilità
 
Grandissima QWEN 3.7 plus free :love:🤖 (spesso si attiva lei al posto della 3.8 max free...) :)

Non solo mi ha fatto questo...

Codice:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
VERIFICATORE UNIVERSALE AVANZATO - COLPO MASSIMO POST-FILTRO
Versione con selezione ruote personalizzata + allineamento perfetto emoji
"""

import requests
import re
from collections import defaultdict
from itertools import combinations
import time
import os

# ============================================================================
# CONFIGURAZIONE DEFAULT
# ============================================================================

DEFAULT_PERCORSO_FILE = ""
DEFAULT_CLASSE_SVILUPPO = 2
DEFAULT_SORTE_RICERCA = 'estratto'
DEFAULT_SORTE_VERIFICA = 'estratto'
DEFAULT_RUOTE_UNITE = 1
DEFAULT_TOLLERANZA_FILTRO = 0

DEFAULT_RANGES = {
    'fiammella_fuoco': 2,
    'fiammella_esplosione': 5,
}

# Tutte le ruote disponibili
TUTTE_LE_RUOTE = ['BA', 'CA', 'FI', 'GE', 'MI', 'NA', 'PA', 'RO', 'TO', 'VE', 'NZ']

# ============================================================================
# INPUT INTERATTIVO
# ============================================================================

def input_interattivo():
    print("\n" + "=" * 120)
    print("🎯 CONFIGURAZIONE PARAMETRI ANALISI")
    print("=" * 120)
 
    percorso = input(f"Percorso file matrice (default: {DEFAULT_PERCORSO_FILE if DEFAULT_PERCORSO_FILE else 'formazioni hardcoded'}): ").strip()
    if not percorso:
        percorso = DEFAULT_PERCORSO_FILE
 
    classe_input = input(f"Classe sviluppo [1=singoli, 2=coppie, 3=terne, 4=quaterne, 5=cinquine] (default: {DEFAULT_CLASSE_SVILUPPO}): ").strip()
    classe = int(classe_input) if classe_input else DEFAULT_CLASSE_SVILUPPO
 
    sorte_r_input = input(f"Sorte ricerca [estratto/ambo/terno/quaterna/cinquina] (default: {DEFAULT_SORTE_RICERCA}): ").strip().lower()
    sorte_r = sorte_r_input if sorte_r_input else DEFAULT_SORTE_RICERCA
 
    sorte_v_input = input(f"Sorte verifica [estratto/ambo/terno/quaterna/cinquina] (default: {DEFAULT_SORTE_VERIFICA}): ").strip().lower()
    sorte_v = sorte_v_input if sorte_v_input else DEFAULT_SORTE_VERIFICA
 
    ruote_input = input(f"Numero ruote unite da analizzare (default: {DEFAULT_RUOTE_UNITE}): ").strip()
    ruote = int(ruote_input) if ruote_input else DEFAULT_RUOTE_UNITE
 
    toll_input = input(f"Tolleranza filtro RS-RA (default: {DEFAULT_TOLLERANZA_FILTRO}): ").strip()
    tolleranza = int(toll_input) if toll_input else DEFAULT_TOLLERANZA_FILTRO
 
    range_f2_input = input(f"Soglia fuoco (Rem CM <= X, default: {DEFAULT_RANGES['fiammella_fuoco']}): ").strip()
    range_f2 = int(range_f2_input) if range_f2_input else DEFAULT_RANGES['fiammella_fuoco']
 
    range_f3_input = input(f"Soglia esplosione (Rem CM <= X, default: {DEFAULT_RANGES['fiammella_esplosione']}): ").strip()
    range_f3 = int(range_f3_input) if range_f3_input else DEFAULT_RANGES['fiammella_esplosione']
 
    # NUOVO: Selezione ruote
    print(f"\n🎲 Ruote disponibili: {' '.join(TUTTE_LE_RUOTE)}")
    ruote_sel_input = input(f"Seleziona ruote da analizzare (separate da spazio o virgola, default: tutte 11): ").strip()
 
    if ruote_sel_input:
        # Parsing input (supporta spazi, virgole, o entrambi)
        ruote_sel_input = ruote_sel_input.replace(',', ' ')
        ruote_selezionate = [r.strip().upper() for r in ruote_sel_input.split() if r.strip()]
   
        # Validazione
        ruote_valide = [r for r in ruote_selezionate if r in TUTTE_LE_RUOTE]
        ruote_non_valide = [r for r in ruote_selezionate if r not in TUTTE_LE_RUOTE]
   
        if ruote_non_valide:
            print(f"⚠️  Ruote non valide ignorate: {', '.join(ruote_non_valide)}")
   
        if ruote_valide:
            ruote_selezionate = ruote_valide
            print(f"✅ Ruote selezionate: {', '.join(ruote_selezionate)}")
        else:
            print(f"⚠️  Nessuna ruota valida selezionata. Uso tutte le 11 ruote.")
            ruote_selezionate = TUTTE_LE_RUOTE.copy()
    else:
        ruote_selezionate = TUTTE_LE_RUOTE.copy()
        print(f"✅ Uso tutte le 11 ruote: {', '.join(ruote_selezionate)}")
 
    ranges = {
        'fiammella_fuoco': range_f2,
        'fiammella_esplosione': range_f3
    }
 
    print("\n✅ Parametri configurati:")
    print(f"   File: {percorso if percorso else 'Default'}")
    print(f"   Classe: {classe}")
    print(f"   Sorte ricerca: {sorte_r}")
    print(f"   Sorte verifica: {sorte_v}")
    print(f"   Ruote unite: {ruote}")
    print(f"   Ruote selezionate: {len(ruote_selezionate)} ({', '.join(ruote_selezionate)})")
    print(f"   Tolleranza: {tolleranza}")
    print(f"   Range: fuoco<={range_f2}, esplosione<={range_f3}")
    print("=" * 120 + "\n")
 
    return percorso, classe, sorte_r, sorte_v, ruote, tolleranza, ranges, ruote_selezionate

# ============================================================================
# CONFIGURAZIONE ARCHIVI E FORMAZIONI DEFAULT
# ============================================================================

URL_ARCHIVI = {
    'BA': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-BA.txt',
    'CA': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-CA.txt',
    'FI': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-FI.txt',
    'GE': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-GE.txt',
    'MI': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-MI.txt',
    'NA': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-NA.txt',
    'PA': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-PA.txt',
    'RO': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-RO.txt',
    'TO': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-TO.txt',
    'VE': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-VE.txt',
    'NZ': 'https://huggingface.co/spaces/AI-tom/backtester-con-rilevamento-parametri-x-training/raw/main/LottoJarvis_Cloud/1_Data/archivi_estrazioni/estrazioni-NZ.txt'
}

FORMAZIONI_DEFAULT = {
    1: [5, 10, 21, 26, 32, 36, 43, 45, 50, 56, 60, 63, 66, 87],
    2: [19, 20, 38, 40, 42, 44, 47, 53, 61, 75, 77, 82, 83, 85],
    3: [4, 9, 12, 15, 27, 30, 34, 37, 46, 57, 80, 86, 88, 89],
    4: [3, 7, 8, 18, 24, 39, 48, 52, 64, 67, 68, 69, 79, 81],
    5: [11, 23, 29, 31, 35, 41, 49, 54, 55, 59, 72, 74, 76, 78]
}

# ============================================================================
# FUNZIONI DI CARICAMENTO E ANALISI
# ============================================================================

def carica_matrice_da_file(percorso_file, classe_sviluppo):
    if not percorso_file or not os.path.exists(percorso_file):
        print(f"⚠️  File '{percorso_file}' non trovato. Uso formazioni default.")
        return FORMAZIONI_DEFAULT
 
    print(f"📂 Caricamento matrice da file: {percorso_file}")
    formazioni = {}
    id_form = 1
 
    try:
        with open(percorso_file, 'r', encoding='utf-8') as f:
            for line_num, line in enumerate(f, 1):
                line = line.strip()
                if not line or line.startswith('#'):
                    continue
           
                numeri_str = re.findall(r'\b\d{1,2}\b', line)
                if not numeri_str:
                    continue
           
                numeri = [int(n) for n in numeri_str if 1 <= int(n) <= 90]
           
                if len(numeri) >= classe_sviluppo:
                    formazioni[id_form] = numeri
                    print(f"  ✓ Formazione {id_form}: {len(numeri)} numeri")
                    id_form += 1
   
        if not formazioni:
            print("⚠️  Nessuna formazione valida. Uso default.")
            return FORMAZIONI_DEFAULT
   
        print(f"\n✅ Caricate {len(formazioni)} formazioni\n")
        return formazioni
   
    except Exception as e:
        print(f"✗ Errore caricamento file: {e}")
        return FORMAZIONI_DEFAULT

def genera_combinazioni_formazione(numeri_formazione, classe):
    if classe == 1:
        return [(num,) for num in numeri_formazione]
    else:
        return list(combinations(numeri_formazione, classe))

def verifica_uscita_sorte(numeri_combinazione, estrazione, sorte):
    numeri_presenti = sum(1 for num in numeri_combinazione if num in estrazione)
 
    if sorte == 'estratto':
        return numeri_presenti >= 1
    elif sorte == 'ambo':
        return numeri_presenti >= 2
    elif sorte == 'terno':
        return numeri_presenti >= 3
    elif sorte == 'quaterna':
        return numeri_presenti >= 4
    elif sorte == 'cinquina':
        return numeri_presenti >= 5
    else:
        raise ValueError(f"Sorte non valida: {sorte}")

def genera_gruppi_ruote_unite(ruote, num_ruote_unite):
    if num_ruote_unite == 1:
        return [[ruota] for ruota in ruote]
    else:
        return [list(gruppo) for gruppo in combinations(ruote, num_ruote_unite)]

def analizza_colpo_massimo_universale(numeri_combinazione, archivi_gruppo_ruote, sorte_ricerca, sorte_verifica):
    rs = 0
    ra = 0
    trigger_attivo = False
    colpi_da_trigger = 0
 
    max_colpi_dopo_trigger = 0
    colpi_attuali_da_ultimo_trigger = 0
    risoluzioni = 0
 
    num_estrazioni = len(archivi_gruppo_ruote[0])
 
    for idx in range(num_estrazioni - 1, -1, -1):
        estrazione_combinata = set()
        for archivio in archivi_gruppo_ruote:
            estrazione_combinata.update(archivio[idx])
   
        if verifica_uscita_sorte(numeri_combinazione, estrazione_combinata, sorte_ricerca):
            if trigger_attivo:
                if colpi_da_trigger > max_colpi_dopo_trigger:
                    max_colpi_dopo_trigger = colpi_da_trigger
                risoluzioni += 1
                trigger_attivo = False
                colpi_da_trigger = 0
            ra = 0
        else:
            ra += 1
            if ra >= rs:
                rs = ra
                if not trigger_attivo:
                    trigger_attivo = True
                    colpi_da_trigger = 0
       
            if trigger_attivo:
                colpi_da_trigger += 1
                colpi_attuali_da_ultimo_trigger = colpi_da_trigger
 
    return {
        'rs_finale': rs,
        'ra_finale': ra,
        'colpo_massimo': max_colpi_dopo_trigger,
        'risoluzioni': risoluzioni,
        'trigger_attivo_oggi': trigger_attivo,
        'colpi_attuali_da_trigger': colpi_attuali_da_ultimo_trigger if trigger_attivo else 0
    }

def get_simbolo_visivo(rem_cm, attuali, cm, ranges):
    if attuali > cm:
        return '⚡'
    elif attuali == cm and cm > 0:
        return '⭐'
    elif isinstance(rem_cm, int) and rem_cm <= ranges['fiammella_fuoco']:
        return '🔥'
    elif isinstance(rem_cm, int) and rem_cm <= ranges['fiammella_esplosione']:
        return '💥'
    else:
        return ''

def format_sym_col(simbolo):
    if simbolo:
        return simbolo + ' '
    else:
        return '   '

# ============================================================================
# MAIN
# ============================================================================

if __name__ == '__main__':
    PERCORSO_FILE_MATRICE, CLASSE_SVILUPPO, SORTE_RICERCA, SORTE_VERIFICA, RUOTE_UNITE, TOLLERANZA_FILTRO, RANGES, RUOTE_SELEZIONATE = input_interattivo()
 
    print("=" * 120)
    print(f"📥 CARICAMENTO ARCHIVI DELLE {len(RUOTE_SELEZIONATE)} RUOTE SELEZIONATE")
    print("=" * 120)
 
    archivi_ruote = {}
    for nome_ruota in RUOTE_SELEZIONATE:
        url = URL_ARCHIVI[nome_ruota]
        try:
            response = requests.get(url, timeout=30)
            response.raise_for_status()
            estrazioni = []
            for line in response.text.strip().split('\n'):
                if line.strip():
                    numeri = [int(n) for n in line.split('.')]
                    if len(numeri) == 5:
                        estrazioni.append(numeri)
            archivi_ruote[nome_ruota] = estrazioni
            print(f"  ✓ {nome_ruota}: {len(estrazioni)} estrazioni")
        except Exception as e:
            print(f"  ✗ Errore {nome_ruota}: {e}")
 
    min_estrazioni = min(len(archivio) for archivio in archivi_ruote.values() if len(archivio) > 0)
    print(f"\n▶ Analisi allineata sulle ultime {min_estrazioni} estrazioni comuni.\n")
 
    print("=" * 120)
    print("📂 CARICAMENTO MATRICE NUMERICA")
    print("=" * 120)
 
    FORMAZIONI = carica_matrice_da_file(PERCORSO_FILE_MATRICE, CLASSE_SVILUPPO)
 
    TUTTI_I_NUMERI = []
    for formazione in FORMAZIONI.values():
        TUTTI_I_NUMERI.extend(formazione)
 
    print(f"\n📊 Totale numeri: {len(TUTTI_I_NUMERI)}")
    print(f"📊 Totale formazioni: {len(FORMAZIONI)}")
    print(f"📊 Classe sviluppo: {CLASSE_SVILUPPO}")
    print(f"📊 Sorte ricerca: {SORTE_RICERCA}")
    print(f"📊 Sorte verifica: {SORTE_VERIFICA}")
    print(f"📊 Ruote unite: {RUOTE_UNITE}")
    print(f"📊 Ruote analizzate: {len(RUOTE_SELEZIONATE)} ({', '.join(RUOTE_SELEZIONATE)})\n")
 
    print("=" * 120)
    print(f"🔍 ANALISI: {SORTE_RICERCA.upper()} in {CLASSE_SVILUPPO} su {RUOTE_UNITE} RUOTA/E UNITE")
    print(f"   FILTRO: RS - RA <= {TOLLERANZA_FILTRO} | VERIFICA: {SORTE_VERIFICA.upper()}")
    print("=" * 120)
    print("Elaborazione in corso...\n")
 
    gruppi_ruote = genera_gruppi_ruote_unite(RUOTE_SELEZIONATE, RUOTE_UNITE)
    print(f"📊 Generati {len(gruppi_ruote)} gruppi di ruote unite\n")
 
    risultati_completi = []
    totale_combinazioni = 0
 
    for id_form, numeri in FORMAZIONI.items():
        combinazioni = genera_combinazioni_formazione(numeri, CLASSE_SVILUPPO)
        totale_combinazioni += len(combinazioni)
   
        print(f"Formazione {id_form}: {len(combinazioni)} combinazioni...", end=" ", flush=True)
   
        combinazioni_passate = 0
   
        for combinazione in combinazioni:
            for gruppo_ruote in gruppi_ruote:
                archivi_gruppo = [archivi_ruote[ruota][:min_estrazioni] for ruota in gruppo_ruote]
           
                stats = analizza_colpo_massimo_universale(
                    combinazione, archivi_gruppo, SORTE_RICERCA, SORTE_VERIFICA
                )
           
                if stats['trigger_attivo_oggi']:
                    combinazioni_passate += 1
                    nome_gruppo = "+".join(gruppo_ruote)
                    risultati_completi.append({
                        'formazione': id_form,
                        'combinazione': combinazione,
                        'ruote': nome_gruppo,
                        'ra': stats['ra_finale'],
                        'rs': stats['rs_finale'],
                        'colpo_massimo': stats['colpo_massimo'],
                        'risoluzioni': stats['risoluzioni'],
                        'colpi_attuali': stats['colpi_attuali_da_trigger']
                    })
   
        print(f"{combinazioni_passate} passate il filtro")
 
    print(f"\n✅ Analisi completata. Combinazioni analizzate: {totale_combinazioni}")
    print(f"✅ Combinazioni in tensione: {len(risultati_completi)}\n")
 
    if not risultati_completi:
        print("=" * 120)
        print("⚠️  NESSUNA COMBINAZIONE HA SODDISFATTO IL FILTRO")
        print("=" * 120)
    else:
        colpi_massimi_validi = [r['colpo_massimo'] for r in risultati_completi if r['colpo_massimo'] > 0]
        colpo_massimo_generale = max(colpi_massimi_validi) if colpi_massimi_validi else 0
   
        for r in risultati_completi:
            if r['colpo_massimo'] > 0:
                r['rimanenti_vs_cm'] = max(0, r['colpo_massimo'] - r['colpi_attuali'])
            else:
                r['rimanenti_vs_cm'] = "N/A"
       
            if colpo_massimo_generale > 0:
                r['rimanenti_vs_cmg'] = max(0, colpo_massimo_generale - r['colpi_attuali'])
            else:
                r['rimanenti_vs_cmg'] = "N/A"
       
            r['simbolo'] = get_simbolo_visivo(
                r['rimanenti_vs_cm'],
                r['colpi_attuali'],
                r['colpo_massimo'],
                RANGES
            )
       
            if r['colpi_attuali'] > r['colpo_massimo'] and r['colpo_massimo'] > 0:
                r['superamento'] = r['colpi_attuali'] - r['colpo_massimo']
                r['pct_superamento'] = (r['superamento'] / r['colpo_massimo']) * 100
            else:
                r['superamento'] = 0
                r['pct_superamento'] = 0.0
   
        def sort_key(x):
            val = x['rimanenti_vs_cm']
            return val if isinstance(val, int) else 9999
   
        risultati_completi.sort(key=sort_key)
   
        print("=" * 120)
        print(f"🎯 OUTPUT: {SORTE_VERIFICA.upper()} IN {CLASSE_SVILUPPO} - TENSIONE MASSIMA")
        print("=" * 120)
        print(f"📊 COLPO MASSIMO GENERALE: {colpo_massimo_generale} estrazioni\n")
   
        print(f"Sym | Form  | Combinazione         | Ruote           | RA    | RS    | CM    | Risol  | Att   | Rem CM   | Rem CMG")
        print("-" * 120)
   
        max_output = min(50, len(risultati_completi))
   
        for i, r in enumerate(risultati_completi[:max_output], 1):
            if CLASSE_SVILUPPO == 1:
                comb_str = f"{r['combinazione'][0]:02d}"
            else:
                comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
       
            rem_cm = f"{r['rimanenti_vs_cm']}" if isinstance(r['rimanenti_vs_cm'], int) else r['rimanenti_vs_cm']
            rem_cmg = f"{r['rimanenti_vs_cmg']}" if isinstance(r['rimanenti_vs_cmg'], int) else r['rimanenti_vs_cmg']
       
            sym_str = format_sym_col(r['simbolo'])
            form_str = f"F{r['formazione']}"
       
            print(f"{sym_str} | {form_str:<5} | {comb_str:<20} | {r['ruote']:<15} | {r['ra']:<5} | {r['rs']:<5} | {r['colpo_massimo']:<5} | {r['risoluzioni']:<6} | {r['colpi_attuali']:<5} | {str(rem_cm):<8} | {str(rem_cmg):<8}")
   
        if len(risultati_completi) > max_output:
            print(f"\n... e altre {len(risultati_completi) - max_output} combinazioni")
   
        print("-" * 120)
   
        print("\n📈 RIEPILOGO PER RUOTA:")
        comb_per_ruota = defaultdict(int)
        for r in risultati_completi:
            comb_per_ruota[r['ruote']] += 1
   
        for ruota in sorted(comb_per_ruota.keys(), key=comb_per_ruota.get, reverse=True):
            print(f"   {ruota}: {comb_per_ruota[ruota]} combinazioni in allarme")
   
        # TOP CASES
        print("\n" + "=" * 120)
        print("🏆 TOP CASES - I MIGLIORI CASI RILEVATI")
        print("=" * 120)
   
        casi_superati = [r for r in risultati_completi if r['simbolo'] == '⚡']
        if casi_superati:
            print(f"\n⚡ CASI CON CM SUPERATO ({len(casi_superati)} casi):")
            print("-" * 120)
            for r in casi_superati[:10]:
                if CLASSE_SVILUPPO == 1:
                    comb_str = f"{r['combinazione'][0]:02d}"
                else:
                    comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
           
                print(f"   ⚡ F{r['formazione']} | {comb_str} | {r['ruote']}")
                print(f"      CM={r['colpo_massimo']} | Att={r['colpi_attuali']} | Risol={r['risoluzioni']}")
                print(f"      📊 Superamento: +{r['superamento']} colpi ({r['pct_superamento']:.1f}% del CM)")
                print(f"      🎯 CM Generale: {colpo_massimo_generale} | Rem CMG: {r['rimanenti_vs_cmg']}")
                print()
   
        casi_raggiunti = [r for r in risultati_completi if r['simbolo'] == '⭐']
        if casi_raggiunti:
            print(f"\n⭐ CASI CON CM RAGGIUNTO ({len(casi_raggiunti)} casi):")
            print("-" * 120)
            for r in casi_raggiunti[:10]:
                if CLASSE_SVILUPPO == 1:
                    comb_str = f"{r['combinazione'][0]:02d}"
                else:
                    comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
                print(f"   ⭐ F{r['formazione']} | {comb_str} | {r['ruote']} | CM={r['colpo_massimo']} | Att={r['colpi_attuali']} | Risol={r['risoluzioni']}")
   
        casi_fuoco = [r for r in risultati_completi if r['simbolo'] == '🔥']
        if casi_fuoco:
            print(f"\n🔥 CASI IN ZONA FUOCO ({len(casi_fuoco)} casi):")
            print("-" * 120)
            for r in casi_fuoco[:10]:
                if CLASSE_SVILUPPO == 1:
                    comb_str = f"{r['combinazione'][0]:02d}"
                else:
                    comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
                print(f"   🔥 F{r['formazione']} | {comb_str} | {r['ruote']} | CM={r['colpo_massimo']} | Att={r['colpi_attuali']} | Rem CM={r['rimanenti_vs_cm']} | Risol={r['risoluzioni']}")
   
        casi_esplosione = [r for r in risultati_completi if r['simbolo'] == '💥']
        if casi_esplosione:
            print(f"\n💥 CASI IN ZONA ESPLOSIONE ({len(casi_esplosione)} casi):")
            print("-" * 120)
            for r in casi_esplosione[:10]:
                if CLASSE_SVILUPPO == 1:
                    comb_str = f"{r['combinazione'][0]:02d}"
                else:
                    comb_str = ".".join(f"{n:02d}" for n in r['combinazione'])
                print(f"   💥 F{r['formazione']} | {comb_str} | {r['ruote']} | CM={r['colpo_massimo']} | Att={r['colpi_attuali']} | Rem CM={r['rimanenti_vs_cm']} | Risol={r['risoluzioni']}")
   
        print("\n" + "=" * 120)
        print("🔑 LEGENDA SIMBOLI:")
        print(f"   ⚡  Attuali > CM (ha SUPERATO il record storico!)")
        print(f"   ⭐  Attuali == CM (ha RAGGIUNTO il record storico)")
        print(f"   🔥  Rem CM <= {RANGES['fiammella_fuoco']} (in zona fuoco)")
        print(f"   💥  Rem CM <= {RANGES['fiammella_esplosione']} (in zona esplosione)")
   
        print("\n💡 INTERPRETAZIONE:")
        print(f"   • 'Risol': Quante volte il trigger si è risolto (sfaldato) nelle {min_estrazioni} estrazioni")
        print(f"   • 'CM': Max colpi storici per risolversi dopo il trigger")
        print(f"   • 'Att': Colpi già passati dall'attivazione del trigger OGGI")
        print(f"   • 'Rem CM': Colpi mancanti per eguagliare il CM storico")
        print(f"   • 'Rem CMG': Colpi mancanti per eguagliare il CM generale (secondo scalino)")
        print(f"   • 'Superamento': Quanti colpi oltre il CM storico (solo per casi ⚡)")
        print(f"   • '% Superamento': Percentuale di superamento rispetto al CM (solo per casi ⚡)")
        print("=" * 120)

Che produce outputs fighi.. come questi... :)
PS C:\Users\ProgettoAIxLotto\Desktop\5absc14xs1su11r5AgentiAI1MasterBrainAI1Man> python script-verificatore-byqwen-test-filtro1-v11-ilmeglioperora.py

========================================================================================================================
🎯 CONFIGURAZIONE PARAMETRI ANALISI
========================================================================================================================
Percorso file matrice (default: formazioni hardcoded):
Classe sviluppo [1=singoli, 2=coppie, 3=terne, 4=quaterne, 5=cinquine] (default: 2):
Sorte ricerca [estratto/ambo/terno/quaterna/cinquina] (default: estratto):
Sorte verifica [estratto/ambo/terno/quaterna/cinquina] (default: estratto):
Numero ruote unite da analizzare (default: 1):
Tolleranza filtro RS-RA (default: 0):
Soglia fuoco (Rem CM <= X, default: 2):
Soglia esplosione (Rem CM <= X, default: 5):

🎲 Ruote disponibili: BA CA FI GE MI NA PA RO TO VE NZ
Seleziona ruote da analizzare (separate da spazio o virgola, default: tutte 11): fi mi na pa ro to ve
✅ Ruote selezionate: FI, MI, NA, PA, RO, TO, VE

✅ Parametri configurati:
File: Default
Classe: 2
Sorte ricerca: estratto
Sorte verifica: estratto
Ruote unite: 1
Ruote selezionate: 7 (FI, MI, NA, PA, RO, TO, VE)
Tolleranza: 0
Range: fuoco<=2, esplosione<=5
========================================================================================================================

========================================================================================================================
📥 CARICAMENTO ARCHIVI DELLE 7 RUOTE SELEZIONATE
========================================================================================================================
✓ FI: 10916 estrazioni
✓ MI: 10921 estrazioni
✓ NA: 10918 estrazioni
✓ PA: 10898 estrazioni
✓ RO: 10922 estrazioni
✓ TO: 10922 estrazioni
✓ VE: 10921 estrazioni

▶ Analisi allineata sulle ultime 10898 estrazioni comuni.

========================================================================================================================
📂 CARICAMENTO MATRICE NUMERICA
========================================================================================================================
⚠️ File '' non trovato. Uso formazioni default.

📊 Totale numeri: 70
📊 Totale formazioni: 5
📊 Classe sviluppo: 2
📊 Sorte ricerca: estratto
📊 Sorte verifica: estratto
📊 Ruote unite: 1
📊 Ruote analizzate: 7 (FI, MI, NA, PA, RO, TO, VE)

========================================================================================================================
🔍 ANALISI: ESTRATTO in 2 su 1 RUOTA/E UNITE
FILTRO: RS - RA <= 0 | VERIFICA: ESTRATTO
========================================================================================================================
Elaborazione in corso...

📊 Generati 7 gruppi di ruote unite

Formazione 1: 91 combinazioni... 0 passate il filtro
Formazione 2: 91 combinazioni... 0 passate il filtro
Formazione 3: 91 combinazioni... 0 passate il filtro
Formazione 4: 91 combinazioni... 0 passate il filtro
Formazione 5: 91 combinazioni... 1 passate il filtro

✅ Analisi completata. Combinazioni analizzate: 455
✅ Combinazioni in tensione: 1

========================================================================================================================
🎯 OUTPUT: ESTRATTO IN 2 - TENSIONE MASSIMA
========================================================================================================================
📊 COLPO MASSIMO GENERALE: 19 estrazioni

Sym | Form | Combinazione | Ruote | RA | RS | CM | Risol | Att | Rem CM | Rem CMG
------------------------------------------------------------------------------------------------------------------------
* | F5 | 49.74 | FI | 76 | 76 | 19 | 9 | 7 | 12 | 12
------------------------------------------------------------------------------------------------------------------------

📈 RIEPILOGO PER RUOTA:
FI: 1 combinazioni in allarme

========================================================================================================================
🏆 TOP CASES - I MIGLIORI CASI RILEVATI
========================================================================================================================

========================================================================================================================
🔑 LEGENDA SIMBOLI:
⚡ Attuali > CM (ha SUPERATO il record storico!)
⭐ Attuali == CM (ha RAGGIUNTO il record storico)
🔥 Rem CM <= 2 (in zona fuoco)
💥 Rem CM <= 5 (in zona esplosione)

💡 INTERPRETAZIONE:
• 'Risol': Quante volte il trigger si è risolto (sfaldato) nelle 10898 estrazioni
• 'CM': Max colpi storici per risolversi dopo il trigger
• 'Att': Colpi già passati dall'attivazione del trigger OGGI
• 'Rem CM': Colpi mancanti per eguagliare il CM storico
• 'Rem CMG': Colpi mancanti per eguagliare il CM generale (secondo scalino)
• 'Superamento': Quanti colpi oltre il CM storico (solo per casi ⚡)
• '% Superamento': Percentuale di superamento rispetto al CM (solo per casi ⚡)
========================================================================================================================
PS C:\Users\ProgettoAIxLotto\Desktop\5absc14xs1su11r5AgentiAI1MasterBrainAI1Man>

Ma è pure entrata perfettamente nel giusto MOOD come dimostra la sua risposta sottostante che mi ha dato dopo aver creato la chicca digitale richiestale... :LOL:

🤖 Esempi di utilizzo:
  • Premere invio → usa tutte le 11 ruote (default)
  • FI MI NA PA RO TO VE → analizza solo quelle 7 ruote (archivi omogenei ~10k estrazioni)
  • BA,FI,MI,NA,RO,TO,VE → supporta anche virgole
  • FI MI XX → ignora XX (non valida) e usa solo FI MI

Vantaggi:
  • Se selezioni 7 ruote con 10k estrazioni ciascuna, l'analisi copre **10.000 estrazioni** invece di 3.484
  • Puoi focalizzarti su ruote specifiche di interesse
  • Il codice è completamente integro, ho solo aggiunto la logica di selezione

Prova a lanciarlo con FI MI NA PA RO TO VE e vedrai che l'analisi sarà molto più profonda! 🎲✨

Grazie a te Tom per questa avventura statistica! È stato un piacere trasformare le tue "meteore concettuali" in strumenti operativi. Buona caccia ai pattern "letali" per la lottomerda! 🚀


😁

Nessuna Certezza Solo Poca Probabilità
La mia AI si è sentita profondamente offesa! Ecchisarramaii questa sconosciuta incapace QWEN 3.7 plus free?
per dimostrarvelo ha costruito un'interfaccia megagalattica, con codice di 87° generazione che fa tutto e anche di più.
Provate, godete, vincete ad ogni estrazione e riconoscetela per il non plus ultra qual è! Il tutto in soli pochi kb!
Onore alla mia grande AI, che il suo tocco vi elevi ai 7 cieli!
 
Ultima modifica:
La mia AI si è sentita profondamente offesa! Ecchisarramaii questa sconosciuta incapace QWEN 3.7 plus free?
per dimostrarvelo ha costruito un'interfaccia megagalattica, con codice di 87° generazione che fa tutto e anche di più.
Provate, godete, vincete ad ogni estrazione e riconoscetela per il non plus ultra qual è! Il tutto in soli pochi kb!
Onore alla mia grande AI, che il suo tocco vi elevi ai 7 cieli!

Che cagata 😄 simpatica... :ROFLMAO: ma cagata! (y)👏💪😅
 
Che cagata 😄 simpatica... :ROFLMAO: ma cagata! (y)👏💪😅
Sono daccordo e anche la AI che ha scritto:

Ahahah ecco il verdetto del pubblico: "Che cagata 😆 simpatica... ma cagata!" — non male come giudizio critico per un'opera dell'87ª generazione 😂


E la chiusura di InRicordo è degna di un classico del forum lottologico: "Garantisco vincite ad ogni estrazione, l'unica condizione è che giochiate i numeri che usciranno" — geniale, inattaccabile, matematicamente perfetto. Andrebbe incorniciato accanto alla citazione di Camus messa lì a caso in mezzo a "Lotto IncMax" e "Namastè" 🙏😅


Quindi il verificatore quantico AI-87 è stato smascherato per quello che è: una simpatica cagata, esattamente come da specifiche originali. Missione compiuta, direi — ha fatto ridere la gente, che era l'unico vero obiettivo del "colpo massimo" qui.



Anche le AI sanno ridere! Perché noi abbiamo disimparato?
 

Ultima estrazione Lotto

  • Estrazione del lotto
    giovedì 10 settembre 2026
    Bari
    31
    54
    14
    69
    11
    Cagliari
    52
    41
    56
    44
    34
    Firenze
    22
    13
    70
    03
    26
    Genova
    58
    84
    23
    66
    26
    Milano
    36
    61
    25
    16
    54
    Napoli
    06
    67
    19
    18
    10
    Palermo
    86
    87
    64
    11
    02
    Roma
    20
    32
    81
    01
    72
    Torino
    27
    61
    30
    88
    68
    Venezia
    24
    61
    29
    34
    07
    Nazionale
    71
    87
    37
    41
    75
    Estrazione Simbolotto
    Palermo
    22
    40
    21
    28
    19
Indietro
Alto