Novità

Chi mi aiuta?

Cinzia27

Premium Member
Chi cortesemente può aiutarmi?

Sub main()

Dim n(3)
n(1)=1
n(2)=2
n(3)=3
For i=1 To 3

Scrivi n(i)

next

End Sub

Con questo script ho
1
2
3


Avrei necessità di ottenere
1
2

1
3

2
3

MA togliendo un elemento per volta.
 

Mike58

Advanced Member >PLATINUM PLUS<
Cinzia, vedi se può andar bene

Codice:
Sub Main
   Dim N(2)
   For n1 = 1 To 5
      For n2 = n1 + 1 To 5
         If n2 > n1 Then
            N(1) = n1 : N(2) = n2
            Scrivi N(1)
            Scrivi N(2)
            Scrivi
         End If
      Next
   Next
End Sub

1
2

1
3

1
4

1
5

2
3

2
4

2
5

3
4

3
5

4
5
 

joe

Advanced Member >PLATINUM PLUS<
Ciao Cinzia,

Se scomponi la terzina in ambi, per poterlo fare devi avere 2 indici.

Esattamente come creeresti degli Ambi di essi.

Come giustamente ti ha suggerito Ilegend ci sarebbero anche istruzioni specifiche di Spaziometria.

Degli esempi a corredo del programma ti ho adattato questo:

Codice:
Option Explicit
Sub Main
 
   Dim k,s
   Dim nClasse,nColonneTot
   ReDim aNumeri(3)
   Dim aCol
 
   nClasse = 2 ' sviluppo in ambi
   ' inizializzo i numeri da sviluppare in questo caso 90
   ' ma potrebbero essere anche di meno
   For k = 1 To 3
      aNumeri(k) = k
   Next
   'inizializza lo sviluppo
   nColonneTot = InitSviluppoIntegrale(aNumeri,nClasse)
   k = 0
 
   ' ciclo che continua fiono a quando le colonne non finiscono
   Do While GetCombSviluppo(aCol)
   
      k = k + 1 ' conteggio colonna corrente
   
      ' costruisco la stringa che contiene la colonna
      s = FormatSpace(k,10,True) & "- " & StringaNumeri(aCol)
      Call Scrivi(s)
   
      Call Messaggio("Colonna " & k)
      If ScriptInterrotto Then Exit Do

   Loop
End Sub

Ma se consideri una terzina trovo più semplice gestire lo sviluppo con il fai da te.

Dunque anziché 89 = 90 - 1 hai 2 = 3 - 1 come limite massimo del primo loop.
E poi, il classico i+1 to 3 per il secondo indice.

Il tuo codice che gestisce ed integra questo secondo puntatore potrebbe essere

Codice:
Option Explicit
Sub Main()
   Dim n(3)
   Dim i,f
   n(1) = 1
   n(2) = 2
   n(3) = 3
   For i = 1 To 2
      For f = i + 1 To 3
         Scrivi n(i) & "-" & n(f)
      Next
   Next
End Sub

Che produce :

Codice:
1-2
1-3
2-3

Un saluto anche a Mike altra sicura colonna portante degli script di spaziometria.

:)
 

Cinzia27

Premium Member
Mike, io vorrei che in questo script fosse inserito un for che mi tolga un elemento per volta

Sub main()

Dim n(5)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5
For i=1 To 5

Scrivi n(i)

next

End Sub

Risultato che vorrei

02.03.04.05
01.03.04.05
01.02.04.05
01.02.03.05
01.02.03.04
 

Cinzia27

Premium Member
Grazie, Joe, questo lo so fare ma io ho bisogno il contrario, cioè di togliere uno ( o due) elementi e di conservare il resto.
 

joe

Advanced Member >PLATINUM PLUS<
Ciao Cinzia, scusandomi con Mike.

Velocemente prima di andare a nanna.

Concettualmente è lo stesso ... ma con più indici ... si deve scrivere più codice

e diventa facile fare qualche errore.

Dunque per le quartine ed oltre è sicuramente meglio e molto più semplice modificare,

lo stesso script che ti ho proposto.

5 Numeri da sviluppare in classe 4.

Ho letto il tuo messaggio ... ma ad un controllo veloce non vedo differenze di sostanza

ma solo nell'ordine speculare con cui cui vengono esposti i risultati.

02.03.04.05
01.03.04.05
01.02.04.05
01.02.03.05
01.02.03.04

contro :

1- 1.2.3.4
2- 1.2.3.5
3- 1.2.4.5
4- 1.3.4.5
5- 2.3.4.5

:)
 

Enplein

Super Member >PLATINUM<
Mike, io vorrei che in questo script fosse inserito un for che mi tolga un elemento per volta

Sub main()

Dim n(5)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5
For i=1 To 5

Scrivi n(i)

next

End Sub

Risultato che vorrei

02.03.04.05
01.03.04.05
01.02.04.05
01.02.03.05
01.02.03.04
Ciao Cinzia, prova questa soluzione.

Enplein.
Codice:
Sub Main()

Dim n(5)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5
For i=1 To 2
For j=i+1 To 3
For y=j+1 To 4
For z=y+1 To 5
Scrivi n(i)&"."&n(j)&"."&n(y)&"."&n(z)
Next 
Next
Next 
Next

End Sub
 

Cinzia27

Premium Member
Joe, non è la stessa cosa perché se io ho un vettore con 10 elementi e devo ridurlo ad 8, devo fare 8 cicli for, cosa che otterrei con 2 cicli for.
Grazie, Enplein ma si tratta dello stesso modo di risolvere finora proposto anche da Mike e Joe.
 

