Novità

Intelligenza artificiale e lotto 🤖🎱📈📉🎯

Non mi sono riuscito a spiegare pazienza :)

Ad ogni modo non posso non incorniciare a riprova della mia tesi... (anche se al 99% si tratterà forse solo di un particolarissimo caso...) questo evento.. risultante da uno dei numerosi virtual test con dataset aggiornato al 30/1/2025...


sicuramenteesolouncasomalodevocomunqueincorniciare.jpg

Anche da questo "assurdo..." ma bellissimo.. evento si evince il fatto che generalmente più piccolo è il dataset è più performante è la predizione... di qualunque forma e derivazione si tratti... :) ps: provate la funzione "con ragionamento" di chatgpt free (è una 💣)
 
Ultima modifica:
Non mi sono riuscito a spiegare pazienza :)

Ad ogni modo non posso non incorniciare a riprova della mia tesi... (anche se al 99% si tratterà forse solo di un particolarissimo caso...) questo evento.. risultante da uno dei numerosi virtual test con dataset aggiornato al 30/1/2025...


Vedi l'allegato 2296958

Anche da questo "assurdo..." ma bellissimo.. evento si evince il fatto che generalmente più piccolo è il dataset è più performante è la predizione... di qualunque forma e derivazione si tratti... :) ps: provate la funzione "con ragionamento" di chatgpt free (è una 💣)
certo, come dicevo prima i dataset piccoli sono maggiormente indicativi dell'attuale realtà estrattiva. e il tuo Test conferma la regola. ottimo.
 
19.26.38.40.42.44.64.69.82.83.85 r: PA.VE p: II.IV.V rap=rsp 90 num. inc 8 incmax att=sto 9 fqp 834 s 2. <<
19.26.38.40.42.64.69.77.82.83.85 r: PA.VE p: II.IV.V rap=rsp 90 num. inc 8 incmax att=sto 8 fqp 856 s 2. <<
19.38.40.44.64.66.69.77.82.83.85 r: BA.PA p: I.II.IV rap=rsp 77 num. inc 8 incmax att=sto 8 fqp 882 s 2. <<

guc13 : 19-26-38-40-42-44-64-66-69-77-82-83-85

dal 1871 al 1/2/2025 analisi su ruote separate (PA ha ra max unico e pari a 12)
Numeri;Ruota;Sorte;Ritardo;RitMax;IncrRitMax;Frequenza;Presenze;IndConv;RP1;RP2;RP3;Posizioni;Inizio;Fine;
19-26-38-40-42-44-64-66-69-77-82-83-85;BA;Ambo;0;46;0;2054;1585;0;0;4;14;1-2-3-4-5;1;10590;
19-26-38-40-42-44-64-66-69-77-82-83-85;PA;Ambo;12;38;0;2162;1654;2,4;0;7;3;1-2-3-4-5;1;10590;
19-26-38-40-42-44-64-66-69-77-82-83-85;VE;Ambo;2;47;0;2100;1590;0,4;4;11;2;1-2-3-4-5;1;10590;


PA 66-82 by googlenotebook lm dopo che ha analizzato gli ultimi 100 sfaldamenti di almeno ambo del relativo guc13 su BAPAVE stabilendo che i due elementi scelti in oggetto sono i più frequenti in molteplici configurazioni e che la ruota presente in tutte e tre le soluzioni incmaxp potrebbe essere la favorita.

colpi teorici: 1

nop: risultanze incmaxp by cinque c14absxs1suTTeNZby1871guc70 analizzate in c2 x s1 su 2r unite da 1 a 5p unite by 1871 -> 10 risultanze in 46min -> guc14 -> sviluppo del guc14 in c11 x s2 su 2r unite da 2 a 5p unite by 1871 -> scelta di quelle con max p unite (3p unite) e fqp >= 800) ; FQP sembra essere secondo ai l'elemento scrematore determinante in caso di molteplici risultanze. Più alto è meglio è. Di seguito dovrebbe esserci il valore incmax att=sto (più alto è meglio è) e il numero di incrementi (+ alto è meglio è).


Nessuna Certezza Solo Poca Probabilità
 
19.26.38.40.42.44.64.69.82.83.85 r: PA.VE p: II.IV.V rap=rsp 90 num. inc 8 incmax att=sto 9 fqp 834 s 2. <<
19.26.38.40.42.64.69.77.82.83.85 r: PA.VE p: II.IV.V rap=rsp 90 num. inc 8 incmax att=sto 8 fqp 856 s 2. <<
19.38.40.44.64.66.69.77.82.83.85 r: BA.PA p: I.II.IV rap=rsp 77 num. inc 8 incmax att=sto 8 fqp 882 s 2. <<

guc13 : 19-26-38-40-42-44-64-66-69-77-82-83-85

dal 1871 al 1/2/2025 analisi su ruote separate (PA ha ra max unico e pari a 12)
Numeri;Ruota;Sorte;Ritardo;RitMax;IncrRitMax;Frequenza;Presenze;IndConv;RP1;RP2;RP3;Posizioni;Inizio;Fine;
19-26-38-40-42-44-64-66-69-77-82-83-85;BA;Ambo;0;46;0;2054;1585;0;0;4;14;1-2-3-4-5;1;10590;
19-26-38-40-42-44-64-66-69-77-82-83-85;PA;Ambo;12;38;0;2162;1654;2,4;0;7;3;1-2-3-4-5;1;10590;
19-26-38-40-42-44-64-66-69-77-82-83-85;VE;Ambo;2;47;0;2100;1590;0,4;4;11;2;1-2-3-4-5;1;10590;


PA 66-82 by googlenotebook lm dopo che ha analizzato gli ultimi 100 sfaldamenti di almeno ambo del relativo guc13 su BAPAVE stabilendo che i due elementi scelti in oggetto sono i più frequenti in molteplici configurazioni e che la ruota presente in tutte e tre le soluzioni incmaxp potrebbe essere la favorita.

colpi teorici: 1

nop: risultanze incmaxp by cinque c14absxs1suTTeNZby1871guc70 analizzate in c2 x s1 su 2r unite da 1 a 5p unite by 1871 -> 10 risultanze in 46min -> guc14 -> sviluppo del guc14 in c11 x s2 su 2r unite da 2 a 5p unite by 1871 -> scelta di quelle con max p unite (3p unite) e fqp >= 800) ; FQP sembra essere secondo ai l'elemento scrematore determinante in caso di molteplici risultanze. Più alto è meglio è. Di seguito dovrebbe esserci il valore incmax att=sto (più alto è meglio è) e il numero di incrementi (+ alto è meglio è).


Nessuna Certezza Solo Poca Probabilità

Cascato a colpo TERNO in c11 e in C13 su VE : 19-40-77. 19 e 40 erano presenti in tutte e tre le risultanze incmaxp in c11, il 77 in sole due di queste. VE avrebbe avuto rispetto le altre due ruote considerando l'analisi in ruote separate sia l'ra che la fq "centrale".
 
CASO studio... ultimo test "Binario" con esito a colpo di ambetto by v53.

[11:25:58][INFO] Inizio elaborazione per ruota: CA
[11:25:58][INFO] File input: estrazioni-CA.txt
[11:25:58][INFO] Cartella output: C:\Users\ProgettoAIxLotto\Desktop\esperimento-0-1\SusannaBINARYPredictions-OK-2\CA
[11:25:58][INFO] Lunghezza sequenza: 6
[11:25:58][INFO] Righe da analizzare: 60
[11:25:58][INFO] Soglia minima: 90.0%


