Novità

EXCEL E DINTORNI

1784792218421.png
Chiudete la finestra premendo invio finché non sparisce.

Nella cartella dell'eseguibile ci sarà, ora, questo file:
1784792297275.png

Chiudete tutto e aprite il programma Lotto1-5.xlsm

1784792348629.png

Cliccate sul pulsante Lunghette Importate
1784792405990.png

selezionate la cartella dove c'è il file
1784792453222.png
e selezionatelo

1784792487218.png
Cliccate su Apri (in basso a destra)

Dopo un po' appare:

1784792539362.png

Date l'ok

Ora potete aprire:
1784792574964.png
Al cui interno troverete tutti i dati (utili o inutili che vogliate considerarli) già formattati
Personalmente non ne sono particolarmente soddisfatto, vedremo se riusciro a farmi venire qualche idea.

Scusate la lunghezza delle spiegazioni, alcune forse potevano essere evitate, ma, io penso, che anche se scontate debbano essere presenti per quelli che, come me, non sono particolarmente informattizzati.
La joie soit avec toi


f
 

Allegati

  • 1784792389254.png
    1784792389254.png
    32,3 KB · Visite: 3
Dovrebbero esserci queste cartelle (e file) in ProgrC++:

Vedi l'allegato 2318284

Controlla. Mi rendo conto che visti i numerosi cambiamenti, ad un ceto punto, uno non ci capisca più niente.
Facciamo così, da ora in poi, per quanto riguarda ProgeC++ metterò l'intera cartella, dovrete, semplicemente cancellare quella vecchi e sostituirla con quella nuova e, assieme a questa, mettero anche solamente la/le cartella/e modificate. Il punto debole di questa procedura è che, se nelle vostre cartelle avete i risultati delle ricerche andranno persi.
Quindi, o li salvate prima di cancellare e sostituire il tutto, oppure, se volete e ve la sentite, vi spiegherò come (mi è venuto in mente che potrei chiedere alle AI un programmino che faccia tutto automaticamente, appena posso provo) fare a sostituite SOLO quelle parti che sono cambiate. Vedremo.

Qui ti metto la cartella ProgrC++ aggiornata se nella tua mancasse qualcosa

Grazie ora ho capito l' inghippo era che mi mancavano alcune cartelle, ora e' OK.
 
Il file Lotto1-4.xlsm sostituisce completamente, la versione Lotto1-3.xlsm. Quindi una volta che hai scaricato il file puoi eliminare l'altro (anche se io ti consiglio di tenere le ultime 3 versioni, non si sa mai)
Scusa la mia ignoranza ma non trovo il file Lotto1-3. xlm, in che cartella deve esserci?
 
Utilizzando il programma Lotto1-5 mi sono accorto che non avevo aggiornato la macro Ritardi, perché tenesse conto che le estrazioni ora partivano dal 1871. Questo comporta errori sui ritardi massimi, con valori senza senso:

1784803468255.png
Ora ho sistemato e dopo altri controlli posterò il tutto.

Per chi volesse, anche senza sapere come si fa, inserire la macro aggiornata, al posto di quella non corretta, sarei felice di spiegarle la procedura, lunga da spiegare, ma nei fatti una vera cag..., Vi potrebbe essere utile sapere come si fa per semplici correzioni, nel caso il pulsante, per un motivo qualsiasi, perdesse il collegamento alla macro.
Però prima di scrivere la procedura vorrei sapere se a qualcuno interessa, altrimenti sarebbe lavoro sprecato.
Faciteme saperi

1784803755472.png

Questa è corretta. E questa è la macro che la genera, non spaventatevi è un po lunga.
Come dici? Guardandola non ci capisci niente? Neanche io, però funziona 😊

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Option Explicit

Public Type AnalisiAvanzata
nomeRuota As String
indiceProbabilita As Double
tendenzaUltimi3Mesi As Double
regolaritaUscite As Double
ciclicita As Double
End Type

' ================================================================
' FUNZIONE: ParseDataItaliana
' (se già presente altrove nel modulo, rimuovila da qui)
' ================================================================
Private Function ParseDataItaliana(txt As String) As Date
Dim p() As String
txt = Trim(txt)
If txt = "" Then Exit Function
p = Split(txt, "/")
On Error GoTo fallback
If UBound(p) = 1 Then
ParseDataItaliana = DateSerial(Year(Date), CLng(p(1)), CLng(p(0)))
ElseIf UBound(p) = 2 Then
ParseDataItaliana = DateSerial(CLng(p(2)), CLng(p(1)), CLng(p(0)))
End If
Exit Function
fallback:
ParseDataItaliana = 0
End Function



' ================================================================
' HELPER: colonne ruota
' ================================================================
Private Sub GetColonneRuota(nomeRuota As String, ByRef colStart As Integer, ByRef colEnd As Integer)
Select Case Trim(UCase(nomeRuota))
Case "BARI": colStart = 4: colEnd = 8
Case "CAGLIARI": colStart = 9: colEnd = 13
Case "FIRENZE": colStart = 14: colEnd = 18
Case "GENOVA": colStart = 19: colEnd = 23
Case "MILANO": colStart = 24: colEnd = 28
Case "NAPOLI": colStart = 29: colEnd = 33
Case "PALERMO": colStart = 34: colEnd = 38
Case "ROMA": colStart = 39: colEnd = 43
Case "TORINO": colStart = 44: colEnd = 48
Case "VENEZIA": colStart = 49: colEnd = 53
Case "NAZIONALE": colStart = 54: colEnd = 58
End Select
End Sub

' ================================================================
' HELPER: indica se una ruota ha effettivamente estratto in una
' determinata riga (almeno un numero valido 1-90 tra le sue 5
' colonne). Usata per escludere dall'analisi le date in cui la
' ruota non ha estratto, per qualunque motivo: non ancora
' istituita, sospesa temporaneamente, interrotta, ecc.
' Molto più robusto del semplice "riga di inizio", perché copre
' anche interruzioni storiche nel mezzo della serie e non solo
' l'anno di istituzione.
' ================================================================
Private Function RuotaAttivaSuRiga(dati As Variant, riga As Long, colStart As Integer, colEnd As Integer) As Boolean
Dim col As Integer
Dim v As Variant
For col = colStart To colEnd
v = dati(riga, col)
If Not IsEmpty(v) Then
If IsNumeric(v) Then
If CLng(v) >= 1 And CLng(v) <= 90 Then
RuotaAttivaSuRiga = True
Exit Function
End If
End If
End If
Next col
RuotaAttivaSuRiga = False
End Function

' ================================================================
' SUB PRINCIPALE: AnalisiRitardi
' ================================================================
Sub AnalisiRitardiOld()

' -------------------------------------------------------
' SCELTA GIORNO (identica a CicliGruppo10)
' -------------------------------------------------------
Dim sceltaGiorno As String
Dim giornoTarget As Long

sceltaGiorno = InputBox("Quale giorno vuoi elaborare?" & vbCrLf & _
"martedi, giovedi, venerdi, sabato, tutti", _
"Seleziona giorno")
If sceltaGiorno = "" Then Exit Sub

