Novità

x Luigi o joe chiarimenti funzione Spazioscript

i legend

Premium Member
ciao :)
ho dovuto utilizzare la funzione numeriripetutirilevatiV (aMioArray,aRipetuti,aQuanti)
non riesco a farle rintracciare i numeri superiori a 90
quindi o non vengono valutati alla base o sto sbagliando qualcosa.

se non lo fa provo a compilarla
grazie:)
 
Ciao Ilegend.

Se non ricordo male è come scrivi.

È semplice per te riscrivere questa funzione

eliminando il limite dei 90 estratti.

:)
 
Ciao Joe Immaginavo :)
ho provato a scrivere una funzione ma sicuramente è ottimizzabile

Ultimamente mi occupo a tempo pieno di mio padre e in piu per risolvere i miei problemucci di salute (ero diventato obeso, ora tutto rientrato) ,è da tanto che non faccio piu script e pertanto ho perso un po di smalto (se mai c'è ne stato:))

se perfavore ci potete dare un occhiata
p.s : ho usato ordina matrice turbo è temo che possa rallentare il tempo di elaborazione
nella realta devo scorrere solo 11 elementi.
ecco la sub con la funzione
che spero funzioni correttamente
Codice:
Option Explicit
'Lo scopo dello script è controllare il corretto funzionamento della funzione GetRipetuti
' non se ne assicura il funzionamento
' avevo anche pensato ad utilizzare do while partendo il conteggio dal fondo ma non credo possa essere piu veloce
' senza utilizzare OrdinaMatriceTurbo diventa tutto piu difficile 
Sub Main
    ReDim aV(101),aRip(UBound(aV))
    Dim i
    For i = 1 To UBound(aV)
        aV(i) = NumeroCasuale(1,100)
        If aV(i) > 90 Then Scrivi aV(i)
    Next
    ReDim aNum(0),aQ(0)
    aV(101) = MassimoV(aV) + 1
    Call NumeriRipetutiRilevatiV(aV,aNum,aQ)
    Scrivi StringaNumeri(aNum,,True)
    Scrivi StringaNumeri(aQ,,True)
    Call GetRipetuti(aV,aRip)
    Scrivi"------------------"
    Scrivi StringaNumeri(aRip,,True)
End Sub
Function GetRipetuti(aV,aRip)
    Dim N1,N2,N3,C
    Call OrdinaMatriceTurbo(aV,1)
    For N1 = 1 To UBound(aV) - 2
        N2 = N1 + 1
        If aV(N1) = aV(N2) Then
            N3 = N2 + 1

            If aV(N2) < aV(N3) Then
                C = C + 1

                aRip(C) = aV(N2)
            End If
        End If
    Next
    ReDim Preserve aRip(C)
End Function
 
Ciao Legend..qui dal cellulare non riesco a vedere bene il tuo codice e capire perche hai voluto usare l ordinamento..per lo scopo non e necessario..se sai il limite dei numeri possibili puoi creare in array e valorizzare a true il tale elemento solo se gia non e valorizzato al termine rileggi l array e prendi i numeri che identificano i elementi valorizzati. Un altra soluzione potrebbe essere l uso di una collection in cui onserisci l elemento con la chiave..dato che nella collection non possono esistere due elementi con uguale chiave al termine rileggendone il contenuto avrai solo elementi univoci..
 
Ciao luigi come credevo c'è molto da ottimizzare.
al volo ho preso la strada più che immediata.
avevo messo i valori in colonna dato un occhiata e compilato l algoritmo. Semplice semplice :)
ora provo a implementare una delle tue idee :)
sperando di riuscire :)
a dopo :)
 
Ciao Luigi ora ho provato ad elaborare l algoritmo senza utilizzare ordinamatrice

sono curioso di leggere il tuo se puoi o hai voglia di scriverlo per valutare le differenze dei tempi di elaborazione.

