Generazione di numeri cifra per cifra di lunghezza variabile

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
tornadotux
Prode Principiante
Messaggi: 92
Iscrizione: domenica 19 agosto 2007, 20:51

Generazione di numeri cifra per cifra di lunghezza variabile

Messaggio da tornadotux »

Voglio realizzare un algoritmo che mi permetta di selezionare certi numeri una volta soddisfatta una condizione.
Parto dal codice sperando che si capisca il ragionamento:

Codice: Seleziona tutto

public List<List<int>> selezione(List<Tentativo> tentativi)
        {
            int  nCifre, cardinalita, nTent, ris;

            List<List<int>> superstiti = new List<List<int>>();

            cardinalita = 10;
            nCifre = 4;
            nTent = tentativi.Count;
            
            // X 4 CIFRE
              for (int i = 0; i < cardinalita; i++)
                for (int j = 0; j < cardinalita; j++)
                    for (int k = 0; k < cardinalita; k++)
                        for (int m = 0; m < cardinalita; m++)
                        {
                            int contatore = 0;
                            List<int> vettore = new List<int>();

                            vettore.Add(m);
                            vettore.Add(k);
                            vettore.Add(j);
                            vettore.Add(i);

                            foreach (Tentativo tentativo in tentativi)
                            {
                                //arrayNumero è un List<int>
                                confronto(vettore, tentativo.arrayNumero, nCifre, cardinalita, out ris);
                                if (ris == 20) contatore++;
                            }

                            if (contatore == nTent) superstiti.Add(vettore);
                        }
            return superstiti;
        }
Genero dei numeri cifra per cifra che memorizzo in una lista chiamata vettore.
Do vettore in pasto a ad un metodo chiamato confronto(..) che dopo aver eseguito dei test mi restituisce un valore, out ris.Se questo valore soddisfa una certa condizione allora il numero in vettore viene salvato.

Ora questo algoritmo funziona per numeri di 4 cifre: il mio obbiettivo è che possa funzionare con un numero arbitrario di cifre, il numero di cifre sarebbe passato al metodo selezione quando viene chiamato.

Qualcuno mi saprebbe aiutare?
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: Generazione di numeri cifra per cifra di lunghezza varia

Messaggio da gila75 »

Se generi in modo casuale, con rand (per esempio in C), sei tu a decidere in che campo.
Quindi puoi variare a tuo piacimento no?
Avatar utente
tornadotux
Prode Principiante
Messaggi: 92
Iscrizione: domenica 19 agosto 2007, 20:51

Re: Generazione di numeri cifra per cifra di lunghezza varia

Messaggio da tornadotux »

Dimenticavo: il linguaggio è il c#

Forse non misono spiegato bene.
Quello che voglio e che il metodo potrebbe funzionare anche in questo modo:

Codice: Seleziona tutto

               ...........................................................
              // X 5 CIFRE
              for (int i = 0; i < cardinalita; i++)
                for (int j = 0; j < cardinalita; j++)
                    for (int k = 0; k < cardinalita; k++)
                        for (int m = 0; m < cardinalita; m++)
                         for (int p = 0; p < cardinalita; p++)                        
                              {
                            int contatore = 0;
                            List<int> vettore = new List<int>();

                            vettore.Add(m);
                            vettore.Add(k);
                            vettore.Add(j);
                            vettore.Add(i);
                            vettore.Add(p);
                             .......................................................
Ma anche per 6 o 7 o 8 cifre e così via.
Avatar utente
tornadotux
Prode Principiante
Messaggi: 92
Iscrizione: domenica 19 agosto 2007, 20:51

Re: Generazione di numeri cifra per cifra di lunghezza varia

Messaggio da tornadotux »

Ho trovato una soluzione:

Codice: Seleziona tutto

ulong progr =0;

void creaNumeri(int nCifre, int cardinalita)
        {
            string limite= "";
            short[] vector = new short[nCifre];
            List<short[]> matrice = new List<short[]>();
            for (int u = 0; u < nCifre; u++) limite += "" + (cardinalita - 1).ToString();

            int i = 0, j = 0;
            while ((i < nCifre) & (j < cardinalita))
            {
                if (progr == ulong.Parse(limite)) break;
                if (vector[j] < cardinalita - 1)
                {
                    short[] basket = new short[vector.Length];
                    vector[j]++;
                    progr++;

                    for (int h = 0; h < vector.Length; h++) basket[h] = vector[h];
                    matrice.Add(basket);

                    //if ((progr % 1000) == 1)
                    //{
                    //    for (int e = vector.Length - 1; e >= 0; e--) Console.Write(vector[e] + " "); 
                    //    Console.WriteLine("--" + "   progr: " + progr);
                    //}
                }
                else
                {
                    short[] basket = new short[vector.Length];
                    short[] vettoreTMP = riporto(i, j, vector, nCifre, cardinalita);
                    for (int h = 0; h < vector.Length; h++) basket[h] = vettoreTMP[h];

                    matrice.Add(basket);
                    //if ((progr % 1000) == 1)
                    //{
                    //    for (int e = vector.Length - 1; e >= 0; e--) Console.Write(basket[e] + " "); 
                    //       Console.WriteLine("oo");
                    //}
                }
            }
        }

        short[] riporto(int i, int j, short[] array, int cifre, int cardinalita)
        {
            if (j < cifre - 1)
            {
                if (array[j + 1] < cardinalita - 1)
                {
                    array[j + 1]++;
                    progr++;    // serve per il test di arresto
                }
                else
                {
                    riporto(i, j + 1, array, cifre, cardinalita);
                }
                for (int index = 0; index <= j; index++) array[index] = 0;
                i = 0;
            }
            return array;
        }
Ha dei limiti:
-- limite massimo
nCifre: 7
cardinalita 10
-- Si può semplificare il codice?

Codice: Seleziona tutto

short[] basket = new short[vector.Length];
short[] vettoreTMP = riporto(i, j, vector, nCifre, cardinalita);
for (int h = 0; h < vector.Length; h++) basket[h] = vettoreTMP[h];
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 23 ospiti