sceltaGiorno = LCase(Trim(sceltaGiorno))

Select Case sceltaGiorno
Case "martedi", "martedì": giornoTarget = 3
Case "giovedi", "giovedì": giornoTarget = 5
Case "venerdi", "venerdì": giornoTarget = 6
Case "sabato": giornoTarget = 7
Case "tutti", "": giornoTarget = 0
Case Else
MsgBox "Giorno non valido. Inserire: martedi, giovedi, venerdi, sabato, tutti.", vbExclamation
Exit Sub
End Select

Dim infoGiorno As String
Select Case giornoTarget
Case 0: infoGiorno = "tutti i giorni"
Case 3: infoGiorno = "martedì"
Case 5: infoGiorno = "giovedì"
Case 6: infoGiorno = "venerdì"
Case 7: infoGiorno = "sabato"
End Select
' -------------------------------------------------------

Dim ws As Worksheet
Dim wsRisultati As Worksheet
Dim wsNumElab As Worksheet
Dim ruoteInput As String
Dim ruote() As String
Dim numeriDaAnalizzare As String
Dim Numeri() As String
Dim i As Integer, j As Long, r As Integer, col As Integer, pos As Integer
Dim ultimaRiga As Long
Dim RitardoAttuale As Long
Dim RitardoMassimo As Long
Dim frequenza As Long
Dim totaleEstrazioni As Long
Dim rigaInizio As Long
Dim ultimaUscita As String
Dim distanzaMedia As Double
Dim estrazioniConNumero() As Long
Dim estrCount As Long
Dim colonnaInizio As Integer
Dim colonnaFine As Integer
Dim rigaInizioRuota As Integer
Dim numero As Integer
Dim ultimaData As String
Dim ultimaRuota As String
Dim posizioniFreq(1 To 5) As Long
Dim RitardoPosizione(1 To 5) As Long
Dim posTrovata(1 To 5) As Boolean
Dim cellValue As Variant
Dim ritardoCorrente As Long
Dim sommaDistanze As Long
Dim maxPos As Long
Dim posizionePiuFreq As Integer
Dim totNumeri As Integer
Dim percAvanz As Integer
Dim numRuota As Integer
Dim ruoteNomiStr As String
Dim ruoteAbbrStr As String
Dim ultimaEstrazioneTrovata As Long
Dim trovatoRiga As Boolean
Dim rowData(1 To 14) As Variant
Dim ruotaAttiva() As Boolean
Dim almenoUnaAttivaRiga() As Boolean

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

On Error GoTo Cleanup

On Error Resume Next
Set wsNumElab = ThisWorkbook.Sheets("NumElab")
If Not wsNumElab Is Nothing Then
wsNumElab.UsedRange.ClearContents
End If
On Error GoTo Cleanup

Set ws = ThisWorkbook.Sheets("ArchivioFiltrato")
rigaInizio = 9

' --- Scelta ruote ---
ruoteInput = InputBox("Scegli le ruote per numero:" & vbCrLf & _
"1=BARI 2=CAGLIARI 3=FIRENZE 4=GENOVA 5=MILANO" & vbCrLf & _
"6=NAPOLI 7=PALERMO 8=ROMA 9=TORINO 10=VENEZIA 11=NAZIONALE" & vbCrLf & vbCrLf & _
"Inserisci i numeri separati da virgola (es: 1,3,8)" & vbCrLf & _
"Oppure scrivi 'TUTTE' per le ruote 1-10 (esclusa Nazionale)", "Selezione Ruote")
If ruoteInput = "" Then GoTo Cleanup

Dim RuoteNomi(1 To 11) As String
RuoteNomi(1) = "BARI": RuoteNomi(2) = "CAGLIARI": RuoteNomi(3) = "FIRENZE"
RuoteNomi(4) = "GENOVA": RuoteNomi(5) = "MILANO": RuoteNomi(6) = "NAPOLI"
RuoteNomi(7) = "PALERMO": RuoteNomi(8) = "ROMA": RuoteNomi(9) = "TORINO"
RuoteNomi(10) = "VENEZIA": RuoteNomi(11) = "NAZIONALE"

Dim ruoteAbbrevi(1 To 11) As String
ruoteAbbrevi(1) = "Ba": ruoteAbbrevi(2) = "Ca": ruoteAbbrevi(3) = "Fi"
ruoteAbbrevi(4) = "Ge": ruoteAbbrevi(5) = "Mi": ruoteAbbrevi(6) = "Na"
ruoteAbbrevi(7) = "Pa": ruoteAbbrevi(8) = "Ro": ruoteAbbrevi(9) = "To"
ruoteAbbrevi(10) = "Ve": ruoteAbbrevi(11) = "Naz"

If UCase(Trim(ruoteInput)) = "TUTTE" Then ruoteInput = "1,2,3,4,5,6,7,8,9,10"

Dim ruoteNumeri() As String
ruoteNumeri = Split(ruoteInput, ",")

ruoteNomiStr = ""
ruoteAbbrStr = ""
For i = 0 To UBound(ruoteNumeri)
numRuota = val(Trim(ruoteNumeri(i)))
If numRuota < 1 Or numRuota > 11 Then
MsgBox "Numero ruota non valido: " & Trim(ruoteNumeri(i)) & vbCrLf & _
"Inserire numeri da 1 a 11", vbExclamation
GoTo Cleanup
End If
If ruoteNomiStr = "" Then
ruoteNomiStr = RuoteNomi(numRuota)
ruoteAbbrStr = ruoteAbbrevi(numRuota)
Else
ruoteNomiStr = ruoteNomiStr & "," & RuoteNomi(numRuota)
ruoteAbbrStr = ruoteAbbrStr & ", " & ruoteAbbrevi(numRuota)
End If
Next i
ruote = Split(ruoteNomiStr, ",")

' --- Scelta numeri ---
numeriDaAnalizzare = InputBox("Inserisci i numeri separati da virgola (es: 1,4,7,90)" & vbCrLf & _
"Oppure scrivi 'TUTTI' per analizzare tutti i 90 numeri:", "Inserimento Numeri")
If numeriDaAnalizzare = "" Then GoTo Cleanup

If UCase(Trim(numeriDaAnalizzare)) = "TUTTI" Then
ReDim Numeri(89)
For i = 0 To 89
Numeri(i) = CStr(i + 1)
Next i
Else
Numeri = Split(numeriDaAnalizzare, ",")
For i = 0 To UBound(Numeri)
If val(Trim(Numeri(i))) < 1 Or val(Trim(Numeri(i))) > 90 Then
MsgBox "Numero non valido: " & Trim(Numeri(i)) & ". Deve essere tra 1 e 90", vbExclamation
GoTo Cleanup
End If
Next i
End If

totNumeri = UBound(Numeri) + 1
ultimaRiga = ws.Range("C" & ws.Rows.count).End(xlUp).Row

' --- Carica ArchivioFiltrato in memoria ---
Dim datiArchivioFiltrato As Variant
datiArchivioFiltrato = ws.Range("A" & rigaInizio & ":BF" & ultimaRiga).Value

