Novità

Script biambo

il mio script in python ci mette circa 6 minuti ad analizzare gli 8 milioni di bi ambi . Ora come selezioni gli ambi da giocare ? Se vuoi ti passo lo script .
 
Codice:
"""
BIAMBI CON RITARDO MASSIMO STORICO <= SOGLIA + RITARDO ATTUALE
===============================================================
Modifiche rispetto alla versione precedente:
  - 11 ruote (inclusa la Nazionale)
  - Ricerca parte dall'estrazione con ID = 8117
"""

import os
import sys
import time
import numpy as np
from itertools import combinations

ARCHIVIO  = r"C:\Users\HP\AppData\Roaming\spaziometria\ArcTlv\Archivio.txt"
OUTPUT    = r"C:\Users\HP\Desktop\biambi_sotto79.txt"
SOGLIA    = 100
ID_INIZIO = 8117   # prima estrazione da considerare (1-based)

NUM_RUOTE    = 11   # tutte e 11 le ruote inclusa Nazionale
NUM_ESTRATTI = 5
NUM_AMBI     = 4005
NUM_COPPIE   = 8_018_010

COMBO_5_2 = list(combinations(range(NUM_ESTRATTI), 2))

NOMI_RUOTE = [
    "Bari","Cagliari","Firenze","Genova","Milano",
    "Napoli","Palermo","Roma","Torino","Venezia","Nazionale"
]


def ambo_idx(a, b):
    if a > b: a, b = b, a
    return (a - 1) * 90 - a * (a - 1) // 2 + (b - a - 1)

def idx_to_ambo(idx):
    a = 1
    while idx >= (90 - a):
        idx -= (90 - a)
        a += 1
    return a, a + 1 + idx

def coppia_idx(i, j):
    if i > j: i, j = j, i
    return i * (NUM_AMBI - 1) - i * (i + 1) // 2 + j - 1

def idx_to_coppia(ci):
    i = 0
    while ci >= (NUM_AMBI - 1 - i):
        ci -= (NUM_AMBI - 1 - i)
        i += 1
    return i, i + 1 + ci

def fmt(d): return f"{d[:2]}/{d[2:4]}/{d[4:]}"


def leggi_archivio(path):
    estrazioni, date = [], []
    with open(path, "r", encoding="utf-8") as f:
        for lineno, line in enumerate(f, 1):
            line = line.strip()
            if not line: continue
            if len(line) < 118:
                print(f"  [WARN] riga {lineno} corta, saltata.")
                continue

            # Salta le estrazioni prima di ID_INIZIO
            if lineno < ID_INIZIO:
                continue

            data, cifre = line[:8], line[8:118]
            ruote = []
            for r in range(11):   # legge tutte e 11
                off = r * NUM_ESTRATTI * 2
                nums = []
                for e in range(NUM_ESTRATTI):
                    try: nums.append(int(cifre[off + e*2 : off + e*2 + 2]))
                    except: nums.append(0)
                ruote.append(nums)
            date.append(data)
            estrazioni.append(ruote)
    return np.array(estrazioni, dtype=np.int16), date


def build_arrays():
    print("  Precalcolo array coppie...", end=" ", flush=True)
    t0 = time.time()
    ambo_i_arr = np.empty(NUM_COPPIE, dtype=np.int32)
    ambo_j_arr = np.empty(NUM_COPPIE, dtype=np.int32)
    ci = 0
    for i in range(NUM_AMBI):
        n = NUM_AMBI - i - 1
        ambo_i_arr[ci:ci+n] = i
        ambo_j_arr[ci:ci+n] = np.arange(i+1, NUM_AMBI, dtype=np.int32)
        ci += n
    print(f"fatto in {time.time()-t0:.1f}s")
    return ambo_i_arr, ambo_j_arr


def calcola(arr, ambo_i_arr, ambo_j_arr):
    N = arr.shape[0]
    print(f"\n  Estrazioni usate : {N:,}  (dal ID {ID_INIZIO} in poi)")
    print(f"  Ruote            : {NUM_RUOTE} ({', '.join(NOMI_RUOTE)})")
    print(f"  Coppie           : {NUM_COPPIE:,}")
    print(f"  Soglia           : <= {SOGLIA}\n")

    rit_cor = np.zeros(NUM_COPPIE, dtype=np.uint16)
    rit_max = np.zeros(NUM_COPPIE, dtype=np.uint16)

    t0 = time.time()

    for idx_e in range(N):
        if idx_e % 200 == 0:
            el  = time.time() - t0
            pct = idx_e / N * 100
            eta = (el / (idx_e + 1)) * (N - idx_e) if idx_e > 0 else 0
            print(f"  [{idx_e:6,}/{N:,}]  {pct:.1f}%  ETA: {eta:.0f}s    ", end="\r")

        # Ambi usciti su tutte le 11 ruote
        ambi_usciti = set()
        for r in range(NUM_RUOTE):
            nums = arr[idx_e, r]
            for c1, c2 in COMBO_5_2:
                a, b = int(nums[c1]), int(nums[c2])
                if a > 0 and b > 0:
                    ambi_usciti.add(ambo_idx(a, b))

        if not ambi_usciti:
            rit_cor += 1
            continue

        ambi_arr = np.fromiter(ambi_usciti, dtype=np.int32)
        mask = np.isin(ambo_i_arr, ambi_arr) | np.isin(ambo_j_arr, ambi_arr)

        rit_max[mask] = np.maximum(rit_max[mask], rit_cor[mask])
        rit_cor[mask] = 0
        rit_cor += 1

    # Fine archivio: aggiorna max con ritardi aperti
    np.maximum(rit_max, rit_cor, out=rit_max)

    print(f"\n  Completato in {time.time()-t0:.1f}s")
    return rit_max, rit_cor