sarei altrettanto curioso di leggere quella di joe
non per fare raffronti ovviamente ma sempre perchè mi piace imparare dai "Meglio" :)
Codice:
Option Explicit
'Lo scopo dello script è controllare il corretto funzionamento della funzione GetRipetuti
' non se ne assicura il funzionamento
' avevo anche pensato ad utilizzare do while partendo il conteggio dal fondo ma non credo possa essere piu veloce
' senza utilizzare OrdinaMatriceTurbo diventa tutto piu difficile 
Sub Main
    ReDim aV(101),aRip(UBound(aV))
    Dim i
    For i = 1 To UBound(aV)
        aV(i) = NumeroCasuale(1,100)
        If aV(i) > 90 Then Scrivi aV(i)
    Next
    ReDim aNum(0),aQ(0)
    aV(101) = MassimoV(aV) + 1
    Call NumeriRipetutiRilevatiV(aV,aNum,aQ)
    Scrivi StringaNumeri(aNum,,True)
    Scrivi StringaNumeri(aQ,,True)
    Call GetRipetuti(aV,aRip)
ReDim aTro (0)
Call GetRipMag90(aV,aTro)
Scrivi StringaNumeri(aTro,,True)


    Scrivi"------------------"
    Scrivi StringaNumeri(aRip,,True)
End Sub
' Algoritmo per Array Ordinato
Function GetRipetuti(aV,aRip)
    Dim N1,N2,N3,C
    Call OrdinaMatriceTurbo(aV,1)
    For N1 = 1 To UBound(aV) - 2
        N2 = N1 + 1
        If aV(N1) = aV(N2) Then
            N3 = N2 + 1

            If aV(N2) < aV(N3) Then
                C = C + 1

                aRip(C) = aV(N2)
            End If
        End If
    Next
    ReDim Preserve aRip(C)
End Function
'Algoritmo per Array NonOrdinato
Function GetRipMag90(aRip,aTro)
    Dim i,j,m,k
    For i = 1 To UBound(aRip) - 1
        m = 0
        For j = i + 1 To UBound(aRip)
            If aRip(j) > - 1 Then
                If aRip(i) = aRip(j) Then m = m + 1:aRip(j) = - 1
            End If
        Next
        If m > 0 Then
            k = k + 1
            ReDim Preserve aTro(k)
            aTro(k) = aRip(i)
        End If
    Next
End Function
spero che raccolga tutti i dati :)
 
ciao Legend , ecco qui l'implementazione di tutti e 3 i metodi

con ordinamatrice
con arrayflag
con collection

bada bene usare ordinamatrice va benissimo probabilmente è anche il piu veloce però introduce la complicazione dell'algoritomo per leggere l'array ordinato allla ricerca dei doppi...


Codice:
Option Explicit
Class clsNumConRpetizioni
    Dim Num
    Dim nPres
    Sub IncrementaPres
        nPres = nPres + 1
    End Sub
End Class
Sub Main
    Dim aV,aRetN,aRetQ
    Dim k

    ReDim aV(10)
    For k = 1 To UBound(aV)
        aV(k) = NumeroCasuale(91,100)
    Next

    Call EliminaRipetutiConOrdinaMatrice(aV,aRetN,aRetQ)
    Call GestioneOutput(aV,aRetN,aRetQ,"EliminaRipetutiConOrdinaMatrice")


    Call EliminaRipetutiConArrayFlag(aV,aRetN,aRetQ)
    Call GestioneOutput(aV,aRetN,aRetQ,"EliminaRipetutiConArrayFlag")

    Call EliminaRipetutiConCollection(aV,aRetN,aRetQ)
    Call GestioneOutput(aV,aRetN,aRetQ,"EliminaRipetutiConCollection")