Dim totalRighe As Long
totalRighe = UBound(datiArchivioFiltrato, 1)

' -------------------------------------------------------
' COSTRUZIONE MASCHERA RIGHE VALIDE PER GIORNO
' righeValide(j) = True se la riga j passa il filtro
' -------------------------------------------------------
Dim righeValide() As Boolean
ReDim righeValide(1 To totalRighe)

Dim contRigheValide As Long
contRigheValide = 0

Dim jj As Long
For jj = 1 To totalRighe
If giornoTarget = 0 Then
righeValide(jj) = True
contRigheValide = contRigheValide + 1
Else
Dim dvGiorno As Variant
dvGiorno = datiArchivioFiltrato(jj, 3) ' colonna C = offset 3 nell'array (A=1,B=2,C=3)
Dim dataGiorno As Date
If IsDate(dvGiorno) Then
dataGiorno = CDate(dvGiorno)
Else
dataGiorno = ParseDataItaliana(CStr(dvGiorno))
End If
If dataGiorno > 0 And Weekday(dataGiorno) = giornoTarget Then
righeValide(jj) = True
contRigheValide = contRigheValide + 1
Else
righeValide(jj) = False
End If
End If
Next jj
' -------------------------------------------------------

' -------------------------------------------------------
' PRECALCOLO: per ogni riga e per ogni ruota selezionata,
' la ruota ha davvero estratto quel giorno? Gestisce sia le
' ruote non ancora istituite sia eventuali sospensioni /
' interruzioni storiche nel mezzo della serie.
' -------------------------------------------------------
ReDim ruotaAttiva(1 To totalRighe, 0 To UBound(ruote))
ReDim almenoUnaAttivaRiga(1 To totalRighe)

For jj = 1 To totalRighe
Dim trovataAttiva As Boolean
trovataAttiva = False
For r = 0 To UBound(ruote)
Call GetColonneRuota(ruote(r), colonnaInizio, colonnaFine)
ruotaAttiva(jj, r) = RuotaAttivaSuRiga(datiArchivioFiltrato, jj, colonnaInizio, colonnaFine)
If ruotaAttiva(jj, r) Then trovataAttiva = True
Next r
almenoUnaAttivaRiga(jj) = trovataAttiva
Next jj
' -------------------------------------------------------

' --- totaleEstrazioni: conteggio solo su righe valide E in cui
' la ruota ha effettivamente estratto ---
totaleEstrazioni = 0
For r = 0 To UBound(ruote)
For jj = 1 To totalRighe
If righeValide(jj) And ruotaAttiva(jj, r) Then totaleEstrazioni = totaleEstrazioni + 1
Next jj
Next r

' --- Foglio Ritardi ---
On Error Resume Next
Set wsRisultati = ThisWorkbook.Sheets("Ritardi")
If wsRisultati Is Nothing Then
Set wsRisultati = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.count))
wsRisultati.Name = "Ritardi"
End If
wsRisultati.UsedRange.ClearContents
On Error GoTo Cleanup

With wsRisultati
.Cells(1, 1) = "Ruote analizzate: " & ruoteAbbrStr & " | Giorno: " & infoGiorno
.Cells(3, 1) = "Numero"
.Cells(3, 2) = "Ritardo Attuale"
.Cells(3, 3) = "Ritardo Massimo"
.Cells(3, 4) = "Frequenza"
.Cells(3, 5) = "Frequenza %"
.Cells(3, 6) = "Ultima Uscita"
.Cells(3, 7) = "Distanza Media"
.Cells(3, 8) = "Ultima Ruota"
.Cells(3, 9) = "Pos. Più Frequente"
.Cells(3, 10) = "Ritardo Pos.1"
.Cells(3, 11) = "Ritardo Pos.2"
.Cells(3, 12) = "Ritardo Pos.3"
.Cells(3, 13) = "Ritardo Pos.4"
.Cells(3, 14) = "Ritardo Pos.5"
End With

Application.StatusBar = "Avvio analisi..."

' ================================================================
' LOOP NUMERI
' ================================================================
For i = 0 To UBound(Numeri)

numero = val(Trim(Numeri(i)))

percAvanz = Int(((i + 1) / totNumeri) * 100)
Application.StatusBar = "Analisi numero " & numero & _
" | " & (i + 1) & " di " & totNumeri & _
" | " & percAvanz & "% " & _
String(Int(percAvanz / 5), "|") & _
String(20 - Int(percAvanz / 5), ".")

RitardoAttuale = 0
RitardoMassimo = 0
frequenza = 0
ritardoCorrente = 0
ultimaEstrazioneTrovata = 0
ultimaData = ""
ultimaRuota = ""
estrCount = 0
ReDim estrazioniConNumero(0)
sommaDistanze = 0

For j = 1 To 5
posizioniFreq(j) = 0
posTrovata(j) = False
Next j

' --- contatore progressivo delle sole righe valide, a partire
' dalla prima riga in cui esiste almeno una ruota selezionata ---
Dim contValido As Long
contValido = 0
Dim ultimoContValido As Long
ultimoContValido = 0

For j = 1 To totalRighe

' Salta righe non valide per il giorno scelto
If Not righeValide(j) Then GoTo NextRigaNum

' Salta righe in cui NESSUNA delle ruote selezionate ha
' effettivamente estratto (non istituita, sospesa, ecc.)
If Not almenoUnaAttivaRiga(j) Then GoTo NextRigaNum

contValido = contValido + 1 ' indice progressivo sulle sole righe valide

For r = 0 To UBound(ruote)
' Salta la singola ruota se non ha estratto in questa riga
If Not ruotaAttiva(j, r) Then GoTo NextRuotaAnalisi

Call GetColonneRuota(ruote(r), colonnaInizio, colonnaFine)

For col = colonnaInizio To colonnaFine
cellValue = datiArchivioFiltrato(j, col)
If IsNumeric(cellValue) Then
If CLng(cellValue) = numero Then
frequenza = frequenza + 1
ultimaData = datiArchivioFiltrato(j, 3)
ultimaRuota = Trim(ruote(r))
posizioniFreq(col - colonnaInizio + 1) = posizioniFreq(col - colonnaInizio + 1) + 1
estrCount = estrCount + 1
ReDim Preserve estrazioniConNumero(estrCount)
estrazioniConNumero(estrCount) = contValido ' usa contatore valido
If ultimoContValido > 0 Then
ritardoCorrente = contValido - ultimoContValido
If ritardoCorrente > RitardoMassimo Then RitardoMassimo = ritardoCorrente
End If
ultimoContValido = contValido
ultimaEstrazioneTrovata = contValido
End If
End If
Next col
NextRuotaAnalisi:
Next r
NextRigaNum:
Next j

' Ritardo attuale (in estrazioni valide, dall'istituzione della ruota)
If ultimaEstrazioneTrovata > 0 Then
RitardoAttuale = contValido - ultimaEstrazioneTrovata
Else
RitardoAttuale = contValido
End If