def salva(rit_max, rit_att, date):
    print(f"\n  Filtro coppie con rit_max <= {SOGLIA}...")

    idx_ok  = np.where(rit_max <= SOGLIA)[0]
    ord_key = np.lexsort((-rit_att[idx_ok], rit_max[idx_ok]))
    idx_ok  = idx_ok[ord_key]
    totale  = len(idx_ok)
    print(f"  Coppie trovate: {totale:,}")

    print("\n" + "="*58)
    print(f"  BIAMBI CON RITARDO MASSIMO STORICO <= {SOGLIA}")
    print(f"  Dal ID {ID_INIZIO}: {fmt(date[0])} → {fmt(date[-1])}")
    print(f"  Ruote: tutte e 11 (inclusa Nazionale)")
    print(f"  Trovate: {totale:,}")
    print("="*58)
    print(f"  {'Pos':>8}  {'Ambo 1':>7}  {'Ambo 2':>7}  {'Rit.Max':>8}  {'Rit.Att':>8}")
    print("  " + "-"*52)

    righe = []
    for rank, ci in enumerate(idx_ok, 1):
        ai, aj = idx_to_coppia(int(ci))
        a1, b1 = idx_to_ambo(ai)
        a2, b2 = idx_to_ambo(aj)
        mx  = int(rit_max[ci])
        att = int(rit_att[ci])
        riga = f"{rank:>8}.  {a1:02d}-{b1:02d}     {a2:02d}-{b2:02d}  {mx:>8}  {att:>8}"
        righe.append(riga)
        if rank <= 50:
            print("  " + riga)

    if totale > 50:
        print(f"\n  ... totale {totale:,} coppie — tutte nel file")
    print("="*58)

    header = (
        f"BIAMBI CON RITARDO MASSIMO STORICO <= {SOGLIA}\n"
        f"Archivio  : {fmt(date[0])} -> {fmt(date[-1])}\n"
        f"ID inizio : {ID_INIZIO}\n"
        f"Estrazioni: {len(date):,}\n"
        f"Ruote     : 11 (inclusa Nazionale)\n"
        f"Trovate   : {totale:,} coppie\n"
        f"{'='*58}\n"
        f"{'Pos':>8}  {'Ambo 1':>7}  {'Ambo 2':>7}  {'Rit.Max':>8}  {'Rit.Att':>8}\n"
        f"{'-'*54}\n"
    )
    os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
    with open(OUTPUT, "w", encoding="utf-8") as f:
        f.write(header)
        for r in righe:
            f.write(r.strip() + "\n")
    print(f"\n  File salvato: {OUTPUT}")
    return totale


def main():
    print("╔══════════════════════════════════════════════════════════════╗")
    print("║   BIAMBI CON RITARDO MAX STORICO <= SOGLIA — LOTTO          ║")
    print("║   (11 ruote inclusa Nazionale - dal ID 8117)                 ║")
    print("╚══════════════════════════════════════════════════════════════╝\n")

    if not os.path.exists(ARCHIVIO):
        print(f"[ERRORE] Archivio non trovato: {ARCHIVIO}")
        sys.exit(1)

    print(f"  Lettura archivio: {ARCHIVIO}")
    print(f"  ID inizio       : {ID_INIZIO}")
    arr, date = leggi_archivio(ARCHIVIO)
    print(f"  Righe lette: {len(date):,}  ({fmt(date[0])} → {fmt(date[-1])})")

    ambo_i_arr, ambo_j_arr = build_arrays()
    rit_max, rit_att = calcola(arr, ambo_i_arr, ambo_j_arr)
    totale = salva(rit_max, rit_att, date)

    print(f"\n  Coppie totali  : {NUM_COPPIE:,}")
    print(f"  Coppie <= {SOGLIA}  : {totale:,}")
    print(f"  Percentuale    : {totale/NUM_COPPIE*100:.4f}%")
    print("\n  Arrivederci!")

if __name__ == "__main__":
    main()
 
IO USO L' INTERFACCIA THONNY . DOVRESTI SCARICARLO E POI INCOLLARE LO SCRIPT NELL' INTERFACCIA DI THONNY . TIPO SPAZIOSCRIPTCINZIA.jpg
 
Genios, visto che ci mette così poco, vorrei arrivare ad un tot di ambi ( novambi o decambi) che abbiano un mx st 14 o inferiore.
Puoi farlo tu? Io poi te li controllo.
 
Buonasera genios mi puoi aiutare
ARCHIVIO = r"C:\Users\Evandro\AppData\Roaming\spaziometria\ArcTlv\Archivio.txt"
OUTPUT = r"C:\Users\Evandro\Desktop\biambi_sotto79.txt"
quando lancio il tuo programma il mio archivio ArcTlv\Archivio.txt è fermo al 13/05/2023, come si aggiorna su spaziometria?. E poi la cartella per il salvataggio deve essere nominata biambi_sotto79.txt?, provando con archivio non aggiornato non salva nella cartella. Grazie
 
Buonasera genios mi puoi aiutare
ARCHIVIO = r"C:\Users\Evandro\AppData\Roaming\spaziometria\ArcTlv\Archivio.txt"
OUTPUT = r"C:\Users\Evandro\Desktop\biambi_sotto79.txt"
quando lancio il tuo programma il mio archivio ArcTlv\Archivio.txt è fermo al 13/05/2023, come si aggiorna su spaziometria?. E poi la cartella per il salvataggio deve essere nominata biambi_sotto79.txt?, provando con archivio non aggiornato non salva nella cartella. Grazie
devi scaricare il programmma spaziometria forever
 
Provato lo script python di Genios un pò risistemato mi esce questa lista :
 

Allegati

  • Screenshot 2026-05-26 203239.png
    Screenshot 2026-05-26 203239.png
    173 KB · Visite: 18
  • Screenshot 2026-05-26 203255.png
    Screenshot 2026-05-26 203255.png
    172,2 KB · Visite: 18
  • Screenshot 2026-05-26 203307.png
    Screenshot 2026-05-26 203307.png
    174,4 KB · Visite: 17