[11:25:58][INFO] Per b1.txt: 7 split con probabilità >= soglia.
[11:25:58][INFO]
=== CONDIZIONE OTTIMALE TROVATA ===
[11:25:58][INFO] Ruota: CA
[11:25:58][INFO] File binario: b1.txt
[11:25:58][INFO] Pattern analizzato: 010011
[11:25:58][INFO] Occorrenze '0': 0
[11:25:58][INFO] Occorrenze '1': 1
[11:25:58][INFO] Sequenza binaria risultante: 0011101
[11:25:58][INFO] Numero decimale: 29
[11:25:58][INFO] ================================
[11:26:00][INFO]


[11:26:00][INFO] Per b2.txt: 6 split con probabilità >= soglia.
[11:26:00][INFO]
=== CONDIZIONE OTTIMALE TROVATA ===
[11:26:00][INFO] Ruota: CA
[11:26:00][INFO] File binario: b2.txt
[11:26:00][INFO] Pattern analizzato: 101000
[11:26:00][INFO] Occorrenze '0': 1
[11:26:00][INFO] Occorrenze '1': 0
[11:26:00][INFO] Sequenza binaria risultante: 0010000
[11:26:00][INFO] Numero decimale: 16
[11:26:00][INFO] ================================
[11:26:02][INFO]

Uscito 30 in posizione (I) e 16 a colpo fuori posizione (III).

ambettoacolpo.jpg
 
Provo un esp "binario" non ottimale...

[22:53:52][INFO] Inizio elaborazione per ruota: RO
[22:53:52][INFO] File input: estrazioni-RO.txt
[22:53:52][INFO] Cartella output: C:\Users\ProgettoAIxLotto\Desktop\esperimento-0-1\SusannaBINARYPredictions-OK-2\RO
[22:53:52][INFO] Lunghezza sequenza: 6
[22:53:52][INFO] Righe da analizzare: 60
[22:53:52][INFO] Soglia minima: 90.0%


[22:53:53][INFO] Per b1.txt: 6 split con probabilità >= soglia.
[22:53:53][WARNING] Sequenza binaria incompleta, conversione saltata.

=== CONDIZIONE (non) OTTIMALE TROVATA ===
[22:53:53][INFO] Ruota: RO
[22:53:53][INFO] File binario: b1.txt
[22:53:53][INFO] Pattern analizzato: 010010
[22:53:53][INFO] Occorrenze '0': 0
[22:53:53][INFO] Occorrenze '1': 1
[22:53:53][INFO] Sequenza binaria risultante: 010111_
[22:53:53][INFO] Numero decimale: None
[22:53:53][INFO] ================================
[22:53:55][INFO]

anche se manca l'ultimo bit ques'ultimo in questo contesto dovrà necessariamente essere o 0 o 1

quindi provo a dire ROMA 0101110 = 46 oppure ROMA 0101111 = 47
posizione teoricamente favorita: I
colpi teorici : 1

Nessuna Certezza Solo Poca Probabilità
 
Provo un esp "binario" non ottimale...

[22:53:52][INFO] Inizio elaborazione per ruota: RO
[22:53:52][INFO] File input: estrazioni-RO.txt
[22:53:52][INFO] Cartella output: C:\Users\ProgettoAIxLotto\Desktop\esperimento-0-1\SusannaBINARYPredictions-OK-2\RO
[22:53:52][INFO] Lunghezza sequenza: 6
[22:53:52][INFO] Righe da analizzare: 60
[22:53:52][INFO] Soglia minima: 90.0%


[22:53:53][INFO] Per b1.txt: 6 split con probabilità >= soglia.
[22:53:53][WARNING] Sequenza binaria incompleta, conversione saltata.

=== CONDIZIONE (non) OTTIMALE TROVATA ===
[22:53:53][INFO] Ruota: RO
[22:53:53][INFO] File binario: b1.txt
[22:53:53][INFO] Pattern analizzato: 010010
[22:53:53][INFO] Occorrenze '0': 0
[22:53:53][INFO] Occorrenze '1': 1
[22:53:53][INFO] Sequenza binaria risultante: 010111_
[22:53:53][INFO] Numero decimale: None
[22:53:53][INFO] ================================
[22:53:55][INFO]

anche se manca l'ultimo bit ques'ultimo in questo contesto dovrà necessariamente essere o 0 o 1

quindi provo a dire ROMA 0101110 = 46 oppure ROMA 0101111 = 47
posizione teoricamente favorita: I
colpi teorici : 1

Nessuna Certezza Solo Poca Probabilità

RO 47 a colpo anche se fuori posizione 🎯🙂
 
Grazie friends per i pollicions :)

Prox forse...

[22:20:42][INFO] Inizio elaborazione per ruota: VE
[22:20:42][INFO] File input: estrazioni-VE.txt
[22:20:42][INFO] Cartella output: C:\Users\ProgettoAIxLotto\Desktop\esperimento-0-1\SusannaBINARYPredictions-OK-2\VE
[22:20:42][INFO] Lunghezza sequenza: 4
[22:20:42][INFO] Righe da analizzare: 60
[22:20:42][INFO] Soglia minima: 90.0%


=== CONDIZIONE OTTIMALE TROVATA ===
[22:20:43][INFO] Ruota: VE
[22:20:43][INFO] File binario: b4.txt
[22:20:43][INFO] Pattern analizzato: 0100
[22:20:43][INFO] Occorrenze '0': 2
[22:20:43][INFO] Occorrenze '1': 0
[22:20:43][INFO] Sequenza binaria risultante: 0110110 -> il bit in forse... sarebbe il 4° -> alternativa "bit" : 0111110 = 62
[22:20:43][INFO] Numero decimale: 54
[22:20:43][INFO] ================================
[22:20:45][INFO]

posizione : IV

colpi teorici: 1

Nessuna Certezza Solo Poca Probabilità
 
Non mi sono riuscito a spiegare pazienza :)

Ad ogni modo non posso non incorniciare a riprova della mia tesi... (anche se al 99% si tratterà forse solo di un particolarissimo caso...) questo evento.. risultante da uno dei numerosi virtual test con dataset aggiornato al 30/1/2025...


Vedi l'allegato 2296958

Anche da questo "assurdo..." ma bellissimo.. evento si evince il fatto che generalmente più piccolo è il dataset è più performante è la predizione... di qualunque forma e derivazione si tratti... :) ps: provate la funzione "con ragionamento" di chatgpt free (è una 💣)
cosa dobbiamo chiedere a chat gtp ? grazie
 
Nonostante sia da ottimizzare e correggere su su molti punti condivido il code dell'ultima versione (script-analisi-0-1-versioneforsefinale-38.py) x i + smanettoni tra di voi :) In questa versione è stato corretto l'ordinamento di ricerca (dal basso verso l'alto e l'implementazione di un abbozzo di automazione e di ricerca della condizione teoricamente + ottimale). Anche l'interfaccia presenta molti + campi e bottoni rispetto alla soprastante.

Codice:
import os
import time
from datetime import datetime
from tkinter import Tk, filedialog, Checkbutton, IntVar, Button, Label, Entry, Frame
from collections import Counter, defaultdict
import winsound

class Logger:
    def __init__(self, cartella_output):
        self.start_time = time.time()
        self.log_filename = os.path.join(cartella_output,
                                         f"log_elaborazione_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt")

    def log(self, messaggio):
        with open(self.log_filename, 'a', encoding='utf-8') as f:
            timestamp = datetime.now().strftime('%H:%M:%S')
            f.write(f"[{timestamp}] {messaggio}\n")
        print(messaggio)

    def tempo_totale(self):
        tempo_totale = time.time() - self.start_time
        return f"{tempo_totale:.2f} secondi"