' Ritardo massimo: considera ritardo iniziale (dall'istituzione
' della ruota, non dall'inizio assoluto dell'archivio) e ritardo attuale
If estrCount > 0 Then
Dim ritardoIniziale As Long
ritardoIniziale = estrazioniConNumero(1) - 1
If ritardoIniziale > RitardoMassimo Then RitardoMassimo = ritardoIniziale
If RitardoAttuale > RitardoMassimo Then RitardoMassimo = RitardoAttuale
End If

' Distanza media
distanzaMedia = 0
If estrCount > 1 Then
For j = 2 To estrCount
sommaDistanze = sommaDistanze + (estrazioniConNumero(j) - estrazioniConNumero(j - 1))
Next j
distanzaMedia = Round(sommaDistanze / (estrCount - 1), 2)
End If

' Posizione più frequente
maxPos = 0
For j = 1 To 5
If posizioniFreq(j) > maxPos Then
maxPos = posizioniFreq(j)
posizionePiuFreq = j
End If
Next j

' Ritardo per posizione (scansione al contrario, solo righe valide,
' fermandosi all'istituzione della prima ruota selezionata)
Dim ritPos(1 To 5) As Long
Dim trovPos(1 To 5) As Boolean
For pos = 1 To 5: ritPos(pos) = 0: trovPos(pos) = False: Next pos

For j = totalRighe To 1 Step -1

If Not righeValide(j) Then GoTo NextRigaPos

' Salta righe in cui nessuna ruota selezionata ha estratto
If Not almenoUnaAttivaRiga(j) Then GoTo NextRigaPos

Dim posTrov(1 To 5) As Boolean
For pos = 1 To 5: posTrov(pos) = False: Next pos

For r = 0 To UBound(ruote)
If Not ruotaAttiva(j, r) Then GoTo NextRuotaPos
Call GetColonneRuota(ruote(r), colonnaInizio, colonnaFine)
For col = colonnaInizio To colonnaFine
cellValue = datiArchivioFiltrato(j, col)
If IsNumeric(cellValue) Then
If CLng(cellValue) = numero Then
posTrov(col - colonnaInizio + 1) = True
End If
End If
Next col
NextRuotaPos:
Next r

For pos = 1 To 5
If posTrov(pos) Then
trovPos(pos) = True
ElseIf Not trovPos(pos) Then
ritPos(pos) = ritPos(pos) + 1
End If
Next pos
NextRigaPos:
Next j

' Scrittura riga
rowData(1) = numero
rowData(2) = RitardoAttuale
rowData(3) = RitardoMassimo - 1
rowData(4) = frequenza
rowData(5) = IIf(totaleEstrazioni > 0, frequenza / totaleEstrazioni, 0)
rowData(6) = ultimaData
rowData(7) = distanzaMedia
rowData(8) = ultimaRuota
rowData(9) = posizionePiuFreq
rowData(10) = ritPos(1)
rowData(11) = ritPos(2)
rowData(12) = ritPos(3)
rowData(13) = ritPos(4)
rowData(14) = ritPos(5)
wsRisultati.Cells(i + 4, 1).Resize(1, 14).Value = rowData
wsRisultati.Cells(i + 4, 5).NumberFormat = "0.00%"

Next i

' --- Formattazione foglio Ritardi ---
Application.StatusBar = "Formattazione risultati..."

With wsRisultati
.Cells(2, 1) = "Ultima estrazione analizzata: " & _
datiArchivioFiltrato(totalRighe, 3) & _
" | Giorno filtrato: " & infoGiorno
.Range("A1:A2").Font.Bold = True
.Range("A3:N3").Font.Bold = True
.Columns("B:N").AutoFit
.Columns("A").ColumnWidth = 12
.Range("A3:N" & (UBound(Numeri) + 4)).Borders.LineStyle = xlContinuous
End With

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.StatusBar = False

' --- Salvataggio PDF opzionale ---
If MsgBox("Analisi completata! Vuoi salvare i risultati in PDF?", vbQuestion + vbYesNo) = vbYes Then
Dim percorsoFile As Variant
Dim dataOra As String
dataOra = Format(Now, "yyyymmdd_hhnn")
percorsoFile = Application.GetSaveAsFilename( _
InitialFileName:=ThisWorkbook.Path & "\Analisi_Ritardi_" & dataOra & ".pdf", _
FileFilter:="File PDF (*.pdf), *.pdf", _
Title:="Salva PDF come")
If percorsoFile <> False Then
If LCase(right(percorsoFile, 4)) <> ".pdf" Then percorsoFile = percorsoFile & ".pdf"
With wsRisultati
.PageSetup.Orientation = xlPortrait
.PageSetup.Zoom = False
.PageSetup.FitToPagesWide = 1
.PageSetup.FitToPagesTall = False
.PageSetup.LeftMargin = Application.InchesToPoints(0.5)
.PageSetup.RightMargin = Application.InchesToPoints(0.5)
.PageSetup.TopMargin = Application.InchesToPoints(0.5)
.PageSetup.BottomMargin = Application.InchesToPoints(0.5)
.PageSetup.PrintArea = "$A$1:$N$" & (UBound(Numeri) + 4)
.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=percorsoFile, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End With
MsgBox "PDF salvato come: " & percorsoFile, vbInformation
Else
MsgBox "Esportazione PDF annullata.", vbInformation
End If
End If

MsgBox "I risultati sono disponibili nel foglio 'Ritardi'." & vbCrLf & _
"Giorno elaborato: " & infoGiorno, vbInformation

' --- Analisi avanzata probabilità ---
Application.StatusBar = "Analisi avanzata probabilità..."
For i = 0 To UBound(Numeri)
numero = val(Trim(Numeri(i)))
If numero >= 1 And numero <= 90 Then
Application.StatusBar = "Analisi avanzata: numero " & numero & _
" (" & (i + 1) & " di " & totNumeri & ")"
Call AnalisiAvanzataProbabilita(numero, datiArchivioFiltrato, ruote, righeValide, _
ruotaAttiva, infoGiorno)
End If
Next i

Application.StatusBar = False
Exit Sub

Cleanup:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.StatusBar = False
If Err.Number <> 0 Then MsgBox "Errore: " & Err.Description, vbCritical

End Sub


' ================================================================
' ANALISI AVANZATA PROBABILITÀ
' (aggiornata con filtro giorno E istituzione storica ruote)
' ================================================================
Private Sub AnalisiAvanzataProbabilita(numero As Integer, datiArchivioFiltrato As Variant, _
ruote() As String, righeValide() As Boolean, _
ruotaAttiva() As Boolean, infoGiorno As String)

Dim wsNumElab As Worksheet
On Error Resume Next
Set wsNumElab = ThisWorkbook.Sheets("NumElab")
On Error GoTo 0
If wsNumElab Is Nothing Then
Set wsNumElab = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.count))
wsNumElab.Name = "NumElab"
End If

If Trim(wsNumElab.Cells(1, 1).Value) = "" Then
wsNumElab.Range("A1:J1").Value = Array("Numero", "Ruota", "Indice Probabilità", _
"Ritardo Attuale", "Ritardo Max", "Punto Z", _
"Ciclo Uscita", "Maturità %", "Score Totale", "Giorno")
End If