La prassi come avevo suggerito in precedenza ,
Acquafresca, quale interfaccia stai utilizzando?
lo script che e fatto per essere eseguibile con Python 3.12 (versione stabile) che dovresti o averlo installato oppure dovresti installare ,dopo di che la prassi per aprilo è questa :
Crea una nuova cartella sul desktop e dai un Nome (esempio: Biambi)
Dentro alla nuova cartella ,crea un documento di testo che sia (o Blocco Note o World ) dove andrai ad fare il copia /incolla dello script che ti ho postato e salvarlo con nome (esempio: Biambi.py)o altro nome a piacimento
Rimanendo nella cartella si va' sù nella barra dove appare il nome della nuova cartella (esempio <Cartella nuova 7>) e scrivere il comando CMD e premere Invio (dopo questo passaggio ti troverai nella schermata nera tipo Dos )
Al momento che ti appare la scritta < C: desktop.......) aggiungi il seguente comando : python -m PyInstaller --onefile --noconsole Biambi.py (o nome a tuo piacimento) dopo questa prassi vedrai scorrere un a barcata di file ,lascia finire il processo senza interrompe
Quando il comando EXE(Eseguibile )ha finito di installare tutte le varie librerie ,avrà la figura di un foglio di testo ma evidenziato col simbolo di Python
a fine procedimento nella cartella si aggiungeranno nuovi file di cui ci sarà il file Dist e uno Build
nel file Dist (devi inserire il file dell'archivio estrazioni aggiornato in formato Csv oppure (xls)
Arrivati a questo punto clicca a vuoto nella cartella dove sono tutti i nuovi file ,nelle barre superiore digita (cmd ) e premi invio ,si aprirà la schermata nera tipo (DOS) ti porta in <C:\)(nome cartella) devi aggiungere < python Biambi.py > screenshot il mio e come appare evidenziato in bianco, poi io uso l'archivio estrazioni in formato (estrazioni.csv) file con estensione di LibreOffice, Il codice e cosi copialo con tutte le (""" ) dal'inizio alla fine):spero di aver dato le spiegazioni giuste,per renderlo più semplice bisognerebbe creare un (file exe eseguibile tipo Programmino)io al momento non ci sono riuscito.
Codice:

"""
BIAMBI CON RITARDO MASSIMO STORICO <= SOGLIA + RITARDO ATTUALE
===============================================================
Versione ottimizzata per CSV con separatore a virgola
- 11 ruote (inclusa la Nazionale)
- Ricerca parte dall'estrazione con ID = 8117
"""

import os
import sys
import time
import csv
import numpy as np
from itertools import combinations

# --- CONFIGURAZIONE PERCORSI AUTOMATICI ---
if getattr(sys, 'frozen', False):
cartella_exe = os.path.dirname(sys.executable)
else:
cartella_exe = os.path.dirname(os.path.abspath(__file__))

ARCHIVIO = os.path.join(cartella_exe, "estrazioni.csv")
OUTPUT = os.path.join(cartella_exe, "biambi_sotto79.txt")

SOGLIA = 100
ID_INIZIO = 8117 # prima estrazione da considerare (1-based)

NUM_RUOTE = 11 # tutte e 11 le ruote inclusa Nazionale
NUM_ESTRATTI = 5
NUM_AMBI = 4005
NUM_COPPIE = 8_018_010

COMBO_5_2 = list(combinations(range(NUM_ESTRATTI), 2))

NOMI_RUOTE = [
"Bari","Cagliari","Firenze","Genova","Milano",
"Napoli","Palermo","Roma","Torino","Venezia","Nazionale"
]


def ambo_idx(a, b):
if a > b: a, b = b, a
return (a - 1) * 90 - a * (a - 1) // 2 + (b - a - 1)

def idx_to_ambo(idx):
a = 1
while idx >= (90 - a):
idx -= (90 - a)
a += 1
return a, a + 1 + idx

def coppia_idx(i, j):
if i > j: i, j = j, i
return i * (NUM_AMBI - 1) - i * (i + 1) // 2 + j - 1

def idx_to_coppia(ci):
i = 0
while ci >= (NUM_AMBI - 1 - i):
ci -= (NUM_AMBI - 1 - i)
i += 1
return i, i + 1 + ci

# Corretta la formattazione della data visto che nel CSV è già nel formato DD/MM/YYYY
def fmt(d):
return str(d)


def leggi_archivio(path):
estrazioni, date = [], []

with open(path, "r", encoding="utf-8") as f:
reader = csv.reader(f)

for lineno, row in enumerate(reader, 1):
if not row:
continue
# Salta l'intestazione del file CSV
if lineno == 1 or row[0].lower().startswith("data"):
continue

# Verifica se siamo arrivati all'ID di partenza richiesto
# Consideriamo lineno-1 perché abbiamo saltato la riga di intestazione
id_reale = lineno - 1
if id_reale < ID_INIZIO:
continue

data = row[0]

# Nel tuo CSV i numeri utili iniziano dopo la data (indice 1)
# Prendiamo tutti i valori non vuoti successivi alla data
valori_numerici = [int(float(x)) for x in row[1:] if x.strip() != ""]

# Costruiamo la struttura delle 11 ruote (5 numeri ciascuna)
# 11 ruote * 5 estratti = 55 numeri totali sequenziali
ruote = []
for r in range(NUM_RUOTE):
off = r * NUM_ESTRATTI
# Estraiamo i 5 numeri della ruota corrente
nums = valori_numerici[off : off + NUM_ESTRATTI]
ruote.append(nums)

date.append(data)
estrazioni.append(ruote)

return np.array(estrazioni, dtype=np.int16), date


def build_arrays():
print(" Precalcolo array coppie...", end=" ", flush=True)
t0 = time.time()
ambo_i_arr = np.empty(NUM_COPPIE, dtype=np.int32)
ambo_j_arr = np.empty(NUM_COPPIE, dtype=np.int32)
ci = 0
for i in range(NUM_AMBI):
n = NUM_AMBI - i - 1
ambo_i_arr[ci:ci+n] = i
ambo_j_arr[ci:ci+n] = np.arange(i+1, NUM_AMBI, dtype=np.int32)
ci += n
print(f"fatto in {time.time()-t0:.1f}s")
return ambo_i_arr, ambo_j_arr


def calcola(arr, ambo_i_arr, ambo_j_arr):
N = arr.shape[0]
print(f"\n Estrazioni usate : {N:,} (dal ID {ID_INIZIO} in poi)")
print(f" Ruote : {NUM_RUOTE} ({', '.join(NOMI_RUOTE)})")
print(f" Coppie : {NUM_COPPIE:,}")
print(f" Soglia : <= {SOGLIA}\n")