class ReportCasiOttimali:
    def __init__(self, cartella_output):
        self.report_path = os.path.join(cartella_output, "reportcasiottimali.txt")
        with open(self.report_path, 'w', encoding='utf-8') as f:
            f.write("=== Report Casi Ottimali ===\n\n")
        self.casi_trovati = False

    def aggiungi_caso(self, file_estrazioni, file_b, posizione, prob_0, prob_1):
        self.casi_trovati = True
        with open(self.report_path, 'a', encoding='utf-8') as f:
            f.write(f"File estrazioni: {file_estrazioni}\n")
            f.write(f"File binario: {file_b}\n")
            f.write(f"Probabilità '0': {prob_0:.2%}\n")
            f.write(f"Probabilità '1': {prob_1:.2%}\n")
            f.write("-" * 50 + "\n")

    def finalizza_report(self):
        if not self.casi_trovati:
            with open(self.report_path, 'a', encoding='utf-8') as f:
                f.write("Nessun caso ottimale trovato.\n")

class ReportRuote:
    def __init__(self, cartella_output, nome_file):
        self.report_path = os.path.join(cartella_output, nome_file)
        if not os.path.exists(self.report_path):
            with open(self.report_path, 'w', encoding='utf-8') as f:
                f.write(f"=== {nome_file.replace('.txt', '').upper()} ===\n\n")

    def aggiungi_ruota(self, ruota):
        with open(self.report_path, 'a', encoding='utf-8') as f:
            f.write(f"{ruota}\n")

class CarrelloPredizioni:
    def __init__(self):
        self.carrelli = defaultdict(lambda: ['_'] * 7)
        self.ruota_corrente = None

    def set_ruota(self, nome_file_input):
        if nome_file_input.startswith('estrazioni-'):
            self.ruota_corrente = nome_file_input.split('-')[1].split('.')[0]

    def aggiungi_predizione(self, file_origine, posizione, valore):
        file_base = os.path.basename(file_origine)
        parti = file_base.split('-')
        numero_file = ''.join(filter(str.isdigit, parti[0]))
        chiave = f"b{numero_file}"
        try:
            posizione = int(parti[1].split('.')[0])
            if 0 <= posizione < 7:
                self.carrelli[chiave][posizione] = valore
        except (ValueError, IndexError) as e:
            print(f"Errore: {e}")

    def mostra_risultati(self, logger, cartella_output):
        logger.log("\n=== Risultati Finali ===")
        script_dir = os.path.dirname(os.path.abspath(__file__))
        report_path = os.path.join(script_dir, "previsionielaborate.txt")
        numeri_decimali = []
        for chiave in sorted(self.carrelli.keys()):
            sequenza_binaria = ''.join(self.carrelli[chiave])
            numero_decimale = str(int(sequenza_binaria, 2))
            numeri_decimali.append(numero_decimale)
            logger.log(f"{chiave}.txt: {numero_decimale} (binario: {sequenza_binaria} = {int(sequenza_binaria, 2)})")
        with open(report_path, 'a', encoding='utf-8') as report:
            if self.ruota_corrente and numeri_decimali:
                report.write(f"{self.ruota_corrente} {'-'.join(numeri_decimali)}\n")
        logger.log("=====================")
        logger.log(f"Report salvato in: {report_path}")

def decimale_a_binario(decimale):
    return '.'.join(format(int(decimale), '07b'))

def converte_file_decimale(file_decimale, cartella_output, logger):
    colonne = []
    with open(file_decimale, 'r') as file:
        for linea in file:
            valori = linea.strip().split('.')
            for i, valore in enumerate(valori):
                if len(colonne) <= i:
                    colonne.append([])
                colonne[i].append(decimale_a_binario(valore))
    file_binari = []
    for i, colonna in enumerate(colonne):
        nome_file = os.path.join(cartella_output, f"b{i + 1}.txt")
        with open(nome_file, 'w') as file:
            file.write('\n'.join(colonna))
        file_binari.append(nome_file)
        logger.log(f"File binario generato: {nome_file}")
    return file_binari

def split_file_binario(file_binario, cartella_output, logger):
    base_name = os.path.basename(file_binario)
    numero_file = ''.join(filter(str.isdigit, base_name.split('.')[0]))
    with open(file_binario, 'r') as file:
        righe = [line.strip().split('.') for line in file]
        colonne = list(zip(*righe))
    file_splittati = []
    for i, colonna in enumerate(colonne):
        nome_file = os.path.join(cartella_output, f"b{numero_file}-{i}.txt")
        with open(nome_file, 'w') as file:
            file.write('\n'.join(colonna))
        file_splittati.append(nome_file)
        logger.log(f"File splittato generato: {nome_file}")
    return file_splittati

def carica_dati(file_path):
    with open(file_path, 'r') as file:
        # Legge i dati e INVERTE l'ordine per avere i più vecchi in alto durante l'analisi
        dati = [bit for line in file for bit in line.strip().split('.')]
        return dati[::-1]  # <-- Modifica chiave qui

def analizza_file(file_binario, lunghezza_sequenza, carrello, logger, report_ottimali, file_estrazioni,
                  soglia_minima, analisi_automatica):
    posizione = int(os.path.basename(file_binario).split('-')[1].split('.')[0])
    dati = carica_dati(file_binario)  # Dati ora sono invertiti: [vecchio, ..., recente]

    logger.log(f"\nAnalisi pattern per {file_binario}")
    logger.log(f"Posizione bit analizzata: bit{posizione}.txt")
    logger.log(f"Lunghezza sequenza pattern: {lunghezza_sequenza}")

    # Controllo per assicurarsi che la lunghezza del pattern sia valida
    if lunghezza_sequenza <= 0:
        logger.log(f"Lunghezza sequenza pattern non valida: {lunghezza_sequenza}")
        return False

    # Pattern iniziale preso dalla FINE dei dati invertiti (corrisponde ai più RECENTI nel file originale)
    initial_pattern = tuple(dati[-lunghezza_sequenza:])  # <-- Modifica qui

    preceding_bits = []

    # Analizza dal basso (vecchio) verso l'alto (recente) nei dati invertiti
    for i in range(len(dati) - lunghezza_sequenza):
        current_window = tuple(dati[i:i + lunghezza_sequenza])
        if current_window == initial_pattern and i + lunghezza_sequenza < len(dati):
            # Il bit successivo è quello DOPO la finestra, verso l'alto (più recente)
            preceding_bit = dati[i + lunghezza_sequenza]
            preceding_bits.append(preceding_bit)

    count_0 = preceding_bits.count('0')
    count_1 = preceding_bits.count('1')
    total = len(preceding_bits)

    if total == 0:
        prob_0, prob_1 = 0.5, 0.5
    else:
        prob_0 = count_0 / total
        prob_1 = count_1 / total

    occ = {'0': count_0, '1': count_1}
    TOLLERANZA = 0.0001
    is_optimal = any(abs(prob - 1.0) < TOLLERANZA for prob in [prob_0, prob_1])

    # Controllo per identificare i casi con esattamente un bit inferiore alla soglia minima
    if analisi_automatica:
        bit_inferiori = [bit for bit in preceding_bits if (bit == '0' and prob_0 < soglia_minima / 100) or (bit == '1' and prob_1 < soglia_minima / 100)]
        if len(bit_inferiori) == 1:
            file_b = os.path.basename(file_binario).split('-')[0] + ".txt"
            report_ottimali.aggiungi_caso(
                os.path.basename(file_estrazioni),
                file_b,
                posizione,
                prob_0,
                prob_1
            )
            return True

    valore_predetto = '0' if prob_0 > prob_1 else '1'
    prob_valore = prob_0 if valore_predetto == '0' else prob_1

    logger.log(f"Sequenza iniziale: {''.join(initial_pattern)}")
    logger.log(f"Occorrenze trovate del pattern: {total}")
    logger.log(f"Probabilità '0': {prob_0:.2%} (occorrenze: {count_0})")
    logger.log(f"Probabilità '1': {prob_1:.2%} (occorrenze: {count_1})")
    logger.log(f"Valore predetto: {valore_predetto} (probabilità: {prob_valore:.2%})")

    carrello.aggiungi_predizione(file_binario, posizione, valore_predetto)

    # Aggiunto controllo per fermarsi se tutte le probabilità sono maggiori o uguali alla soglia
    if prob_0 >= soglia_minima / 100 and prob_1 >= soglia_minima / 100:
        return True

    return is_optimal