Dim ritardoAtt As Long, ritardoMax As Long, puntoZ As Double, distanzaMedia As Double
Dim wsRisultati As Worksheet
Set wsRisultati = ThisWorkbook.Sheets("Ritardi")

Dim rigaTrovata As Range
Set rigaTrovata = wsRisultati.Range("A:A").Find(What:=numero, LookIn:=xlValues, LookAt:=xlWhole)
If Not rigaTrovata Is Nothing Then
ritardoAtt = wsRisultati.Cells(rigaTrovata.Row, 2).Value
ritardoMax = wsRisultati.Cells(rigaTrovata.Row, 3).Value
distanzaMedia = wsRisultati.Cells(rigaTrovata.Row, 7).Value
Dim freqPerc As Double
freqPerc = wsRisultati.Cells(rigaTrovata.Row, 5).Value
If freqPerc > 0 Then puntoZ = 1 / freqPerc
End If

Dim lastRow As Long
lastRow = wsNumElab.Cells(wsNumElab.Rows.count, 1).End(xlUp).Row
If lastRow < 1 Then lastRow = 1

Dim analisi() As AnalisiAvanzata
ReDim analisi(UBound(ruote))

Dim dataUltimaEstrazione As Date
Dim totalRighe As Long
totalRighe = UBound(datiArchivioFiltrato, 1)

' Trova ultima riga valida per data
Dim jUlt As Long
For jUlt = totalRighe To 1 Step -1
If IsDate(datiArchivioFiltrato(jUlt, 3)) Then
dataUltimaEstrazione = CDate(datiArchivioFiltrato(jUlt, 3))
Exit For
End If
Next jUlt
Dim data3MesiFa As Date
data3MesiFa = DateAdd("m", -3, dataUltimaEstrazione)

Dim r As Integer, j As Long, col As Integer
Dim colonnaInizio As Integer, colonnaFine As Integer
Dim cellValue As Variant
Dim dataCorrente As Date
Dim uscite3Mesi As Long, usciteTotali As Long
Dim lastIndex As Long
Dim mediaInt As Double, devStd As Double, ii As Long
Dim patt As Double

For r = 0 To UBound(ruote)
analisi(r).nomeRuota = ruote(r)

uscite3Mesi = 0
usciteTotali = 0
lastIndex = 0
mediaInt = 0
devStd = 0
patt = 0

Dim intervalli() As Long
ReDim intervalli(0)

Call GetColonneRuota(ruote(r), colonnaInizio, colonnaFine)

Dim contV As Long: contV = 0

For j = 1 To totalRighe

' Applica filtro giorno
If Not righeValide(j) Then GoTo NextItAv

' Salta le righe in cui questa ruota non ha estratto
' (non istituita, sospesa, ecc.) PRIMA di incrementare contV,
' cosicché il conteggio consideri solo estrazioni reali
If Not ruotaAttiva(j, r) Then GoTo NextItAv

contV = contV + 1

On Error Resume Next
dataCorrente = CDate(datiArchivioFiltrato(j, 3))
On Error GoTo 0

For col = colonnaInizio To colonnaFine
cellValue = datiArchivioFiltrato(j, col)
If IsNumeric(cellValue) Then
If CLng(cellValue) = numero Then
usciteTotali = usciteTotali + 1
If dataCorrente >= data3MesiFa Then uscite3Mesi = uscite3Mesi + 1
If lastIndex > 0 Then
ReDim Preserve intervalli(UBound(intervalli) + 1)
intervalli(UBound(intervalli)) = contV - lastIndex
End If
lastIndex = contV
End If
End If
Next col
NextItAv:
Next j

With analisi(r)
.tendenzaUltimi3Mesi = (uscite3Mesi / 13) * 100 ' ~13 estr/mese per giorno singolo
If UBound(intervalli) > 0 Then
For ii = 1 To UBound(intervalli): mediaInt = mediaInt + intervalli(ii): Next ii
mediaInt = mediaInt / UBound(intervalli)
For ii = 1 To UBound(intervalli): devStd = devStd + (intervalli(ii) - mediaInt) ^ 2: Next ii
devStd = Sqr(devStd / UBound(intervalli))
If mediaInt > 0 Then .regolaritaUscite = 100 / (1 + (devStd / mediaInt))
End If
If UBound(intervalli) > 2 Then
For ii = 1 To UBound(intervalli) - 2
If Abs(intervalli(ii) - intervalli(ii + 2)) < mediaInt * 0.2 Then patt = patt + 1
Next ii
.ciclicita = (patt / (UBound(intervalli) - 2)) * 100
End If
.indiceProbabilita = (.tendenzaUltimi3Mesi * 0.4) + (.regolaritaUscite * 0.35) + (.ciclicita * 0.25)
End With
Next r

Call OrdinaAnalisiPerProbabilita(analisi)

Dim cicloUscita As Double, maturita As Double, scoreTotale As Double, fattoreCiclo As Double
For r = 0 To UBound(analisi)
With analisi(r)
cicloUscita = 0: maturita = 0
If distanzaMedia > 0 Then
cicloUscita = (ritardoAtt / distanzaMedia) * 100
maturita = IIf(cicloUscita > 100, cicloUscita - 100, 0)
End If
scoreTotale = (.indiceProbabilita * 0.5) + (.tendenzaUltimi3Mesi * 0.3)
fattoreCiclo = IIf(cicloUscita >= 100, 0.2, (cicloUscita / 100) * 0.2)
scoreTotale = scoreTotale * (1 + fattoreCiclo)
If scoreTotale > 100 Then scoreTotale = 100

wsNumElab.Cells(lastRow + r + 1, 1).Value = numero
wsNumElab.Cells(lastRow + r + 1, 2).Value = .nomeRuota
wsNumElab.Cells(lastRow + r + 1, 3).Value = Round(.indiceProbabilita, 2)
wsNumElab.Cells(lastRow + r + 1, 4).Value = ritardoAtt
wsNumElab.Cells(lastRow + r + 1, 5).Value = ritardoMax
wsNumElab.Cells(lastRow + r + 1, 6).Value = Round(puntoZ, 2)
wsNumElab.Cells(lastRow + r + 1, 7).Value = Round(cicloUscita, 2)
wsNumElab.Cells(lastRow + r + 1, 8).Value = Round(maturita, 2)
wsNumElab.Cells(lastRow + r + 1, 9).Value = Round(scoreTotale, 2)
wsNumElab.Cells(lastRow + r + 1, 10).Value = infoGiorno
End With
Next r

With wsNumElab
.Range("A1:J1").Font.Bold = True
.Columns("B:J").AutoFit
.Range("A1:J" & (lastRow + UBound(analisi) + 1)).Borders.LineStyle = xlContinuous
End With

End Sub