rit_cor = np.zeros(NUM_COPPIE, dtype=np.uint16)
rit_max = np.zeros(NUM_COPPIE, dtype=np.uint16)

t0 = time.time()

for idx_e in range(N):
if idx_e % 200 == 0:
el = time.time() - t0
pct = idx_e / N * 100
eta = (el / (idx_e + 1)) * (N - idx_e) if idx_e > 0 else 0
print(f" [{idx_e:6,}/{N:,}] {pct:.1f}% ETA: {eta:.0f}s ", end="\r")

# Ambi usciti su tutte le 11 ruote
ambi_usciti = set()
for r in range(NUM_RUOTE):
nums = arr[idx_e, r]
for c1, c2 in COMBO_5_2:
a, b = int(nums[c1]), int(nums[c2])
if a > 0 and b > 0:
ambi_usciti.add(ambo_idx(a, b))

if not ambi_usciti:
rit_cor += 1
continue

ambi_arr = np.fromiter(ambi_usciti, dtype=np.int32)
mask = np.isin(ambo_i_arr, ambi_arr) | np.isin(ambo_j_arr, ambi_arr)

rit_max[mask] = np.maximum(rit_max[mask], rit_cor[mask])
rit_cor[mask] = 0
rit_cor += 1

# Fine archivio: aggiorna max con ritardi aperti
np.maximum(rit_max, rit_cor, out=rit_max)

print(f"\n Completato in {time.time()-t0:.1f}s")
return rit_max, rit_cor


def salva(rit_max, rit_att, date):
print(f"\n Filtro coppie con rit_max <= {SOGLIA}...")

idx_ok = np.where(rit_max <= SOGLIA)[0]
ord_key = np.lexsort((-rit_att[idx_ok], rit_max[idx_ok]))
idx_ok = idx_ok[ord_key]
totale = len(idx_ok)
print(f" Coppie trovate: {totale:,}")

print("\n" + "="*58)
print(f" BIAMBI CON RITARDO MASSIMO STORICO <= {SOGLIA}")
print(f" Dal ID {ID_INIZIO}: {fmt(date[0])} → {fmt(date[-1])}")
print(f" Ruote: tutte e 11 (inclusa Nazionale)")
print(f" Trovate: {totale:,}")
print("="*58)
print(f" {'Pos':>8} {'Ambo 1':>7} {'Ambo 2':>7} {'Rit.Max':>8} {'Rit.Att':>8}")
print(" " + "-"*52)

righe = []
for rank, ci in enumerate(idx_ok, 1):
ai, aj = idx_to_coppia(int(ci))
a1, b1 = idx_to_ambo(ai)
a2, b2 = idx_to_ambo(aj)
mx = int(rit_max[ci])
att = int(rit_att[ci])
riga = f"{rank:>8}. {a1:02d}-{b1:02d} {a2:02d}-{b2:02d} {mx:>8} {att:>8}"
righe.append(riga)
if rank <= 50:
print(" " + riga)

if totale > 50:
print(f"\n ... totale {totale:,} coppie — tutte nel file")
print("="*58)

header = (
f"BIAMBI CON RITARDO MASSIMO STORICO <= {SOGLIA}\n"
f"Archivio : {fmt(date[0])} -> {fmt(date[-1])}\n"
f"ID inizio : {ID_INIZIO}\n"
f"Estrazioni: {len(date):,}\n"
f"Ruote : 11 (inclusa Nazionale)\n"
f"Trovate : {totale:,} coppie\n"
f"{'='*58}\n"
f"{'Pos':>8} {'Ambo 1':>7} {'Ambo 2':>7} {'Rit.Max':>8} {'Rit.Att':>8}\n"
f"{'-'*54}\n"
)
os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
with open(OUTPUT, "w", encoding="utf-8") as f:
f.write(header)
for r in righe:
f.write(r.strip() + "\n")
print(f"\n File salvato: {OUTPUT}")
return totale


def main():
print("╔══════════════════════════════════════════════════════════════╗")
print("║ BIAMBI CON RITARDO MAX STORICO <= SOGLIA — LOTTO ║")
print("║ (11 ruote inclusa Nazionale - dal ID 8117) ║")
print("╚══════════════════════════════════════════════════════════════╝\n")

if not os.path.exists(ARCHIVIO):
print(f"[ERRORE] Archivio non trovato in: {ARCHIVIO}")
print("Metti il file 'estrazioni.csv' nella stessa cartella dell'eseguibile!")
input("\nPremi INVIO per uscire...")
sys.exit(1)

print(f" Lettura archivio: {ARCHIVIO}")
print(f" ID inizio : {ID_INIZIO}")
arr, date = leggi_archivio(ARCHIVIO)
print(f" Righe lette: {len(date):,} ({fmt(date[0])} → {fmt(date[-1])})")

ambo_i_arr, ambo_j_arr = build_arrays()
rit_max, rit_att = calcola(arr, ambo_i_arr, ambo_j_arr)
totale = salva(rit_max, rit_att, date)

print(f"\n Coppie totali : {NUM_COPPIE:,}")
print(f" Coppie <= {SOGLIA} : {totale:,}")
print(f" Percentuale : {totale/NUM_COPPIE*100:.4f}%")
print("\n Arrivederci!")

input("\nPremi INVIO per chiudere il programma...")

if __name__ == "__main__":
main()
 

Allegati

  • Screenshot 2026-05-27 160718.png
    Screenshot 2026-05-27 160718.png
    137 KB · Visite: 4
Ultima modifica:
La prassi come avevo suggerito in precedenza ,