End Sub
Sub EliminaRipetutiConOrdinaMatrice(aV,aRetN,aRetQ)
    Dim k,i,nUpper
    nUpper = UBound(aV)
    ReDim aRetN(nUpper)
    ReDim aRetQ(nUpper)
    Call OrdinaMatriceTurbo(aV,1)
    i = 0
    For k = 1 To UBound(aV)
        i = i + 1
        aRetN(i) = aV(k)
        Do While aV(k + aRetQ(i)) = aRetN(i)
            aRetQ(i) = aRetQ(i) + 1
            If k + aRetQ(i) > nUpper Then Exit Do
        Loop
        k = k +(aRetQ(i) - 1)

    Next
    ReDim Preserve aRetN(i)
    ReDim Preserve aRetQ(i)


End Sub

Sub EliminaRipetutiConArrayFlag(aV,aRetN,aRetQ)

    Dim k,i,nUpper

    nUpper = MassimoV(aV)
    ReDim aRetN(nUpper)
    ReDim aRetQtmp(nUpper)
    ReDim aRetQ(nUpper)

    ReDim aFlag(nUpper)

    For k = 1 To UBound(aV)
        If Not aFlag(aV(k)) Then
            i = i + 1
            aRetN(i) = aV(k)
            aFlag(aV(k)) = True
            aRetQtmp(aV(k)) = aRetQtmp(aV(k)) + 1

        Else
            aRetQtmp(aV(k)) = aRetQtmp(aV(k)) + 1

        End If
    Next
    ReDim Preserve aRetN(i)
    ReDim Preserve aRetQ(i)

    For k = 1 To UBound(aRetN)
        aRetQ(k) = aRetQtmp(aRetN(k))
    Next

End Sub

Sub EliminaRipetutiConCollection(aV,aRetN,aRetQ)

    Dim k,i,nUpper,sKey
    Dim coll,cNum
    Set coll = GetNewCollection





    For k = 1 To UBound(aV)

        sKey = "k" & aV(k)
        If GetItemCollection(coll,sKey,cNum) Then
            cNum.IncrementaPres
        Else
            Set cNum = New clsNumConRpetizioni
            cNum.Num = aV(k)
            cNum.nPres = 1
            coll.Add cNum,sKey
        End If


    Next

    nUpper = coll.count
    ReDim aRetN(nUpper)
    ReDim aRetQ(nUpper)

    For k = 1 To coll.count
        Set cNum = coll(k)
        aRetN(k) = cNum.Num
        aRetQ(k) = cNum.nPres

    Next

End Sub


Sub GestioneOutput(aInput,aNumUnivoci,aQuantRip,sFunzione)

    Dim k
    Dim aV

    Call Scrivi(sFunzione)
    Call Scrivi(StringaNumeri(aInput))
    aV = Array("","Numero","Ripetizioni")
    Call InitTabella(aV)
    For k = 1 To UBound(aNumUnivoci)
        aV(1) = aNumUnivoci(k)
        aV(2) = aQuantRip(k)
        Call AddRigaTabella(aV)

    Next
    Call CreaTabella(1 ,1)
End Sub
 
Ringrazio anch'io per la "Stele di Luigi"

che permette un rapido confronto tra i 3 modelli-stili di programmazione.

:)
 
Come la famosa stele di rosetta che permise la comprensione dei grroglifici....grazie Joe
 

Ultima estrazione Lotto

  • Estrazione del lotto
    sabato 12 luglio 2025
    Bari
    67
    30
    66
    89
    47
    Cagliari
    06
    66
    33
    32
    37
    Firenze
    43
    25
    78
    21
    23
    Genova
    34
    20
    85
    52
    33
    Milano
    36
    19
    02
    70
    77
    Napoli
    21
    72
    74
    15
    53
    Palermo
    32
    08
    37
    02
    86
    Roma
    27
    32
    12
    67
    06
    Torino
    45
    47
    08
    13
    32
    Venezia
    29
    34
    19
    51
    53
    Nazionale
    34
    18
    56
    47
    85
    Estrazione Simbolotto
    Nazionale
    02
    26
    01
    08
    17
Indietro
Alto