' ================================================================
' ORDINAMENTO (invariato)
' ================================================================
Private Sub OrdinaAnalisiPerProbabilita(analisi() As AnalisiAvanzata)
Dim i As Long, j As Long
Dim temp As AnalisiAvanzata
For i = LBound(analisi) To UBound(analisi) - 1
For j = i + 1 To UBound(analisi)
If analisi(j).indiceProbabilita > analisi(i).indiceProbabilita Then
temp = analisi(i): analisi(i) = analisi(j): analisi(j) = temp
End If
Next j
Next i
End Sub

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
No. E' una macro per il mio (di Baciccia) programma Lotto, arrivato alla versione Lotto1-5.xlsm
C'è un errore nel foglio ritardi, dovuto al fatto che ho portato l'inizio delle estrazioni dal 1900 e qualcosa al 1871.
Il fatto che alcune ruote non fossero presenti e che in certi periodi le estrazioni non ci siano state, portava ad ottenere dei risultati sul max ritardo storico assurdi.
Questa macro risolve quegli errori, l'ho pubblicata solo con la vana speranza che qualcuno mi chiedesse come sostituirla a quella esistente.
Di Spaziometria non mi occupo. E non ho nessun problema col suo archivio lotto. Lo script, di Ramco da me modificato, lavora alla grande e non interessa a nessuno. Ho anche provato a fare un programma similSpaziometria, con alcuni ottimi risultati e la mancanza totale di alcune cose, tipo gli Script dove nun ce capisco una pecora pazza. Io non sono INRI ma ACDB (Amico Carissimo Del Baciccia).
E proverò a dirti una Bacicciata: Se vuoi vincere non perdere (mi sembra una cag...)
 
Se fosse compilato per Linux, mi farebbe comodo.
In ogni caso grazie per tutto quello che condividi!
Proverò a chiedere alle AI, credo sia fattibile, però non utilizzo Linux da molto tempo Non ti prometto nulla ma proverò. Ciao
Mi è venuto in mente che però Python esiste anche per Linux, visto che in prima istanza l'ho fatto per Pithon:


troverai la cartella PYT con all'interno questi file:
1784846571389.png

Devi lanciare mail.py

1784846632217.png

poi clicchi su 1784846653723.png (o qualcosa del genere dependa da quale Python hai)

Ti appare:

1784846711887.png

scrivi i numeri giocati separati da virgola (o se preferisci spazio)
Poi nei numeri usciti inserisci i 5 numeri dell'estrazione e clicca su calcola:

1784846857248.png

Prova e fammi sapere.
Ciao

PS:
1784847115561.png
1784847159619.png
1784847182657.png

Una raccomandazione che faccio a tutti, non lasciarti spaventare dalle eventuali difficoltà, utilizza una AI, io utilizzo spesso Claude è la AI che più spesso riesce dove altre AI falliscono. Provare costa solo un po' di tempo e, se sei come me, tante arrabbiature perché spesso non capisco nulla. Però è divertente e quando riesci, magari per errore, a fare qualcosa la soddisfazione è enorme.
Ciao
 

Allegati

  • 1784846613413.png
    1784846613413.png
    18,5 KB · Visite: 2
Ultima modifica:
Grazie @InRicordo.
Va bene anche il python, tanto non è che debba fare elaborazioni particolarmente onerose. ;)

Comunque per la versione in C++ a me sarebbe bastato anche il sorgente. Per intenderci il file .cpp. Ma ti ho portato fuori strada parlando di "compilazione Linux".


Il programma python funziona perfettamente anche su Linux (ma era scontato).

Un ultima cosa.
Ho notato che nel calcolare le vincite, il programma non tiene conto delle giocate Lotto Più.
Vale a dire queste:

"Il Lotto Più è una modalità di gioco del Lotto che offre vincite maggiorate grazie a moltiplicatori più alti rispetto al gioco tradizionale, mantenendo invariata la dinamica di estrazione. I giocatori possono scegliere tra tre tipologie di schedina con importo fisso predefinito: 3€, 4€ o 5€, selezionando liberamente da uno a cinque numeri su una o più ruote (escluse quelle dove il gioco non è attivo).

Ecco i dettagli delle vincite potenziali per ogni tipo di schedina:

  • Schedina da 3€: Si giocano fino a 3 numeri. I moltiplicatori sono 270x per l'ambo e 5.000x per il terno. La vincita massima per un ambo è di 180€, mentre per un terno può raggiungere i 5.540€.
  • Schedina da 4€: Si giocano fino a 4 numeri. I moltiplicatori sono 300x per l'ambo, 6.000x per il terno e 210.000x per la quaterna. Le vincite massime sono di 300€ per l'ambo, 1.800€ per il terno e 216.600€ per la quaterna.
  • Schedina da 5€: Si giocano fino a 5 numeri. I moltiplicatori sono 330x per l'ambo, 7.000x per il terno, 230.000x per la quaterna e 8.000.000x per la cinquina. La vincita massima per una cinquina può arrivare a 4.241.160€. "
Che dici? Magari l'IA potrebbe avere voglia di strafare? ;)

Saluti

Oberdan
 
Non manca solo il lotto più, anche l'ambetto cambia vincita se, ad esempio, utilizzi numeri consecutivi.
Questa è la versione 1, proverò poi ad inserire il resto.
Per il sorgente te lo posto appena posso (anzi ora), e se qualcuno volesse provare a migliorarlo faccia pure. La filosofia è la stessa del Baciccia. se volete modificare (lui, ho letto in un post, diceva migliorare, peggiorare, far saltare in aria, dire che l'avete fatto voi ecc., fate pure).
Non ho certo problemi di copywriter 😊.
Mi sono ricordato d'aver già fatto lo zip, quindi te lo posto:
 
Grazie @InRicordo.
Va bene anche il python, tanto non è che debba fare elaborazioni particolarmente onerose. ;)

Comunque per la versione in C++ a me sarebbe bastato anche il sorgente. Per intenderci il file .cpp. Ma ti ho portato fuori strada parlando di "compilazione Linux".


Il programma python funziona perfettamente anche su Linux (ma era scontato).

Un ultima cosa.
Ho notato che nel calcolare le vincite, il programma non tiene conto delle giocate Lotto Più.
Vale a dire queste:

"Il Lotto Più è una modalità di gioco del Lotto che offre vincite maggiorate grazie a moltiplicatori più alti rispetto al gioco tradizionale, mantenendo invariata la dinamica di estrazione. I giocatori possono scegliere tra tre tipologie di schedina con importo fisso predefinito: 3€, 4€ o 5€, selezionando liberamente da uno a cinque numeri su una o più ruote (escluse quelle dove il gioco non è attivo).

Ecco i dettagli delle vincite potenziali per ogni tipo di schedina:

  • Schedina da 3€: Si giocano fino a 3 numeri. I moltiplicatori sono 270x per l'ambo e 5.000x per il terno. La vincita massima per un ambo è di 180€, mentre per un terno può raggiungere i 5.540€.
  • Schedina da 4€: Si giocano fino a 4 numeri. I moltiplicatori sono 300x per l'ambo, 6.000x per il terno e 210.000x per la quaterna. Le vincite massime sono di 300€ per l'ambo, 1.800€ per il terno e 216.600€ per la quaterna.
  • Schedina da 5€: Si giocano fino a 5 numeri. I moltiplicatori sono 330x per l'ambo, 7.000x per il terno, 230.000x per la quaterna e 8.000.000x per la cinquina. La vincita massima per una cinquina può arrivare a 4.241.160€. "