lo script che e fatto per essere eseguibile con Python 3.12 (versione stabile) che dovresti o averlo installato oppure dovresti installare ,dopo di che la prassi per aprilo è questa :
Crea una nuova cartella sul desktop e dai un Nome
Dentro alla nuova cartella ,crea un documento di testo che sia (o Blocco Note o World ) dove andrai ad fare il copia /incolla dello script che ti ho postato e salvarlo con nome (esempio: Biambi.py)o altro nome a piacimento
Rimanendo nella cartella si va' sù nella barra dove appare il nome della nuova cartella (esempio <Cartella nuova 7>) e scrivere il comando CMD e premere Invio (dopo questo passaggio ti troverai nella schermata nera tipo Dos )
Al momento che ti appare la scritta < C: desktop.......) aggiungi il seguente comando : python -m PyInstaller --onefile --noconsole Biambi.py (o nome a tuo piacimento) dopo questa prassi vedrai scorrere un a barcata di file ,lascia finire il processo senza interrompe
Quando il comando EXE(Eseguibile )ha finito di installare tutte le varie librerie ,avrà la figura di un foglio di testo ma evidenziato col simbolo di Python
a fine procedimento nella cartella si aggiungeranno nuovi file di cui ci sarà il file Dist e uno Build
nel file Dist (devi inserire il file dell'archivio estrazioni aggiornato in formato Csv oppure (xls)
Arrivati a questo punto clicca a vuoto nella cartella dove sono tutti i nuovi file ,nelle barre superiore digita (cmd ) e premi invio ,si aprirà la schermata nera tipo (DOS) ti porta in <C:\)(nome cartella) devi aggiungere < python Biambi.py > screenshot il mio e come appare evidenziato in bianco, poi io uso l'archivio estrazioni in formato (estrazioni.csv) file con estensione di LibreOffice, Il codice e cosi copialo con tutte le (""" ) dal'inizio alla fine):spero di aver dato le spiegazioni giuste,per renderlo più semplice bisognerebbe creare un (file exe eseguibile tipo Programmino)io al momento non ci sono riuscito.
Codice:

"""
BIAMBI CON RITARDO MASSIMO STORICO <= SOGLIA + RITARDO ATTUALE
===============================================================
Versione ottimizzata per CSV con separatore a virgola
- 11 ruote (inclusa la Nazionale)
- Ricerca parte dall'estrazione con ID = 8117
"""

import os
import sys
import time
import csv
import numpy as np
from itertools import combinations

# --- CONFIGURAZIONE PERCORSI AUTOMATICI ---
if getattr(sys, 'frozen', False):
cartella_exe = os.path.dirname(sys.executable)
else:
cartella_exe = os.path.dirname(os.path.abspath(__file__))

ARCHIVIO = os.path.join(cartella_exe, "estrazioni.csv")
OUTPUT = os.path.join(cartella_exe, "biambi_sotto79.txt")

SOGLIA = 100
ID_INIZIO = 8117 # prima estrazione da considerare (1-based)

NUM_RUOTE = 11 # tutte e 11 le ruote inclusa Nazionale
NUM_ESTRATTI = 5
NUM_AMBI = 4005
NUM_COPPIE = 8_018_010

COMBO_5_2 = list(combinations(range(NUM_ESTRATTI), 2))

NOMI_RUOTE = [
"Bari","Cagliari","Firenze","Genova","Milano",
"Napoli","Palermo","Roma","Torino","Venezia","Nazionale"
]


def ambo_idx(a, b):
if a > b: a, b = b, a
return (a - 1) * 90 - a * (a - 1) // 2 + (b - a - 1)

def idx_to_ambo(idx):
a = 1
while idx >= (90 - a):
idx -= (90 - a)
a += 1
return a, a + 1 + idx

def coppia_idx(i, j):
if i > j: i, j = j, i
return i * (NUM_AMBI - 1) - i * (i + 1) // 2 + j - 1

def idx_to_coppia(ci):
i = 0
while ci >= (NUM_AMBI - 1 - i):
ci -= (NUM_AMBI - 1 - i)
i += 1
return i, i + 1 + ci

# Corretta la formattazione della data visto che nel CSV è già nel formato DD/MM/YYYY
def fmt(d):
return str(d)


def leggi_archivio(path):
estrazioni, date = [], []

with open(path, "r", encoding="utf-8") as f:
reader = csv.reader(f)

for lineno, row in enumerate(reader, 1):
if not row:
continue
# Salta l'intestazione del file CSV
if lineno == 1 or row[0].lower().startswith("data"):
continue

# Verifica se siamo arrivati all'ID di partenza richiesto
# Consideriamo lineno-1 perché abbiamo saltato la riga di intestazione
id_reale = lineno - 1
if id_reale < ID_INIZIO:
continue

data = row[0]

# Nel tuo CSV i numeri utili iniziano dopo la data (indice 1)
# Prendiamo tutti i valori non vuoti successivi alla data
valori_numerici = [int(float(x)) for x in row[1:] if x.strip() != ""]

# Costruiamo la struttura delle 11 ruote (5 numeri ciascuna)
# 11 ruote * 5 estratti = 55 numeri totali sequenziali
ruote = []
for r in range(NUM_RUOTE):
off = r * NUM_ESTRATTI
# Estraiamo i 5 numeri della ruota corrente
nums = valori_numerici[off : off + NUM_ESTRATTI]
ruote.append(nums)

date.append(data)
estrazioni.append(ruote)

return np.array(estrazioni, dtype=np.int16), date


def build_arrays():
print(" Precalcolo array coppie...", end=" ", flush=True)
t0 = time.time()
ambo_i_arr = np.empty(NUM_COPPIE, dtype=np.int32)
ambo_j_arr = np.empty(NUM_COPPIE, dtype=np.int32)
ci = 0
for i in range(NUM_AMBI):
n = NUM_AMBI - i - 1
ambo_i_arr[ci:ci+n] = i
ambo_j_arr[ci:ci+n] = np.arange(i+1, NUM_AMBI, dtype=np.int32)
ci += n
print(f"fatto in {time.time()-t0:.1f}s")
return ambo_i_arr, ambo_j_arr


def calcola(arr, ambo_i_arr, ambo_j_arr):
N = arr.shape[0]
print(f"\n Estrazioni usate : {N:,} (dal ID {ID_INIZIO} in poi)")
print(f" Ruote : {NUM_RUOTE} ({', '.join(NOMI_RUOTE)})")
print(f" Coppie : {NUM_COPPIE:,}")
print(f" Soglia : <= {SOGLIA}\n")

rit_cor = np.zeros(NUM_COPPIE, dtype=np.uint16)
rit_max = np.zeros(NUM_COPPIE, dtype=np.uint16)

t0 = time.time()