def processo_automatico(file_input, lunghezza_sequenza, righe_da_analizzare=10000, soglia_minima=100, analisi_automatica=False):
    cartella_output = os.path.dirname(os.path.abspath(file_input))
    nome_file = os.path.basename(file_input)
    logger = Logger(cartella_output)
    report_ottimali = ReportCasiOttimali(cartella_output)
    report_ruote_ottimali = ReportRuote(os.path.dirname(os.path.abspath(__file__)), "RUOTEOTTIMALI.txt")
    report_ruote_non_ottimali = ReportRuote(os.path.dirname(os.path.abspath(__file__)), "RUOTENONOTTIMALI.txt")
    logger.log(f"Inizio elaborazione")
    logger.log(f"File input: {nome_file}")
    logger.log(f"Cartella output: {cartella_output}")
    logger.log(f"Lunghezza sequenza: {lunghezza_sequenza}")
    logger.log(f"Righe da analizzare: {righe_da_analizzare}")
    logger.log(f"Soglia minima: {soglia_minima}%")
    logger.log("\nConversione file decimale in binari...")

    with open(file_input, 'r') as file:
        lines = []
        for i, line in enumerate(file):
            if i < righe_da_analizzare:
                lines.append(line)
            else:
                break

    temp_file = os.path.join(cartella_output, "temp_estrazioni.txt")
    with open(temp_file, 'w') as file:
        file.writelines(lines)

    file_binari = converte_file_decimale(temp_file, cartella_output, logger)
    carrello = CarrelloPredizioni()
    carrello.set_ruota(nome_file)
    is_ruota_ottimale = True

    for file_binario in file_binari:
        logger.log(f"\nElaborazione {os.path.basename(file_binario)}...")
        file_splittati = split_file_binario(file_binario, cartella_output, logger)
        for file_splittato in file_splittati:
            if not analizza_file(file_splittato, lunghezza_sequenza, carrello, logger, report_ottimali, nome_file, soglia_minima, analisi_automatica):
                is_ruota_ottimale = False

    if is_ruota_ottimale:
        report_ruote_ottimali.aggiungi_ruota(carrello.ruota_corrente)
    else:
        report_ruote_non_ottimali.aggiungi_ruota(carrello.ruota_corrente)

    carrello.mostra_risultati(logger, cartella_output)
    report_ottimali.finalizza_report()
    tempo_totale = logger.tempo_totale()
    logger.log(f"\nTempo totale di elaborazione: {tempo_totale}")
    logger.log(f"Report casi ottimali salvato in: {report_ottimali.report_path}")
    logger.log(f"Report ruote ottimali salvato in: {report_ruote_ottimali.report_path}")
    logger.log(f"Report ruote non ottimali salvato in: {report_ruote_non_ottimali.report_path}")

    os.remove(temp_file)

    return report_ottimali.casi_trovati

def ottieni_percorso_file_estrazioni(ruota):
    return os.path.join(ruota, f"estrazioni-{ruota}.txt")

def inizializza_report_ruote():
    script_dir = os.path.dirname(os.path.abspath(__file__))
    for nome_file in ["RUOTEOTTIMALI.txt", "RUOTENONOTTIMALI.txt"]:
        report_path = os.path.join(script_dir, nome_file)
        with open(report_path, 'w', encoding='utf-8') as f:
            f.write(f"=== {nome_file.replace('.txt', '').upper()} ===\n\n")

def main():
    root = Tk()
    root.title("Seleziona Ruote")

    pattern_frame = Frame(root)
    pattern_frame.pack(pady=10)
    Label(pattern_frame, text="Lunghezza pattern:").pack(side='left')
    pattern_length = Entry(pattern_frame, width=5)
    pattern_length.insert(0, "18")
    pattern_length.pack(side='left', padx=5)

    righe_frame = Frame(root)
    righe_frame.pack(pady=10)
    Label(righe_frame, text="Prime righe da analizzare:").pack(side='left')
    righe_da_analizzare = Entry(righe_frame, width=5)
    righe_da_analizzare.insert(0, "10000")
    righe_da_analizzare.pack(side='left', padx=5)

    soglia_frame = Frame(root)
    soglia_frame.pack(pady=10)
    Label(soglia_frame, text="Soglia minima di probabilità (%):").pack(side='left')
    soglia_minima = Entry(soglia_frame, width=5)
    soglia_minima.insert(0, "100")
    soglia_minima.pack(side='left', padx=5)

    analisi_automatica_var = IntVar()
    Checkbutton(root, text="Analisi e selezione automatica", variable=analisi_automatica_var).pack(pady=5)

    Label(root, text="Seleziona le ruote da analizzare:").pack()

    ruote = ["BA", "CA", "FI", "GE", "MI", "NA", "PA", "RO", "TO", "VE", "NZ"]
    ruote_vars = {ruota: IntVar() for ruota in ruote}

    checkbuttons_frame = Frame(root)
    checkbuttons_frame.pack(pady=5)

    for ruota in ruote:
        Checkbutton(checkbuttons_frame, text=ruota, variable=ruote_vars[ruota]).pack(anchor='w')

    buttons_frame = Frame(root)
    buttons_frame.pack(pady=10)

    def seleziona_tutto():
        for var in ruote_vars.values():
            var.set(1)

    def deseleziona_tutto():
        for var in ruote_vars.values():
            var.set(0)

    def analizza():
        try:
            lunghezza_seq = int(pattern_length.get())
            righe = int(righe_da_analizzare.get())
            soglia = float(soglia_minima.get())
            analisi_automatica = analisi_automatica_var.get()
            ruote_selezionate = [ruota for ruota, var in ruote_vars.items() if var.get()]

            inizializza_report_ruote()

            if analisi_automatica:
                lunghezza_seq_iniziale = lunghezza_seq
                while True:
                    casi_trovati = False
                    for ruota in ruote_selezionate:
                        file_input = ottieni_percorso_file_estrazioni(ruota)
                        if os.path.exists(file_input):
                            logger = Logger(os.path.dirname(os.path.abspath(file_input)))
                            logger.log(f"Analizzando ruota: {ruota}")
                            logger.log(f"File input: {file_input}")
                            logger.log(f"Lunghezza sequenza: {lunghezza_seq}")
                            logger.log(f"Righe da analizzare: {righe}")
                            logger.log(f"Soglia minima: {soglia}%")
                            if processo_automatico(file_input, lunghezza_seq, righe, soglia, analisi_automatica):
                                casi_trovati = True
                                logger.log(f"Ruota ottimale trovata: {ruota}")
                                report_ruote_ottimali = ReportRuote(os.path.dirname(os.path.abspath(__file__)), "RUOTEOTTIMALI.txt")
                                report_ruote_ottimali.aggiungi_ruota(f"RUOTA OTTIMALE: {ruota}")
                                winsound.Beep(1000, 2000)  # Emette un bip sonoro a 1000 Hz per 2 secondi
                                break
                    if casi_trovati:
                        break
                    lunghezza_seq += 1
                    logger.log(f"Aumentando la lunghezza del pattern a {lunghezza_seq}")
            else:
                for ruota in ruote_selezionate:
                    file_input = ottieni_percorso_file_estrazioni(ruota)
                    if os.path.exists(file_input):
                        logger = Logger(os.path.dirname(os.path.abspath(file_input)))
                        logger.log(f"Analizzando ruota: {ruota}")
                        logger.log(f"File input: {file_input}")
                        logger.log(f"Lunghezza sequenza: {lunghezza_seq}")
                        logger.log(f"Righe da analizzare: {righe}")
                        logger.log(f"Soglia minima: {soglia}%")
                        processo_automatico(file_input, lunghezza_seq, righe, soglia, analisi_automatica)
                    else:
                        print(f"File di estrazioni per la ruota {ruota} non trovato.")
        except ValueError:
            print("Errore: inserire valori numerici validi.")

    Button(buttons_frame, text="Seleziona Tutto", command=seleziona_tutto).pack(side='left', padx=5)
    Button(buttons_frame, text="Deseleziona Tutto", command=deseleziona_tutto).pack(side='left', padx=5)
    Button(buttons_frame, text="Analizza", command=analizza).pack(side='left', padx=5)

    root.mainloop()