Enplein

Super Member >PLATINUM<
Buongiorno.
Adesso penso di aver capito...

Enplein.
Codice:
Dim n(5),nr(4)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5

For i=1 To 5
g=0
For x=1 To 5
If n(x)<>n(i) Then g=g+1 : nr(g)=n(x)
Next 
Scrivi StringaNumeri (nr),1
Next 


End Sub
 
L

LuigiB

Guest
non riesco a capire perche non vada bene lo sviluppo dell'array di base come hanno detto Joe e Legend.

se vuoi togliere un elemento alla volta devi sviluppare in classe -1 , se ne vuoi togliere 2 devi sviluppare in classe -2 , in tutti i casi tu passi
il tuo array ad una funzione e quella ti ritorna un certo numero di combinazioni che sono quelel necessarie per il sottoinsieme che hai deciso.
e tu devi ciclare su queto array che contiene le combinazioni


' non ti spaventare per la lunghezza , ci sono 3 esempi percio è lungo , tu devi copiare nel tuo script solo le ultime 2 fuunzioni.

Codice:
Option Explicit
Sub Main()
   Dim aTest
   Dim k
   Dim aColonne
   aTest = Array(0,1,2,3)
   ' esempio 1
   'riduce di 1
   aColonne = GetSottoInsieme(aTest,1)
   For k = 1 To UBound(aColonne)
      Scrivi(StringaNumeri(aColonne(k)))
   Next
   'esempio 2
   ' riduce di 2
   aColonne = GetSottoInsieme(aTest,2)
   For k = 1 To UBound(aColonne)
      Scrivi(StringaNumeri(aColonne(k)))
   Next
   ' esempio 3
   ' riduce di uno le quartien che si formano con 5 numeri , ogni quartina da luogo a 4 terni
   aTest = Array(0,1,2,3,4,5)
   Call InitSviluppoIntegrale(aTest,4)
   ReDim aCol(4)
   Do While GetCombSviluppo(aCol)
      Call Scrivi(StringaNumeri(aCol))
      aColonne = GetSottoInsieme(aCol,1) ' riduce di 1
      For k = 1 To UBound(aColonne)
         Scrivi(StringaNumeri(aColonne(k)))
      Next
   Loop
End Sub
' copiare le seguenti funzioni nel proprio script
Function GetSottoInsieme(aN,PassoRid)
   Dim Mot
   Dim Classe,ClasseRid
   Dim nComb,iCol
   Dim aColonne
   Set Mot = GetMotoreSviluppoIntegrale
   Classe = UBound(aN)
   ClasseRid = Classe - PassoRid
   nComb = Mot.InitSviluppoIntegrale(aN,ClasseRid)
   ReDim aColonne(nComb)
   If nComb > 0 Then
      iCol = 0
      Do
         iCol = iCol + 1
         Call Dimensiona(aColonne(iCol),ClasseRid)
         Call Mot.GetCombSviluppo(aColonne(iCol))
      Loop While iCol < nComb
   End If
   GetSottoInsieme = aColonne
End Function
Function Dimensiona(v,c)
   ReDim v(c)
End Function
 

Cinzia27

Premium Member
Io ringrazio tutti voi per il vostro aiuto, da voi c'è sempre da imparare qualcosa.
Per Luigi: il motivo della richiesta di compilare in quel modo è che con pochi numeri non si vede la differenza di tempo
ma immettendo di più e se i numeri da togliere sono pochi si risparmia di mettere più for che allungano i tempi,
almeno credo.
 

Cinzia27

Premium Member
Buongiorno.
Adesso penso di aver capito...

Enplein.
Codice:
Dim n(5),nr(4)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5

For i=1 To 5
g=0
For x=1 To 5
If n(x)<>n(i) Then g=g+1 : nr(g)=n(x)
Next
Scrivi StringaNumeri (nr),1
Next


End Sub
Enplein possiamo aumentare i numeri ad es. da 5 a 10 e togliere 3 numeri?
 
Ultima modifica:

i legend

Premium Member
Ciao a tutti :)
X Cinzia
lo script di Luigi è molto più flessibile e più facile da gestire per fare le ricerche. Praticamente è sufficiente cambiare i numeri da combinare e scegliere la classe di riduzione, senza mai fare altre modifiche.
Hai fatto delle prove per notare differenza di tempo di esecuzione tra i due modi?
Sono curioso visto la potenza del tuo PC.
Se cambi classe di riduzione con i cicli for credo che siano necessari tanti script quanto le riduzioni da applicare.

X Luigi
Come sempre grazie . 🙂👍
 

Ultima estrazione Lotto

  • Estrazione del lotto
    giovedì 02 maggio 2024
    Bari
    43
    35
    83
    74
    40
    Cagliari
    10
    23
    48
    01
    87
    Firenze
    71
    12
    04
    27
    01
    Genova
    83
    37
    42
    70
    78
    Milano
    28
    72
    27
    30
    07
    Napoli
    34
    42
    13
    67
    11
    Palermo
    37
    77
    19
    17
    12
    Roma
    79
    85
    90
    55
    49
    Torino
    83
    56
    46
    57
    19
    Venezia
    41
    48
    57
    12
    15
    Nazionale
    84
    70
    10
    67
    74
    Estrazione Simbolotto
    Milano
    22
    09
    04
    01
    11

Ultimi Messaggi

Alto