for idx_e in range(N):
if idx_e % 200 == 0:
el = time.time() - t0
pct = idx_e / N * 100
eta = (el / (idx_e + 1)) * (N - idx_e) if idx_e > 0 else 0
print(f" [{idx_e:6,}/{N:,}] {pct:.1f}% ETA: {eta:.0f}s ", end="\r")

# Ambi usciti su tutte le 11 ruote
ambi_usciti = set()
for r in range(NUM_RUOTE):
nums = arr[idx_e, r]
for c1, c2 in COMBO_5_2:
a, b = int(nums[c1]), int(nums[c2])
if a > 0 and b > 0:
ambi_usciti.add(ambo_idx(a, b))

if not ambi_usciti:
rit_cor += 1
continue

ambi_arr = np.fromiter(ambi_usciti, dtype=np.int32)
mask = np.isin(ambo_i_arr, ambi_arr) | np.isin(ambo_j_arr, ambi_arr)

rit_max[mask] = np.maximum(rit_max[mask], rit_cor[mask])
rit_cor[mask] = 0
rit_cor += 1

# Fine archivio: aggiorna max con ritardi aperti
np.maximum(rit_max, rit_cor, out=rit_max)

print(f"\n Completato in {time.time()-t0:.1f}s")
return rit_max, rit_cor


def salva(rit_max, rit_att, date):
print(f"\n Filtro coppie con rit_max <= {SOGLIA}...")

idx_ok = np.where(rit_max <= SOGLIA)[0]
ord_key = np.lexsort((-rit_att[idx_ok], rit_max[idx_ok]))
idx_ok = idx_ok[ord_key]
totale = len(idx_ok)
print(f" Coppie trovate: {totale:,}")

print("\n" + "="*58)
print(f" BIAMBI CON RITARDO MASSIMO STORICO <= {SOGLIA}")
print(f" Dal ID {ID_INIZIO}: {fmt(date[0])} → {fmt(date[-1])}")
print(f" Ruote: tutte e 11 (inclusa Nazionale)")
print(f" Trovate: {totale:,}")
print("="*58)
print(f" {'Pos':>8} {'Ambo 1':>7} {'Ambo 2':>7} {'Rit.Max':>8} {'Rit.Att':>8}")
print(" " + "-"*52)

righe = []
for rank, ci in enumerate(idx_ok, 1):
ai, aj = idx_to_coppia(int(ci))
a1, b1 = idx_to_ambo(ai)
a2, b2 = idx_to_ambo(aj)
mx = int(rit_max[ci])
att = int(rit_att[ci])
riga = f"{rank:>8}. {a1:02d}-{b1:02d} {a2:02d}-{b2:02d} {mx:>8} {att:>8}"
righe.append(riga)
if rank <= 50:
print(" " + riga)

if totale > 50:
print(f"\n ... totale {totale:,} coppie — tutte nel file")
print("="*58)

header = (
f"BIAMBI CON RITARDO MASSIMO STORICO <= {SOGLIA}\n"
f"Archivio : {fmt(date[0])} -> {fmt(date[-1])}\n"
f"ID inizio : {ID_INIZIO}\n"
f"Estrazioni: {len(date):,}\n"
f"Ruote : 11 (inclusa Nazionale)\n"
f"Trovate : {totale:,} coppie\n"
f"{'='*58}\n"
f"{'Pos':>8} {'Ambo 1':>7} {'Ambo 2':>7} {'Rit.Max':>8} {'Rit.Att':>8}\n"
f"{'-'*54}\n"
)
os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
with open(OUTPUT, "w", encoding="utf-8") as f:
f.write(header)
for r in righe:
f.write(r.strip() + "\n")
print(f"\n File salvato: {OUTPUT}")
return totale


def main():
print("╔══════════════════════════════════════════════════════════════╗")
print("║ BIAMBI CON RITARDO MAX STORICO <= SOGLIA — LOTTO ║")
print("║ (11 ruote inclusa Nazionale - dal ID 8117) ║")
print("╚══════════════════════════════════════════════════════════════╝\n")

if not os.path.exists(ARCHIVIO):
print(f"[ERRORE] Archivio non trovato in: {ARCHIVIO}")
print("Metti il file 'estrazioni.csv' nella stessa cartella dell'eseguibile!")
input("\nPremi INVIO per uscire...")
sys.exit(1)

print(f" Lettura archivio: {ARCHIVIO}")
print(f" ID inizio : {ID_INIZIO}")
arr, date = leggi_archivio(ARCHIVIO)
print(f" Righe lette: {len(date):,} ({fmt(date[0])} → {fmt(date[-1])})")

ambo_i_arr, ambo_j_arr = build_arrays()
rit_max, rit_att = calcola(arr, ambo_i_arr, ambo_j_arr)
totale = salva(rit_max, rit_att, date)

print(f"\n Coppie totali : {NUM_COPPIE:,}")
print(f" Coppie <= {SOGLIA} : {totale:,}")
print(f" Percentuale : {totale/NUM_COPPIE*100:.4f}%")
print("\n Arrivederci!")

input("\nPremi INVIO per chiudere il programma...")

if __name__ == "__main__":
main()
 
Ultima analisi con file estrazioni aggiornato al 26/05/2026
 

Allegati

  • Screenshot 2026-05-27 162324.png
    Screenshot 2026-05-27 162324.png
    181,1 KB · Visite: 6
  • Screenshot 2026-05-27 162352.png
    Screenshot 2026-05-27 162352.png
    176,5 KB · Visite: 2
  • Screenshot 2026-05-27 162358.png
    Screenshot 2026-05-27 162358.png
    179,9 KB · Visite: 4