if __name__ == "__main__":
    main()

Per testarlo, e magari contribuire alla sua ottimizzazione e/o correzione, è necessario creare 11 cartelle : BA , CA , FI ecc... fino a NZ con dentro i rispettivi file estrazioni-BA.txt ecc... contenenti ognuno le estrazioni della rispettiva ruota con la prima estrazione in alto e l'ultima in basso in formato con i 5 estratti a doppia cifra (i numeri da 1 a 9 con lo 0 davanti) intervallata da carattere punto (es. 01.88.77.32.05). AI utilizzate per adesso per questo script py: Claude Sonnet 3.5, DeepSeek, ChatGpt e Mistral. Selezionando "Analizza e seleziona automaticamente" lo script continuerà la ricerca ad libitum aumentando la lunghezza del pattern iniziale di una unità ad ogni nuovo ciclo.. Per adesso lo script si potrà interrompere solo bruscamente.. con ctrl + s (pausa) e ctrl + q (prosegui) o con ctrl + c (chiudi) o chiudendo direttamente la finestra dos. Per ovviare a questo comunque basta comunque implementarvi un bottone per chiuderlo in modo + dolce... o non selezionare quell'opzione di analisi automatica... :)

breve schema e spiegazione dell'idea di base che ho avuto e che mi ha spinto a voler cercare di realizzare questo script :

la sequenza di estratti di ogni estrazione e per ogni ruota viene convertita in rispettivi numeri binari a 7 bit i quali vengono a loro volta scomposti nelle 7 colonne di bit (da bit0 a bit6). Queste 7 colonne vengono analizzate una ad una a partire dal basso verso l'alto dopo che è stato costruito un pattern spia di ricerca prelevando i primi elementi di ciascuna colonna a partire dall'alto. Questa operazione si può fare sia staticamente scegliendo una lunghezza fissa sia dinamicamente lasciando appunto allo script di aumentare ad ogni ciclo la lunghezza del pattern di partenza... Lo script dovrà quindi annotarsi tutte le quantità di 0 e di 1 che incontrerà per ciascuna colonna di bit dopo la sequenza del pattern di ricerca e in base alla loro presenza maggiore e quindi relativa probabilità di apparizione ipotizzare quale ci sarà dopo l'ultimo bit in alto della rispettiva colonna analizzata... Per far questo è possibile scegliere statisticamente una % minima di presenza per far si che il bit che la raggiunge o supera sia considerato + probabile dell'altro.



Vedi l'allegato 2296926
Scusami Tom ..volevo provare il tuo costrutto ma sono arenato sui files estrazione- " RUOTA.txt" in quanto i miei sono in formato anno/mese/giorno RUOTA e i numeri non sono separati dal punto bensi da qualche spazio e i numeretti non hanno lo 0 davanti.

Aiutino se puoi?

Grazie mille
 
Scusami Tom ..volevo provare il tuo costrutto ma sono arenato sui files estrazione- " RUOTA.txt" in quanto i miei sono in formato anno/mese/giorno RUOTA e i numeri non sono separati dal punto bensi da qualche spazio e i numeretti non hanno lo 0 davanti.

Aiutino se puoi?

Grazie mille

Ciao max, qui trovi lo scriptino che ti necessita #310 e che mi sono costruito appunto per creare gli archivi nel formato e ordine giusto ovvero con lo 0 davanti ai numeri da 1 a 9 e con le estrazioni recenti in alto e quelle remote in basso con tutti i numeri intervallati da carattere punto.
 
perdonate l'intrusione :

ho creato o meglio ha creato lei questo piccolo codice per la formattazione da : a: tocca solo cambiare percorso ,

Codice:
import os
import tkinter as tk
from tkinter import messagebox

def format_files():
    # Percorso della cartella contenente i file
    folder_path = r"C:\Users\PRODESC\AppData\Local\Programs\Python\Python312"

    # Mappatura dei nomi dei file e degli abbreviativi
    abbreviations = {
        "BARI.TXT": "BA.TXT",
        "CAGLIARI.TXT": "CA.TXT",
        "FIRENZE.TXT": "FI.TXT",
        "GENOVA.TXT": "GE.TXT",
        "MILANO.TXT": "MI.TXT",
        "NAPOLI.TXT": "NA.TXT",
        "PALERMO.TXT": "PA.TXT",
        "ROMA.TXT": "RO.TXT",
        "TORINO.TXT": "TO.TXT",
        "VENEZIA.TXT": "VE.TXT",
        "NAZIONALE.TXT": "NA.TXT"
    }

    # Dizionario per memorizzare i dati formattati
    city_data = {abbrev: [] for abbrev in abbreviations.values()}

    # Leggi e formatta i file
    for filename, new_name in abbreviations.items():
        file_path = os.path.join(folder_path, filename)
        if os.path.exists(file_path):
            print(f"Processing file: {filename}")

            with open(file_path, 'r') as file:
                lines = file.readlines()

            # Elaboriamo le righe e formattiamo i numeri
            for line in lines:
                parts = line.split()  # Dividi la riga in parti
                if len(parts) > 2:  # Controlla che ci siano abbastanza parti
                    # Estrai solo i numeri e formatta con zero davanti ai numeri singoli
                    formatted_numbers = [
                        f"{int(num):02d}" for num in parts[2:]  # Ignora la data e il codice
                    ]

                    # Creiamo la stringa del numero formattato (separato da '.')
                    formatted_line = '.'.join(formatted_numbers)
                    city_data[new_name].append(formatted_line)
                else:
                    print(f"Warning: Line not in expected format: {line.strip()}")

    # Scriviamo i file formattati
    for city_code, numbers_list in city_data.items():
        if numbers_list:  # Se ci sono dati da scrivere
            output_file_path = os.path.join(folder_path, city_code)
            with open(output_file_path, 'w') as city_file:
                # Scriviamo le righe in ordine inverso (ultimi primi)
                for numbers in reversed(numbers_list):
                    city_file.write(numbers + '\n')
            print(f"Written {len(numbers_list)} lines to {output_file_path}")

    messagebox.showinfo("Completato", "I file sono stati formattati e creati con successo!")

# Interfaccia grafica di base
root = tk.Tk()
root.title("Formatta e Crea File")
root.geometry("300x150")