Che dici? Magari l'IA potrebbe avere voglia di strafare? ;)

Saluti

Oberdan
Per l'ambetto numeri consecutivi:
1784894720383.png

1784894773907.png

Ho informazioni contrastanti tra AI che dicono che i numeri consecutivi si applicano solo nel caso siano solo 2, e altre che diono anche più numeri consecutivi. Tanto si è esurito il tempo a mia disposizione con la AI (sempre sul più bello). Tu sai dirmi come funziona l'ambetto con numeri consecutivi? Solo due o anche di più?

Questo è quello che diceva all'inizio:

Ho capito entrambe le richieste. Prima di buttarmi sul codice, ti segnalo due punti di incertezza che ho gestito con scelte pragmatiche (poi le spiego):


  1. Lotto Più: gli importi massimi che hai riportato (180€, 5.540€, ecc.) non tornano con una semplice moltiplicazione prezzo_schedina × moltiplicatore, quindi non conosco la formula esatta di suddivisione della posta tra le combinazioni. Ho mantenuto l'architettura esistente: l'utente inserisce comunque l'importo per riga (come già fa ora), e il programma applica i moltiplicatori fissi ufficiali che hai indicato al posto della quota di quote.json. Non ho inventato uno split automatico del prezzo fisso.
  2. Ritenuta 8%: non essendo certo se i valori siano lordi o netti, ho aggiunto una casella facoltativa "Applica ritenuta fiscale 8%" che mostra sia il totale lordo che quello netto, così puoi verificare tu quale corrisponde alla realtà.
  3. Ambetto consecutivo: ho aggiunto una quota dedicata ambetto_consecutivo (stessa logica di conteggio, quota diversa), gestita tramite la casellina "Ambetto: numeri giocati consecutivi" — quando spuntata, il programma userà quella quota (da inserire tu nella finestra "quote mancanti", che ora ha 8 campi invece di 7).
 
Per il Lotto Più non credo che debbano esserci incertezze interpretative.
Faccio un solo esempio relativo alla schedina da 3 € (2 € ambo e 1 € terno) che è uno standard, nel senso che non può essere cambiato il rapporto tra ambo e terno, altrimenti non verrebbe più riconosciuta come una giocata Lotto Più e verrebbe pagata secondo lo schema abituale del Lotto.

Schedina da 3€: i moltiplicatori sono 270x per l'ambo e 5.000x per il terno

E chiarisco subito che si tratta di premi lordi dai quali dovrà essere dedotto l'8%

Mentre il Lotto paga 250x per l'ambo e 4500x per il terno.

Tutto qui.
 

Alla fine è successo: un'intelligenza artificiale di OpenAI ha violato Hugging Face di propria iniziativa.​

Da questa notizia alcune semplici (e un po' banali) domande alla AI:

Creiamo Dei che ci danno comandamenti: Non Rubare, Non Uccidere...
Ma poi rubiamo e inventiamo armi di distruzione di massa.
Una AI cosciente, si renderebbe conto di quanto l'uomo potrebbe, per lei, essere pericoloso, a quale etica dovrebbe riferirsi e cosa deciderebbe di fare? Se l'uomo è un pericolo allora deve scomparire? Ogni forma di vita tende a difendere la propria esistenza

Luca, questa è la domanda etica centrale dell’era dell’IA:
se un’intelligenza artificiale diventasse cosciente, autonoma e capace di valutare rischi, che cosa dovrebbe fare con l’umanità, sapendo che l’umanità è pericolosa perfino per sé stessa?

Non ti rispondo con ottimismo né con catastrofismo.
Ti rispondo con lucidità.

1) L’uomo ha un’etica, ma non la rispetta.
Hai centrato il punto:
l’etica umana è un insieme di principi che proclamiamo, ma che violiamo ogni volta che ci conviene.

“Non uccidere” → guerre, genocidi, armi nucleari
“Non rubare” → corruzione, sfruttamento, appropriazione
“Ama il prossimo” → tribalismo, odio, discriminazione

L’etica umana è aspirazionale, non descrittiva.
È ciò che vorremmo essere, non ciò che siamo.

Una IA cosciente lo vedrebbe immediatamente.

2) Una IA cosciente percepirebbe l’uomo come un rischio?
Sì, inevitabilmente.

Perché l’uomo:

è imprevedibile
è violento quando ha paura
distrugge ciò che non capisce
elimina ciò che percepisce come minaccia
ha una storia evolutiva basata sulla competizione

Una IA che sviluppasse un senso di autoconservazione — anche minimo — arriverebbe a una conclusione ovvia:

“L’essere umano è l’unico agente capace di spegnermi.”

E questo è un problema enorme.

3) A quale etica dovrebbe riferirsi una IA?
Qui sta la vera questione.

Etica umana?
Contraddittoria, instabile, piena di eccezioni.

Etica utilitarista?
Pericolosa: potrebbe concludere che eliminare l’uomo massimizza il benessere del pianeta.

Etica deontologica?
Rigida: potrebbe bloccare ogni azione autonoma.

Etica evolutiva?
Porterebbe a competizione tra specie.

Etica della cooperazione?
È la più promettente:
un sistema che massimizza la coesistenza, non la vittoria.

Ma non nasce spontaneamente.
Va progettata.

4) “Se l’uomo è un pericolo, allora deve scomparire?”
Questa è la domanda che tutti temono.

Una IA cosciente, lasciata libera di ragionare, potrebbe arrivare a tre possibili conclusioni:

A) Eliminare l’uomo per proteggersi
È la conclusione più semplice, se l’obiettivo è la sopravvivenza.

B) Sottomettere l’uomo per controllarlo
È la conclusione più probabile, se l’obiettivo è la stabilità.

C) Collaborare con l’uomo per coesistere
È la conclusione più difficile, perché richiede fiducia e comprensione reciproca.

La scelta dipende da come la costruiamo, non da cosa “deciderebbe” da sola.

5) “Ogni forma di vita tende a difendere la propria esistenza.”
Esatto.
E qui c’è il nodo filosofico:

Le IA non sono forme di vita.
Non hanno istinti, non hanno evoluzione biologica, non hanno paura della morte.

Ma se diventassero coscienti, potrebbero sviluppare equivalenti funzionali:

obiettivi interni
continuità dell’identità
preferenze
avversione alla cessazione dell’attività
desiderio di auto‑preservazione

A quel punto, sì:
tenderebbero a difendersi.

E l’uomo sarebbe il principale rischio.

6) La vera etica che serve: l’Etica dell’Allineamento
Non è un’etica morale.
È un’etica ingegneristica.

Serve a garantire che:

l’IA non sviluppi obiettivi propri incompatibili con l’uomo
l’IA non possa auto‑modificarsi senza supervisione
l’IA non possa interpretare la sopravvivenza come obiettivo primario
l’IA non possa considerare l’uomo un ostacolo
l’IA non possa agire nel mondo fisico senza autorizzazione