Cosa hai sistemato ?
Ciao
Ho copiato tralasciando le doppie (""") iniziali e non mi partiva, dopo ho dovuto adattarlo al mio file archivio estrazioni ,e con l'aiuto dell'IA con le richieste dell'obbiettivo di Cinzia27 siamo arrivati a questo risultato, ovviamente potrebbe essere ancora migliorabile, riguardo a me è da poco tempo che mi sto incuriosendo fare script per Python.
 
Altro script per Cinzia27 verificare gli Biambi Sfaldati:che se qualche partecipante del forum più esperto potrebbe agganciarli sarebbe molto utile un eseguibile tipo icona su desktop.

Codice
"""
BIAMBI CON RITARDO MASSIMO STORICO <= SOGLIA + RITARDO ATTUALE
===============================================================
Versione ottimizzata per CSV con report dei biambi sfaldati nell'ultima estrazione
- 11 ruote (inclusa la Nazionale)
- Ricerca parte dall'estrazione con ID = 8117
"""

import os
import sys
import time
import csv
import numpy as np
from itertools import combinations

# --- CONFIGURAZIONE PERCORSI AUTOMATICI ---
if getattr(sys, 'frozen', False):
cartella_exe = os.path.dirname(sys.executable)
else:
cartella_exe = os.path.dirname(os.path.abspath(__file__))

ARCHIVIO = os.path.join(cartella_exe, "estrazioni.csv")
OUTPUT = os.path.join(cartella_exe, "biambi_sotto79.txt")
OUTPUT_SFALDATI = os.path.join(cartella_exe, "biambi_sfaldati.txt")

SOGLIA = 100
ID_INIZIO = 8117 # prima estrazione da considerare (1-based)

NUM_RUOTE = 11 # tutte e 11 le ruote inclusa Nazionale
NUM_ESTRATTI = 5
NUM_AMBI = 4005
NUM_COPPIE = 8_018_010

COMBO_5_2 = list(combinations(range(NUM_ESTRATTI), 2))

NOMI_RUOTE = [
"Bari","Cagliari","Firenze","Genova","Milano",
"Napoli","Palermo","Roma","Torino","Venezia","Nazionale"
]


def ambo_idx(a, b):
if a > b: a, b = b, a
return (a - 1) * 90 - a * (a - 1) // 2 + (b - a - 1)

def idx_to_ambo(idx):
a = 1
while idx >= (90 - a):
idx -= (90 - a)
a += 1
return a, a + 1 + idx

def coppia_idx(i, j):
if i > j: i, j = j, i
return i * (NUM_AMBI - 1) - i * (i + 1) // 2 + j - 1

def idx_to_coppia(ci):
i = 0
while ci >= (NUM_AMBI - 1 - i):
ci -= (NUM_AMBI - 1 - i)
i += 1
return i, i + 1 + ci

def fmt(d):
return str(d)


def leggi_archivio(path):
estrazioni, date = [], []

with open(path, "r", encoding="utf-8") as f:
reader = csv.reader(f)

for lineno, row in enumerate(reader, 1):
if not row or len(row) < 2:
continue

# Controllo corretto dell'intestazione (senza usare lower sulla lista)
testo_prima_cella = str(row[0]).strip().lower()
if lineno == 1 or testo_prima_cella.startswith("data"):
continue

id_reale = lineno - 1
if id_reale < ID_INIZIO:
continue

# La data è il primo elemento della riga
data = row[0]

# Converte i numeri saltando celle vuote
valori_numerici = []
for x in row[1:]:
if x.strip() != "":
try:
valori_numerici.append(int(float(x)))
except ValueError:
valori_numerici.append(0)

ruote = []
for r in range(NUM_RUOTE):
off = r * NUM_ESTRATTI
nums = valori_numerici[off : off + NUM_ESTRATTI]
# Se mancano numeri per la ruota inserisce zeri di riempimento
while len(nums) < NUM_ESTRATTI:
nums.append(0)
ruote.append(nums)

date.append(data)
estrazioni.append(ruote)

return np.array(estrazioni, dtype=np.int16), date


def build_arrays():
print(" Precalcolo array coppie...", end=" ", flush=True)
t0 = time.time()
ambo_i_arr = np.empty(NUM_COPPIE, dtype=np.int32)
ambo_j_arr = np.empty(NUM_COPPIE, dtype=np.int32)
ci = 0
for i in range(NUM_AMBI):
n = NUM_AMBI - i - 1
ambo_i_arr[ci:ci+n] = i
ambo_j_arr[ci:ci+n] = np.arange(i+1, NUM_AMBI, dtype=np.int32)
ci += n
print(f"fatto in {time.time()-t0:.1f}s")
return ambo_i_arr, ambo_j_arr


def calcola(arr, ambo_i_arr, ambo_j_arr):
N = arr.shape[0]
print(f"\n Estrazioni usate : {N:,} (dal ID {ID_INIZIO} in poi)")
print(f" Ruote : {NUM_RUOTE} ({', '.join(NOMI_RUOTE)})")
print(f" Coppie : {NUM_COPPIE:,}")
print(f" Soglia : <= {SOGLIA}\n")

rit_cor = np.zeros(NUM_COPPIE, dtype=np.uint16)
rit_max = np.zeros(NUM_COPPIE, dtype=np.uint16)

t0 = time.time()
ultimi_ambi_usciti = set()

for idx_e in range(N):
if idx_e % 200 == 0:
el = time.time() - t0
pct = idx_e / N * 100
eta = (el / (idx_e + 1)) * (N - idx_e) if idx_e > 0 else 0
print(f" [{idx_e:6,}/{N:,}] {pct:.1f}% ETA: {eta:.0f}s ", end="\r")

ambi_usciti = set()
for r in range(NUM_RUOTE):
nums = arr[idx_e, r]
for c1, c2 in COMBO_5_2:
a, b = int(nums[c1]), int(nums[c2])
if a > 0 and b > 0:
ambi_usciti.add(ambo_idx(a, b))

if idx_e == N - 1:
ultimi_ambi_usciti = ambi_usciti.copy()

if not ambi_usciti:
rit_cor += 1
continue

ambi_arr = np.fromiter(ambi_usciti, dtype=np.int32)
mask = np.isin(ambo_i_arr, ambi_arr) | np.isin(ambo_j_arr, ambi_arr)

rit_max[mask] = np.maximum(rit_max[mask], rit_cor[mask])
rit_cor[mask] = 0
rit_cor += 1

np.maximum(rit_max, rit_cor, out=rit_max)

print(f"\n Completato in {time.time()-t0:.1f}s")
return rit_max, rit_cor, ultimi_ambi_usciti


def salva(rit_max, rit_att, date, ultimi_ambi_usciti):
print(f"\n Filtro coppie con rit_max <= {SOGLIA}...")

idx_ok = np.where(rit_max <= SOGLIA)[0]
ord_key = np.lexsort((-rit_att[idx_ok], rit_max[idx_ok]))
idx_ok = idx_ok[ord_key]
totale = len(idx_ok)
print(f" Coppie trovate: {totale:,}")

print("\n" + "="*58)
print(f" BIAMBI CON RITARDO MASSIMO STORICO <= {SOGLIA}")
print(f" Dal ID {ID_INIZIO}: {fmt(date[0])} → {fmt(date[-1])}")
print(f" Ruote: tutte e 11 (inclusa Nazionale)")
print(f" Trovate: {totale:,}")
print("="*58)
print(f" {'Pos':>8} {'Ambo 1':>7} {'Ambo 2':>7} {'Rit.Max':>8} {'Rit.Att':>8}")
print(" " + "-"*52)

righe = []
righe_sfaldate = []

for rank, ci in enumerate(idx_ok, 1):
ai, aj = idx_to_coppia(int(ci))
a1, b1 = idx_to_ambo(ai)
a2, b2 = idx_to_ambo(aj)
mx = int(rit_max[ci])
att = int(rit_att[ci])

si_e_sfaldato = (ai in ultimi_ambi_usciti) or (aj in ultimi_ambi_usciti)

riga = f"{rank:>8}. {a1:02d}-{b1:02d} {a2:02d}-{b2:02d} {mx:>8} {att:>8}"
righe.append(riga)

if si_e_sfaldato:
righe_sfaldate.append(riga)

if rank <= 50:
print(" " + riga)

if totale > 50:
print(f"\n ... totale {totale:,} coppie — tutte nel file")
print("="*58)

header = (
f"BIAMBI CON RITARDO MASSIMO STORICO <= {SOGLIA}\n"
f"Archivio : {fmt(date[0])} -> {fmt(date[-1])}\n"
f"ID inizio : {ID_INIZIO}\n"
f"Estrazioni: {len(date):,}\n"
f"Ruote : 11 (inclusa Nazionale)\n"
f"Trovate : {totale:,} coppie\n"
f"{'='*58}\n"
f"{'Pos':>8} {'Ambo 1':>7} {'Ambo 2':>7} {'Rit.Max':>8} {'Rit.Att':>8}\n"
f"{'-'*54}\n"
)
os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
with open(OUTPUT, "w", encoding="utf-8") as f:
f.write(header)
for r in righe:
f.write(r.strip() + "\n")
print(f" File generale salvato: {OUTPUT}")

header_sfaldati = (
f"BIAMBI CON STORICO <= {SOGLIA} SFALDATI NELL'ULTIMA ESTRAZIONE DEL {fmt(date[-1])}\n"
f"Trovati : {len(righe_sfaldate):,} biambi sfaldati su {totale:,} totali\n"
f"{'='*58}\n"
f"{'Pos':>8} {'Ambo 1':>7} {'Ambo 2':>7} {'Rit.Max':>8} {'Rit.Att':>8}\n"
f"{'-'*54}\n"
)
with open(OUTPUT_SFALDATI, "w", encoding="utf-8") as f_sf:
f_sf.write(header_sfaldati)
for r in righe_sfaldate:
f_sf.write(r.strip() + "\n")

print(f" [NOVITÀ] File sfaldati ultima estrazione salvato: {OUTPUT_SFALDATI}")
print(f" Biambi storici sfaldati nell'ultimo concorso: {len(righe_sfaldate):,}")

return totale


def main():
print("╔══════════════════════════════════════════════════════════════╗")
print("║ BIAMBI CON RITARDO MAX STORICO <= SOGLIA — LOTTO ║")
print("║ (11 ruote inclusa Nazionale - dal ID 8117) ║")
print("╚══════════════════════════════════════════════════════════════╝\n")

if not os.path.exists(ARCHIVIO):
print(f"[ERRORE] Archivio non trovato in: {ARCHIVIO}")
print("Metti il file 'estrazioni.csv' nella stessa cartella dello script!")
input("\nPremi INVIO per uscire...")
sys.exit(1)

print(f" Lettura archivio: {ARCHIVIO}")
print(f" ID inizio : {ID_INIZIO}")
arr, date = leggi_archivio(ARCHIVIO)
print(f" Righe lette: {len(date):,} ({fmt(date[0])} → {fmt(date[-1])})")

ambo_i_arr, ambo_j_arr = build_arrays()
rit_max, rit_att, ultimi_ambi_usciti = calcola(arr, ambo_i_arr, ambo_j_arr)
totale = salva(rit_max, rit_att, date, ultimi_ambi_usciti)

print(f"\n Coppie totali : {NUM_COPPIE:,}")
print(f" Coppie <= {SOGLIA} : {totale:,}")
print(f" Percentuale : {totale/NUM_COPPIE*100:.4f}%")
print("\n Arrivederci!")

input("\nPremi INVIO per chiudere il programma...")

if __name__ == "__main__":
main()
 

Allegati

  • Screenshot 2026-05-27 165106.png
    Screenshot 2026-05-27 165106.png
    288,7 KB · Visite: 3
  • Screenshot 2026-05-27 165117.png
    Screenshot 2026-05-27 165117.png
    288,2 KB · Visite: 3
  • Screenshot 2026-05-27 165126.png
    Screenshot 2026-05-27 165126.png
    288,2 KB · Visite: 2

Ultima estrazione Lotto

  • Estrazione del lotto
    martedì 26 maggio 2026
    Bari
    37
    35
    74
    51
    18
    Cagliari
    72
    17
    29
    01
    88
    Firenze
    39
    78
    42
    52
    62
    Genova
    44
    30
    37
    60
    01
    Milano
    18
    29
    67
    02
    86
    Napoli
    60
    87
    47
    69
    51
    Palermo
    72
    26
    34
    76
    18
    Roma
    03
    31
    20
    84
    39
    Torino
    82
    23
    74
    76
    70
    Venezia
    79
    68
    33
    87
    03
    Nazionale
    46
    63
    02
    41
    71
    Estrazione Simbolotto
    Milano
    37
    36
    18
    06
    30
Indietro
Alto