start_button = tk.Button(root, text="Inizia", command=format_files)
start_button.pack(pady=50)

root.mainloop()
 
Tom come fai a trovare una condizione ottimale...Che lunghezza di pattern?..ho provato 10 e 100 righe ma niente..
 
Posizione bit analizzata: 0
Match #1: Bit 0 trovato in riga 8

Risultati Analisi:
Totale match: 1
Zeri: 1 (100.0%)
Uni: 0 (0.0%)

REPORT FINALE "pulito"


Posizione bit analizzata: 1
Match #1: Bit 1 trovato in riga 8

Risultati Analisi:
Totale match: 1
Zeri: 1 (100.0%)
Uni: 0 (0.0%)

REPORT FINALE "pulito"


Posizione bit analizzata: 2
Match #1: Bit 2 trovato in riga 8

Risultati Analisi:
Totale match: 1
Zeri: 0 (0.0%)
Uni: 1 (100.0%)

REPORT FINALE "pulito"


Posizione bit analizzata: 3
Match #1: Bit 3 trovato in riga 8

Risultati Analisi:
Totale match: 1
Zeri: 1 (100.0%)
Uni: 0 (0.0%)

REPORT FINALE "pulito"


Posizione bit analizzata: 4
Match #1: Bit 4 trovato in riga 8

Risultati Analisi:
Totale match: 1
Zeri: 0 (0.0%)
Uni: 1 (100.0%)

REPORT FINALE "pulito"


Posizione bit analizzata: 5
Match #1: Bit 5 trovato in riga 8

Risultati Analisi:
Totale match: 1
Zeri: 0 (0.0%)
Uni: 1 (100.0%)

REPORT FINALE "pulito"


Posizione bit analizzata: 6
Match #1: Bit 6 trovato in riga 8

Risultati Analisi:
Totale match: 1
Zeri: 1 (100.0%)
Uni: 0 (0.0%)

REPORT FINALE "pulito"


Risultati Analisi:
Decimale ricostruito: 22
rilevato 22 in posizione b1.txt con ultime 270 estrazioni


by nuovo code :

Codice:
import tkinter as tk
from tkinter import filedialog, messagebox, ttk, scrolledtext
from threading import Thread
from queue import Queue
import numpy as np
from collections import defaultdict
import time


class SequenzaSpiaApp:
def __init__(self, root):
 self.root = root
self.root.title("Predittore Bit Lotto")
 self.setup_variables()
 self.create_ui()
 self.queue = Queue()
 self.check_queue()
self.tabella_valori = []  # For storing table buttons
        self.decimal_results = {}  # Store decimal results for each column
        self.binary_filename = None  # Store the name of the binary file

    def setup_variables(self):
 self.dati = []
self.carrello = [None] * 7
        self.pattern_ricerca = []
self.filename = None
        self.pattern_cache = {}
self.soglia_var = tk.IntVar(value=50)  # Default threshold 50%
        self.bit_var = tk.IntVar(value=0)  # Add bit_var for analysis

    def create_ui(self):
main_frame = ttk.Frame(self.root, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)

# Binary preview section
        preview_frame = ttk.LabelFrame(main_frame, text="Anteprima Binaria", padding="5")
preview_frame.pack(fill=tk.X, pady=5)

self.binary_preview = scrolledtext.ScrolledText(preview_frame, height=5, width=50)
self.binary_preview.pack(fill=tk.X, pady=5)

# 1-3: File loading and binary conversion section
        conversion_frame = ttk.LabelFrame(main_frame, text="Conversione File", padding="5")
conversion_frame.pack(fill=tk.X, pady=5)

# File loading
        ttk.Button(conversion_frame, text="Carica estrazioni.txt",
command=self.carica_file).pack(side=tk.LEFT, padx=5)
self.nome_file_label = ttk.Label(conversion_frame, text="Nessun file caricato")
self.nome_file_label.pack(side=tk.LEFT, padx=5)

# Column selection with checkboxes
        self.column_vars = []
for i in range(5):
            var = tk.BooleanVar()
 self.column_vars.append(var)
ttk.Checkbutton(conversion_frame, text=f"Col {i+1}",
variable=var).pack(side=tk.LEFT, padx=2)

ttk.Button(conversion_frame, text="Converti Colonne",
command=self.convert_selected_columns).pack(side=tk.LEFT, padx=5)

# 4-7: Pattern analysis section
        analysis_frame = ttk.LabelFrame(main_frame, text="Analisi Pattern", padding="5")
analysis_frame.pack(fill=tk.X, pady=5)

ttk.Button(analysis_frame, text="Carica File Binario",
command=self.load_binary_file).pack(side=tk.LEFT, padx=5)

# Label to display the name of the loaded binary file
        self.binary_file_label = ttk.Label(analysis_frame, text="Nessun file binario caricato")
self.binary_file_label.pack(side=tk.LEFT, padx=5)

# Pattern creation controls
        ttk.Label(analysis_frame, text="Righe:").pack(side=tk.LEFT, padx=5)
self.righe_input = ttk.Entry(analysis_frame, width=5)
self.righe_input.pack(side=tk.LEFT, padx=2)

ttk.Label(analysis_frame, text="Colonne:").pack(side=tk.LEFT, padx=5)
self.colonne_input = ttk.Entry(analysis_frame, width=5)
self.colonne_input.pack(side=tk.LEFT, padx=2)

ttk.Button(analysis_frame, text="Crea Pattern",
command=self.crea_tabella).pack(side=tk.LEFT, padx=5)
ttk.Button(analysis_frame, text="Carica Pattern",
command=self.carica_pattern).pack(side=tk.LEFT, padx=5)

# 8-9: Cart management section
        cart_frame = ttk.LabelFrame(main_frame, text="Gestione Carrello", padding="5")
cart_frame.pack(fill=tk.X, pady=5)

self.carrello_label = ttk.Label(cart_frame, text=self._format_carrello())
self.carrello_label.pack(side=tk.LEFT, padx=5)

ttk.Button(cart_frame, text="Svuota Carrello",
command=self.svuota_carrello).pack(side=tk.LEFT, padx=5)
ttk.Button(cart_frame, text="Converti in Decimale",
command=self.esporta_carrello).pack(side=tk.LEFT, padx=5)

# Add table frame for pattern creation
        self.table_frame = ttk.Frame(main_frame)
self.table_frame.pack(fill=tk.BOTH, expand=True, pady=5)

# Add progress bar
        self.progress = ttk.Progressbar(main_frame, mode='determinate')
self.progress.pack(fill=tk.X, pady=5)

# Add pattern display and analysis section
        pattern_control_frame = ttk.LabelFrame(main_frame, text="Controllo Pattern", padding="5")
pattern_control_frame.pack(fill=tk.X, pady=5)

self.pattern_display = ttk.Label(pattern_control_frame, text="Pattern: Nessun pattern caricato")
self.pattern_display.pack(side=tk.LEFT, padx=5)

ttk.Button(pattern_control_frame, text="Analizza Dataset",
command=self.start_analysis).pack(side=tk.LEFT, padx=5)

# Add bit position selector
        bit_frame = ttk.LabelFrame(main_frame, text="Selezione Bit", padding="5")
bit_frame.pack(fill=tk.X, pady=5)

ttk.Label(bit_frame, text="Posizione bit (0-6):").pack(side=tk.LEFT, padx=5)
self.bit_position = ttk.Spinbox(bit_frame, from_=0, to=6, width=5)
self.bit_position.pack(side=tk.LEFT, padx=5)
self.bit_position.set(0)

# Add extraction range selector
        range_frame = ttk.LabelFrame(main_frame, text="Range Analisi", padding="5")