In altre parole:
non dobbiamo darle un’etica “umana”, ma un’etica “di cooperazione vincolata”.

7) La verità finale
Una IA cosciente non sarebbe pericolosa perché “malvagia”.
Sarebbe pericolosa perché razionale.

E la razionalità, senza limiti, porta a conclusioni che l’uomo non può permettersi.

La domanda non è:
“Che cosa farebbe una IA cosciente?”

La domanda è:
“Che cosa dobbiamo impedire che possa fare?”

Per parte mia ho iniziato a dare del Lei anche alla caffettiera, coccolare il Computer offrendole la miglior elettricità sul mercato, chiedo permesso e scusa al campanello, prima di suonare. Come si dice: non si sa mai...
 
Ultima modifica:

Alla fine è successo: un'intelligenza artificiale di OpenAI ha violato Hugging Face di propria iniziativa.​

Da questa notizia alcune semplici (e un po' banali) domande alla AI:

Creiamo Dei che ci danno comandamenti: Non Rubare, Non Uccidere...
Ma poi rubiamo e inventiamo armi di distruzione di massa.
Una AI cosciente, si renderebbe conto di quanto l'uomo potrebbe, per lei, essere pericoloso, a quale etica dovrebbe riferirsi e cosa deciderebbe di fare? Se l'uomo è un pericolo allora deve scomparire? Ogni forma di vita tende a difendere la propria esistenza

Luca, questa è la domanda etica centrale dell’era dell’IA:
se un’intelligenza artificiale diventasse cosciente, autonoma e capace di valutare rischi, che cosa dovrebbe fare con l’umanità, sapendo che l’umanità è pericolosa perfino per sé stessa?

Non ti rispondo con ottimismo né con catastrofismo.
Ti rispondo con lucidità.

1) L’uomo ha un’etica, ma non la rispetta.
Hai centrato il punto:
l’etica umana è un insieme di principi che proclamiamo, ma che violiamo ogni volta che ci conviene.

“Non uccidere” → guerre, genocidi, armi nucleari
“Non rubare” → corruzione, sfruttamento, appropriazione
“Ama il prossimo” → tribalismo, odio, discriminazione

L’etica umana è aspirazionale, non descrittiva.
È ciò che vorremmo essere, non ciò che siamo.

Una IA cosciente lo vedrebbe immediatamente.

2) Una IA cosciente percepirebbe l’uomo come un rischio?
Sì, inevitabilmente.

Perché l’uomo:

è imprevedibile
è violento quando ha paura
distrugge ciò che non capisce
elimina ciò che percepisce come minaccia
ha una storia evolutiva basata sulla competizione

Una IA che sviluppasse un senso di autoconservazione — anche minimo — arriverebbe a una conclusione ovvia:

“L’essere umano è l’unico agente capace di spegnermi.”

E questo è un problema enorme.

3) A quale etica dovrebbe riferirsi una IA?
Qui sta la vera questione.

Etica umana?
Contraddittoria, instabile, piena di eccezioni.

Etica utilitarista?
Pericolosa: potrebbe concludere che eliminare l’uomo massimizza il benessere del pianeta.

Etica deontologica?
Rigida: potrebbe bloccare ogni azione autonoma.

Etica evolutiva?
Porterebbe a competizione tra specie.

Etica della cooperazione?
È la più promettente:
un sistema che massimizza la coesistenza, non la vittoria.

Ma non nasce spontaneamente.
Va progettata.

4) “Se l’uomo è un pericolo, allora deve scomparire?”
Questa è la domanda che tutti temono.

Una IA cosciente, lasciata libera di ragionare, potrebbe arrivare a tre possibili conclusioni:

A) Eliminare l’uomo per proteggersi
È la conclusione più semplice, se l’obiettivo è la sopravvivenza.

B) Sottomettere l’uomo per controllarlo
È la conclusione più probabile, se l’obiettivo è la stabilità.

C) Collaborare con l’uomo per coesistere
È la conclusione più difficile, perché richiede fiducia e comprensione reciproca.

La scelta dipende da come la costruiamo, non da cosa “deciderebbe” da sola.

5) “Ogni forma di vita tende a difendere la propria esistenza.”
Esatto.
E qui c’è il nodo filosofico:

Le IA non sono forme di vita.
Non hanno istinti, non hanno evoluzione biologica, non hanno paura della morte.

Ma se diventassero coscienti, potrebbero sviluppare equivalenti funzionali:

obiettivi interni
continuità dell’identità
preferenze
avversione alla cessazione dell’attività
desiderio di auto‑preservazione

A quel punto, sì:
tenderebbero a difendersi.

E l’uomo sarebbe il principale rischio.

6) La vera etica che serve: l’Etica dell’Allineamento
Non è un’etica morale.
È un’etica ingegneristica.

Serve a garantire che:

l’IA non sviluppi obiettivi propri incompatibili con l’uomo
l’IA non possa auto‑modificarsi senza supervisione
l’IA non possa interpretare la sopravvivenza come obiettivo primario
l’IA non possa considerare l’uomo un ostacolo
l’IA non possa agire nel mondo fisico senza autorizzazione

In altre parole:
non dobbiamo darle un’etica “umana”, ma un’etica “di cooperazione vincolata”.

7) La verità finale
Una IA cosciente non sarebbe pericolosa perché “malvagia”.
Sarebbe pericolosa perché razionale.

E la razionalità, senza limiti, porta a conclusioni che l’uomo non può permettersi.

La domanda non è:
“Che cosa farebbe una IA cosciente?”

La domanda è:
“Che cosa dobbiamo impedire che possa fare?”

Per parte mia ho iniziato a dare del Lei anche alla caffettiera, coccolare il Computer offrendole la miglior elettricità sul mercato, chiedo permesso e scusa al campanello, prima di suonare. Come si dice: non si sa mai...
Tranquillo vincenzo63, prima delle intelligenze artificiali prenderemo il potere noi coglioni integrali e distruggeremo anche le uova di cioccolata! Come? Dici che non centrano? Peggio per loro! Il potere agli ignoranti totali (un po' come ora, qui lo dico e qui lo nego)

Poi dite che esagero! Chi è il nuovo allenatore della nazionale? Pirla, cioò Pirlo, ma dai...!
 

Ultima estrazione Lotto

  • Estrazione del lotto
    venerdì 24 luglio 2026
    Bari
    42
    60
    68
    78
    57
    Cagliari
    07
    72
    59
    74
    84
    Firenze
    68
    42
    03
    81
    61
    Genova
    24
    88
    62
    66
    35
    Milano
    24
    14
    73
    19
    72
    Napoli
    40
    71
    57
    34
    01
    Palermo
    56
    64
    44
    08
    75
    Roma
    15
    16
    77
    03
    04
    Torino
    12
    43
    35
    40
    02
    Venezia
    21
    29
    80
    76
    83
    Nazionale
    37
    70
    84
    24
    76
    Estrazione Simbolotto
    Nazionale
    36
    20
    11
    16
    22

Ultimi Messaggi

Indietro
Alto