import random
import re
import numpy as np
from scipy.spatial.distance import cosine
# Funzione per creare una griglia 90x90 senza duplicati su righe e colonne
def crea_griglia():
numeri = list(range(1, 91))
griglia = []
for _ in range(90):
riga = random.sample(numeri, 90)
griglia.append(riga)
return griglia
# Funzione per leggere le cinquine da un file
def leggi_cinquine_da_file(nome_file):
cinquine = []
with open(nome_file, 'r') as file:
for line in file:
line = line.strip()
if line:
numeri = re.findall(r'\d+', line)
cinquina = [int(numero) for numero in numeri[:5]] # Prende i primi 5 numeri trovati
if len(cinquina) == 5:
cinquine.append(cinquina)
return cinquine
# Funzione per calcolare la similarità tra cinquine
def calcola_similarita(cinquine):
similarita = np.zeros((len(cinquine), len(cinquine)))
for i in range(len(cinquine)):
for j in range(i + 1, len(cinquine)):
sim = 1 - cosine(cinquine[i], cinquine[j])
similarita[i, j] = sim
similarita[j, i] = sim
return similarita
# Funzione per filtrare le cinquine interessanti
def filtra_cinquine_interessanti(cinquine, soglia_similarita):
similarita = calcola_similarita(cinquine)
da_tenere = np.ones(len(cinquine), dtype=bool)
for i in range(len(cinquine)):
if da_tenere[i]:
for j in range(i + 1, len(cinquine)):
if similarita[i, j] > soglia_similarita:
da_tenere[j] = False
cinquine_filtrate = [cinquine[i] for i in range(len(cinquine)) if da_tenere[i]]
return cinquine_filtrate
# Funzione per trasformare i numeri di una cinquina
def trasforma_cinquina(cinquina, griglia, x, y):
cinquina_trasformata = []
for numero in cinquina:
indice_riga = griglia[y - 1][numero - 1] - 1
numero_trasformato = griglia[indice_riga][x - 1]
cinquina_trasformata.append(numero_trasformato)
return cinquina_trasformata
# Funzione per verificare se una cinquina trasformata è "interessante"
def cinquina_interessante(cinquina_trasformata, estrazione_verifica, soglia_match):
match = sum(numero in estrazione_verifica for numero in cinquina_trasformata)
return match >= soglia_match
# Processo principale
def main(nome_file_cinquine, estrazione_verifica, soglia_match):
# Creazione della griglia
griglia = crea_griglia()
# Stampa della griglia (opzionale)
print("Griglia iniziale:")
for riga in griglia:
print(' '.join(f"{num:2d}" for num in riga))
# Leggi le cinquine dal file
cinquine_base = leggi_cinquine_da_file(nome_file_cinquine)
# Determina dinamicamente le cinquine interessanti da filtrare
cinquine_interessanti_da_filtrare = [cinquina for cinquina in cinquine_base if sum(cinquina) > 200]
# Calcola la similarità tra le cinquine
cinquine_interessanti_filtrate = filtra_cinquine_interessanti(cinquine_base, 0.8)
# Lista per contenere i risultati delle cinquine trasformate per ogni cella della griglia
risultati_cinquine_trasformate = [[[] for _ in range(90)] for _ in range(90)]
# Itera su tutte le celle della griglia e trasforma le cinquine
for y in range(1, 91):
for x in range(1, 91):
risultati_cinquine_trasformate[y - 1][x - 1] = [trasforma_cinquina(cinquina, griglia, x, y) for cinquina in cinquine_base]
# Lista per contenere le cinquine interessanti
cinquine_interessanti = []
# Itera sui risultati delle cinquine trasformate per trovare quelle interessanti
for y in range(90):
for x in range(90):
for cinquina_trasformata in risultati_cinquine_trasformate[y][x]:
if cinquina_interessante(cinquina_trasformata, estrazione_verifica, soglia_match):
cinquine_interessanti.append((cinquina_trasformata, (x + 1, y + 1))) # Aggiungi la cinquina e le coordinate
# Stampa delle cinquine interessanti trovate
print("\nCinquine interessanti trovate:")
for cinquina, coord in cinquine_interessanti:
print(f"Cinquina: {cinquina}, Trovata alla cella: {coord}")
# Definiamo una soglia per il grado di match
soglia_match_filtraggio = 250
# Filtriamo le cinquine interessanti in base alla soglia di match
cinquine_filtrate = [(cinquina, posizione) for cinquina, posizione in cinquine_interessanti if sum(cinquina) > soglia_match_filtraggio]
# Stampiamo le cinquine filtrate
print("\nCinquine filtrate per soglia di match:")
for cinquina, posizione in cinquine_filtrate:
print(f"Cinquina: {cinquina}, Trovata alla cella: {posizione}")
# Esecuzione dello script
if __name__ == "__main__":
nome_file_cinquine = 'cinquine.txt' # Sostituisci con il nome effettivo del tuo file di cinquine
estrazione_verifica = [23, 76, 44, 33, 13] # Esempio di estrazione di verifica
soglia_match = 3 # Esempio di soglia minima di match per considerare una cinquina interessante
main(nome_file_cinquine, estrazione_verifica, soglia_match)