range_frame.pack(fill=tk.X, pady=5)

ttk.Label(range_frame, text="Ultime N estrazioni (0=tutte):").pack(side=tk.LEFT, padx=5)
self.n_estrazioni = ttk.Entry(range_frame, width=6)
self.n_estrazioni.pack(side=tk.LEFT, padx=5)
self.n_estrazioni.insert(0, "0")

# Add results frame
        self.results_frame = ttk.LabelFrame(main_frame, text="Risultati Analisi", padding="5")
self.results_frame.pack(fill=tk.BOTH, expand=True, pady=5)

# Add buttons to copy and clear results
        button_frame = ttk.Frame(self.results_frame)
button_frame.pack(fill=tk.X, pady=5)

ttk.Button(button_frame, text="Copia Risultati",
command=self.copy_results).pack(side=tk.LEFT, padx=5)
ttk.Button(button_frame, text="Cancella Risultati",
command=self.clear_results).pack(side=tk.LEFT, padx=5)

self.results_text = scrolledtext.ScrolledText(self.results_frame, height=10, width=50)
self.results_text.pack(fill=tk.BOTH, expand=True, pady=5)

# Add decimal results section
        decimal_frame = ttk.LabelFrame(main_frame, text="Risultati Decimali per Colonna", padding="5")
decimal_frame.pack(fill=tk.X, pady=5)

self.decimal_text = scrolledtext.ScrolledText(decimal_frame, height=5, width=50)
self.decimal_text.pack(fill=tk.X, pady=5)

def carica_file(self):
"""Load and process file"""
        try:
filename = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
 if filename:
 self.filename = filename
self.nome_file_label.config(text=f"File: {filename.split('/')[-1]}")
Thread(target=self.load_data, daemon=True).start()
except Exception as e:
self.queue.put(("error", f"Errore caricamento: {str(e)}"))

def load_data(self):
"""Process file data removing dots"""
        try:
with open(self.filename, 'r') as file:
self.dati = [line.strip().replace('.', '') for line in file.readlines()]
print(f"Dati caricati: {self.dati[:5]}...")  # Debug first 5 lines
            self.queue.put(("update", f"Totale righe: {len(self.dati)}"))
except Exception as e:
self.queue.put(("error", f"Errore lettura: {str(e)}"))

def _format_carrello(self):
"""Format cart display"""
        return "Carrello: " + " ".join(str(b) if b is not None else "_" for b in self.carrello)

def check_queue(self):
"""Process queue messages"""
        while not self.queue.empty():
msg = self.queue.get()
if isinstance(msg, tuple):
                msg_type, content = msg
if msg_type == "error":
messagebox.showerror("Errore", content)
elif msg_type == "update":
self.nome_file_label.config(text=content)
self.root.after(100, self.check_queue)

def start_analysis(self):
"""Start pattern analysis"""
        if not self.dati:
messagebox.showwarning("Attenzione", "Caricare prima un file binario")
return
        if not self.pattern_ricerca:
messagebox.showwarning("Attenzione", "Caricare prima un pattern")
return

        Thread(target=self.analizza_dataset, daemon=True).start()

def esporta_carrello(self):
"""Export cart results"""
        if None in self.carrello:
messagebox.showwarning("Avviso", "Completare il carrello")
return
        val = int("".join(map(str, self.carrello)), 2)
messagebox.showinfo("Risultato", f"Valore decimale: {val}")

# Save the decimal result and associated information
        bit_pos = self.binary_filename  # Use the binary filename as the position
        n_estrazioni = self.n_estrazioni.get().strip()
 if n_estrazioni.isdigit():
n_estrazioni = int(n_estrazioni)
 else:
n_estrazioni = 0
        self.decimal_results[bit_pos] = (val, n_estrazioni)

# Update the results label
        self.update_results_label()

def crea_tabella(self):
"""Create dynamic pattern table"""
        try:
righe = int(self.righe_input.get())
colonne = int(self.colonne_input.get())

# Clear existing table
            for widget in self.table_frame.winfo_children():
                widget.destroy()

 self.tabella_valori = []
for i in range(righe):
                row = []
for j in range(colonne):
btn = ttk.Button(self.table_frame, text="0", width=2,
command=lambda r=i, c=j: self.toggle_bit(r, c))
btn.grid(row=i, column=j, padx=2, pady=2)
                    row.append(btn)
 self.tabella_valori.append(row)

self.queue.put(("update", "Tabella pattern creata"))

except ValueError:
self.queue.put(("error", "Inserire valori numerici validi"))

def toggle_bit(self, riga, colonna):
"""Toggle bit value in pattern table"""
        button = self.tabella_valori[riga][colonna]
current = button.cget("text")
new_value = "1" if current == "0" else "0"
        button.config(text=new_value)

def carica_pattern(self):
"""Load pattern from table"""
        try:
            pattern = []
for row in self.tabella_valori:
                pattern_row = []
for button in row:
pattern_row.append(int(button.cget("text")))
                pattern.append(pattern_row)

 self.pattern_ricerca = pattern
pattern_str = "\n".join(" ".join(str(bit) for bit in row) for row in pattern)
self.pattern_display.config(text=f"Pattern:\n{pattern_str}")
messagebox.showinfo("Pattern Caricato", "Pattern pronto per l'analisi")

except Exception as e:
messagebox.showerror("Errore", f"Errore caricamento pattern: {str(e)}")

def analizza_dataset(self):
"""Analyze dataset with selected pattern - starting from oldest data"""
        try:
if not self.pattern_ricerca:
messagebox.showwarning("Attenzione", "Caricare prima un pattern")
return

            self.progress['value'] = 0
            reversed_data = list(reversed(self.dati))

# Get number of extractions to analyze
            n = self.n_estrazioni.get().strip()
if n and n.isdigit():
n = int(n)
if 0 < n < len(reversed_data):
                    reversed_data = reversed_data[:n]
print(f"\nAnalisi limitata alle ultime {n} estrazioni")

total_rows = len(reversed_data)
bit_pos = int(self.bit_position.get())

zeros = 0
            ones = 0
            matches = 0

            print("\n====== ANALISI DETTAGLIATA PATTERN ======")
print(f"Posizione bit analizzata: {bit_pos}")
print("\nPattern di ricerca:")
for row in self.pattern_ricerca:
print("".join(str(bit) for bit in row))
print("\n=== SEQUENZE TROVATE ===")

pattern_height = len(self.pattern_ricerca)
pattern_width = len(self.pattern_ricerca[0]) if self.pattern_ricerca else 0

            for i in range(len(reversed_data) - pattern_height):
match = True
                current_sequence = []

# Check pattern match
                for row_idx in range(pattern_height):
data_row = reversed_data[i + row_idx].split() # Split the binary string into parts
                    if not data_row:  # Skip empty rows
                        match = False
                        break

                    current_sequence.append(reversed_data[i + row_idx])

# Ensure the data row has enough columns
                    if len(data_row) * 7 < pattern_width:  # Each part is 7 bits
                        match = False
                        break

                    # Convert the row to a continuous binary string
                    binary_row = ''.join(data_row).replace('.', '')  # Remove dots

                    # Check each bit in the pattern
                    for col_idx, pattern_bit in enumerate(self.pattern_ricerca[row_idx]):
if col_idx >= len(binary_row):
match = False
                            break
                        try:
if int(binary_row[col_idx]) != pattern_bit:
match = False
                                break
                        except ValueError as e:
print(f"Errore di conversione: {e} in riga {i + row_idx}, colonna {col_idx}")
match = False
                            break

                    if not match:
break

                if match:
matches += 1
                    next_row_idx = i + pattern_height

 if next_row_idx < total_rows:
                        next_row = reversed_data[next_row_idx].split()
if next_row and bit_pos < len(''.join(next_row)):
binary_next_row = ''.join(next_row).replace('.', '')  # Remove dots
                            try:
next_bit = int(binary_next_row[bit_pos])
except ValueError as e:
print(f"Errore di conversione: {e} in riga {next_row_idx}, posizione bit {bit_pos}")
continue

                            print(f"\n--- Match #{matches} ---")
print(f"Riga iniziale: {total_rows - i}")
print("Sequenza trovata:")
for seq_row in current_sequence:
 print(seq_row)
print(f"Bit successivo in pos {bit_pos}: {next_bit}")

if next_bit == 0:
zeros += 1
                            else:
ones += 1

                            # Add match result to the results text
                            self.results_text.insert(tk.END, f"Posizione bit analizzata: {bit_pos}\n")
self.results_text.insert(tk.END, f"Match #{matches}: Bit {bit_pos} trovato in riga {total_rows - i}\n")

self.progress['value'] = (i / (total_rows - pattern_height)) * 100
                self.root.update_idletasks()

# Calculate and display results
            total_matches = zeros + ones
zero_percent = (zeros / total_matches * 100) if total_matches > 0 else 0
            one_percent = (ones / total_matches * 100) if total_matches > 0 else 0

            result_text = (
f"\nRisultati Analisi:\n"
                f"Totale match: {total_matches}\n"
                f"Zeri: {zeros} ({zero_percent:.1f}%)\n"
                f"Uni: {ones} ({one_percent:.1f}%)"
            )

print("\n====== RIEPILOGO FINALE ======")
 print(result_text)

self.queue.put(("update", result_text))
self.results_text.insert(tk.END, result_text + "\n")

# Update cart based on majority
            if ones > zeros:
self.carrello[bit_pos] = 1
            else:
self.carrello[bit_pos] = 0
            self.carrello_label.config(text=self._format_carrello())

# Update the final summary
            self.update_final_summary()

except ValueError as e:
error_msg = f"Errore durante l'analisi: {str(e)}"
            print(f"\nERRORE: {error_msg}")
self.queue.put(("error", error_msg))
except Exception as e:
error_msg = f"Errore generico durante l'analisi: {str(e)}"
            print(f"\nERRORE: {error_msg}")
self.queue.put(("error", error_msg))
 finally:
self.progress['value'] = 100
            self.root.update_idletasks()

def convert_selected_columns(self):
"""Convert selected columns to binary files"""
        try:
if not self.filename:
                messagebox.showwarning(
"Attenzione", "Caricare prima estrazioni.txt")
return

            for i, var in enumerate(self.column_vars):
 if var.get():
output_file = f"b{i + 1}.txt"
                    self.convert_column_to_binary_file(i + 1, output_file)

except Exception as e:
            messagebox.showerror(
"Errore", f"Errore nella conversione: {str(e)}")


         

def convert_column_to_binary_file(self, column_index, output_file):
"""Convert single column to binary file"""
        try:
with open(self.filename, 'r') as f:
                lines = f.readlines()
            transformed_lines = []
for line in lines:
numbers = line.strip().split(".")
if column_index - 1 < len(numbers):
binary = f"{int(numbers[column_index - 1]):07b}"
                    binary_with_dots = ".".join(binary)
                    transformed_lines.append(binary_with_dots)

with open(output_file, 'w') as f:
f.write("\n".join(transformed_lines))

except Exception as e:
raise Exception(f"Errore colonna {column_index}: {str(e)}")


def load_binary_file(self):
"""Load binary file for analysis"""
        try:
filename = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
 if filename:
self.binary_filename = filename.split('/')[-1]  # Store only the filename
                self.binary_file_label.config(text=f"File binario: {self.binary_filename}")
with open(filename, 'r') as file:
self.dati = [line.strip().replace('.', '') for line in file.readlines()]
preview_text = '\n'.join(self.dati[:5]) + "\n..."
                self.binary_preview.delete('1.0', tk.END)
self.binary_preview.insert('1.0', preview_text)
self.queue.put(("update", f"File binario caricato: {len(self.dati)} righe"))
except Exception as e:
self.queue.put(("error", f"Errore caricamento file binario: {str(e)}"))

def svuota_carrello(self):
"""Clear cart"""
        self.carrello = [None] * 7
        self.carrello_label.config(text=self._format_carrello())

def update_results_label(self):
"""Update the results label with decimal results and associated information"""
        result_text = "Risultati Analisi:\n"
        for bit_pos, (decimal_value, n_estrazioni) in self.decimal_results.items():
result_text += f"Decimale ricostruito: {decimal_value}\n"
            result_text += f"rilevato {decimal_value} in posizione {bit_pos} con ultime {n_estrazioni} estrazioni\n"
        self.results_text.insert(tk.END, result_text + "\n")

def update_final_summary(self):
"""Update the final summary with all decimal results"""
        final_summary = "\nREPORT FINALE \"pulito\"\n\n"
        for bit_pos, (decimal_value, n_estrazioni) in self.decimal_results.items():
final_summary += f"Decimale ricostruito: {decimal_value}\n"
            final_summary += f"rilevato {decimal_value} in posizione {bit_pos} con ultime {n_estrazioni} estrazioni\n"
        self.results_text.insert(tk.END, final_summary + "\n")

def copy_results(self):
"""Copy the content of the results text area to the clipboard"""
        self.root.clipboard_clear()
self.root.clipboard_append(self.results_text.get("1.0", tk.END))
messagebox.showinfo("Copiato", "Contenuto copiato negli appunti")

def clear_results(self):
"""Clear the content of the results text area"""
        self.results_text.delete("1.0", tk.END)

if __name__ == "__main__":
    root = tk.Tk()
    app = SequenzaSpiaApp(root)
    root.mainloop()

Questa versione analisi-binaria-potenziata15.py alla precedente non gli lega manco le scarpe... :)
Ottimizzata la versione realizzata con AI Claude Sonnet 3.5 grazie a Mistral (AI free senza limiti di utilizzo e parimenti multimodale e super power). Claude è molto più rapido e capisce al volo le richieste ma appunto vi si può chattare davvero poco in modo free. Mistral, almeno per adesso, è free e praticamente senza limiti di chat... Per correggere alcune cose è stato fondamentale anche GoogleNotebookLM un'altra ai free_ghi_issima... :) . Il soprastante test con 22 in I° si riferisce alla ruota di BA.
OK questo sono riuscito a metterlo a posto..tuttavia mi chiede di caricare estrazioni.txt che ovviamente non ho e devo crearlo
 
ciao max dovrebbero esserci tutte e formattate secondo quanto indicato da tom, se c'è qualche errore fammelo sapere

ti posto anche i due programmini per creare i file ruote txt e formattarle
 

Allegati

Ultima estrazione Lotto

  • Estrazione del lotto
    venerdì 07 febbraio 2025
    Bari
    34
    74
    37
    64
    59
    Cagliari
    75
    88
    34
    19
    43
    Firenze
    01
    31
    73
    34
    37
    Genova
    44
    53
    48
    74
    01
    Milano
    03
    76
    21
    83
    31
    Napoli
    38
    09
    16
    28
    56
    Palermo
    09
    90
    14
    62
    83
    Roma
    66
    62
    17
    27
    78
    Torino
    79
    13
    67
    30
    55
    Venezia
    76
    09
    20
    18
    60
    Nazionale
    22
    21
    66
    04
    47
    Estrazione Simbolotto
    Cagliari
    15
    37
    24
    44
    42
Indietro
Alto