Algoritmo che genera tutti i numeri possibili formati da 4 cifre

di il
40 risposte

40 Risposte - Pagina 2

  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    In modo non ricorsivo si può fare con un array di indici
    
    #include <stdio.h>
    #define LUN 5
    int main(){  
        char Vett[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        int c[LUN + 1] = {0};
        int i, s = sizeof(Vett);
        while(!c[LUN]){
            for(i = LUN - 1; i >= 0; i--)
                printf("%c", Vett[c[i]]);    
            printf("\n");    
            for(i = 0; i <= LUN; c[i++] = 0)
                if(++c[i] < s)
                    break;
        } 
        return 0;
    }
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Tombola!
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    La programmazione è come le poesie, tutti le sanno copiare, molti le sanno comprendere, in pochi le sanno scrivere.
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Bellissima, posso farla mia?

    Ti offendi se la copio?
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Invece, domande per lo OP


    Ma devono essere numeri o stringhe in un alfabeto generico?

    Perché numeri li puoi usare per fare calcoli, stringhe no
    E poi, l'ultimo programma fa un lavoro stupendo
    MA
    Non genera stringhe, si limita a stampare singoli caratteri, che una volta stampati hanno la stessa rappresentazione di una serie di stringhe

    Ma se allo OP servisse una successione di stringhe che esauriscono tutte le combinazioni di un alfabeto, ad esempio per testare una password a 'forza bruta', l'ultimo programma non andrebbe bene


    Ultima domanda: C o C++?
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Rubik ha scritto:


    La programmazione è come le poesie, tutti le sanno copiare, molti le sanno comprendere, in pochi le sanno scrivere.

    StandardOil ha scritto:


    Bellissima, posso farla mia?

    Ti offendi se la copio?
    E' la prima cosa che mi è venuta in mente appena ho visto il codece di Weierstrass, ora che l'ho riletta andrebbe bene sulla firma....
    Fai fai, non è coperta da copyright
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    StandardOil ha scritto:


    Invece, domande per lo OP


    Ma devono essere numeri o stringhe in un alfabeto generico?

    Perché numeri li puoi usare per fare calcoli, stringhe no
    E poi, l'ultimo programma fa un lavoro stupendo
    MA
    Non genera stringhe, si limita a stampare singoli caratteri, che una volta stampati hanno la stessa rappresentazione di una serie di stringhe

    Ma se allo OP servisse una successione di stringhe che esauriscono tutte le combinazioni di un alfabeto, ad esempio per testare una password a 'forza bruta', l'ultimo programma non andrebbe bene


    Ultima domanda: C o C++?
    Basta salvare man mano gli indici memorizzati nell'array c, anziché stampare:
    
    #include <stdio.h>
    #define LUN 2
    #define N 100 /* N = 10 elevato a LUN */
    
    int main(){  
        char Vett[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        int c[LUN + 1] = {0};
        int result[N][LUN];
        int i, s = sizeof(Vett), n = 0;
        while(!c[LUN]){
            for(i = LUN - 1; i >= 0; i--)
                result[n][i] = c[i];
            for(i = 0; i <= LUN; c[i++] = 0)
                if(++c[i] < s)
                    break;
            n++;
        } 
        
        /* Stampa */
        for(n = 0; n < N; n++)
        {
            for(i = LUN - 1; i >= 0; i--)
                printf("%c", Vett[result[n][i]]);
            printf("\n");
        }
                 
        return 0;
    }
    
    Ovviamente avrebbe più senso salvare allocare result nell'heap, così da dargli la giusta dimensione a runtime e anche perché all'aumentare (con legge esponenziale) delle dimensioni di vett e LUN si rischia di saturare lo stack.
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Io pensavo a una funzione successivo()

    Che riceve una stringa e la restituisce aggiornata al valore successivo secondo l'alfabeto e coi giusti riporti

    Stasera da casa...
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Va beh, puoi rigirartela come vuoi. Infila tutto il contenuto del ciclo while in una funzione successivo(), gli passi il vettore c che poi sarà anche il valore di ritorno...
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Esatto come prima approssimazione

    Stasera butto giù due righe
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Dal punto di vista "matematico" il problema consiste nello generare tutte le sequenze relative alle disposizioni con ripetizione di n elementi presi k alla volta.
    #include <stdio.h>
    
    #define N 5
    #define K 3
    
    int disposizione_R_successiva(unsigned int *u, unsigned int n, unsigned int k)
    {
        unsigned int i;
        for(i = 0; i < k && ++u[i] == n; u[i++] = 0);
        return i < k;
    }
    
    void stampa_disposizione_R(char *v, unsigned int *u, unsigned int dim)
    {
        for(unsigned int i = 0; i < dim; ++i)
        {
            printf("%c", v[u[i]]);
        }
        printf("\n");
    }
    
    int main()
    {
        char v[N] = {'A', 'B', 'C', 'D', 'E'};
        unsigned int u[K] = {0};
        do
        {
            stampa_disposizione_R(v, u , K);
        }
        while(disposizione_R_successiva(u, N, K));
    }
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Partecipo con un mio codice che genera tutte le password, con lunghezza definita a piacere, ottenibili in un range di caratteri scelto a piacere:
    
    #include <stdio.h>
    
    /* generazione di tutte la combinazioni possibili
       con un range di caratteri e lunghezza definibile */
    
    #define LUN 3 // scegli la lunghezza della password
    
    int main(){
        int da=(char)'a'; // scegli il carattere di partenza
        int a=(char)'z'; // scegli il carattere finale
        int n=0;
        char gen[LUN]; // conterrà la passw generata
        // carattere di partenza in tutte le posizioni (colonne)
        for (int col=0; col<LUN; col++){
            gen[col]=da;
        }
        do{
            printf("%s combinazione n. %d\n", gen, ++n);
            gen[LUN-1]++; // incremento carattere più a destra
            for (int col=LUN-1; col>0; col--){
                if (gen[col]==a+1){ // raggiunto il massimo carattere colonna corrente
                    gen[col]=da; // azzero il carattere colonna corrente
                    gen[col-1]++; // incremento il carattere colonna precedente
                }
            }
        }while (gen[0]<a+1); // carattere più a sinistra successivo a quello finale
        return 0;
    }
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Io ho pensato ad una cosa del genere, che funziona su stringhe, accetta alfabeti anche non molto "canonici" ed è ben parametrizzabile
    lo ho scritto sotto forma di funzione e una main minimale per provarla
    
    /*
     * successivo.c
     *
     * 26-11-2020 Nelson "Standardoil"
     * Sentitevi liberi di trarre ispirazione
     * L'ammiraglio non si offende
     *
     * per provare la generazione di un successore in una sequenza
     */
    
    
    #include <stdio.h>
    #include <string.h>
    
    #define DIM 4
    char candidato[DIM + 1] = {0};
    char alfabeto[] = "01243abA";
    // variabile per capire se il giro è partito
    int partito = 0; // 0->appena partito 1->carattere 0 cambiato 2->carattere 0 di nuovo al valore originale
    
    
    
    void successore(char * s, char * a)
    {
       // data una stringa s certamente composta da soli simboli presenti nell'alfabeto a
       // aggiorna tale stringa in quella immediatamente successiva
       // usando a come alfabeto ed eventualmente i riporti necessari, non gestisce lo overflow
       // quindi successore di per esempio 9999 sarà 0000
       size_t lc = strlen(s) - 1; // indice ultimo carattere (primo inteso come cifra meno significativa)
    
       while(lc + 1)
       {
          char c = s[lc]; // solo per comodità, altrimenti mi tocca ripeterlo tutte le volte
          int i = 0; //indice nell'alfabeto
    
          while(a[i])
          {
             if(a[i] == c)
             {
                // trovato, prendo il successore
                if(a[i + 1])
                {
                   // trovato il successore
                   s[lc] = a[i + 1];
                   // posso uscire
                   lc = -1 ; // prima del primo carattere della stringa, condizione di uscita
                   break;
                }
    
                else
                {
                   // alfabeto finito
                   // faccio fare il giro al carattere
                   s[lc] = a[0];
                   // torno indietro di un carattere nella stringa
                   lc--;
                   // e ricomicio
                   break;
                }
             }
    
             // prossimo carattere nell'alfabeto
             i++;
          }
       }
    }
    
    
    int main(int argc, char **argv)
    {
       // inizializzo il candidato con DIM volte il primo carattere
       for(size_t i = 0; i < DIM; i++)
       {
          candidato[i] = alfabeto[0];
       }
    
       printf("programma di prova candidati password\n");
    
       while(1)
       {
          printf("%s\n", candidato);
          successore(candidato, alfabeto);
    
          if(partito == 0)
          {
             if(candidato[0] != alfabeto[0])
             {
                partito = 1;
             }
          }
    
          else
          {
             if(candidato[0] == alfabeto[0])
             {
                printf("programma terminato\n");
                printf("\n");
                printf("\n");
                break;
             }
          }
       }
    
       return 0;
    }
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    StandardOil ha scritto:


    Io ho pensato ad una cosa del genere, che funziona su stringhe, accetta alfabeti anche non molto "canonici" ed è ben parametrizzabile
    lo ho scritto sotto forma di funzione e una main minimale per provarla
    Codice interessante.
    Però mi sono divertito a fare la stessa cosa indicizzando l'alfabeto personalizzato, viene così:
    
    #include <stdio.h>
    #include <string.h>
    
    #define DIM 4 // lunghezza della passw, modificabile a piacere
    
    int main()
    {
        char alfabeto[] = "0123456789ABCDEF"; // alfabeto personalizzato, modificabile a piacere anche in lunghezza, in fila solo per testing
    
        unsigned int LUN = sizeof(alfabeto)-1;
        unsigned int Indici[LUN];
        unsigned int n=0;
    
        // indicizzo l'alfabeto ---------------------
        for (unsigned int i=0; i<LUN; i++){
            Indici[i]=i;
            printf("Il carattre: %c ha indice: %d\n", alfabeto[i], Indici[i]);
        } //-----------------------------------------
    
        unsigned int gen[DIM]; // conterrà gli indici della stringa generata
        // indice di partenza in tutte le posizioni (colonne)
        for (unsigned int col=0; col<DIM; col++){
            gen[col]= Indici[0]; // praticamente sono tutti zeri
        }
        char conc[DIM+1]={0};
        do{
            for (unsigned int col=0; col<DIM; col++){
                conc[col]=alfabeto[gen[col]];// concateno il carattere che corrisponde all'indice
            }
            printf("%s combinazioni n. %d\n", conc, ++n);
    
            gen[DIM-1]++; // incremento indice più a destra
            for (unsigned int col=DIM-1; col>0; col--){ // tutte le colonne eccetto la zero
                if (gen[col]==LUN){ // raggiunto il massimo indice colonna corrente
                    gen[col]=0; // azzero l'indice colonna corrente
                    gen[col-1]++; // incremento l'indice colonna precedente
                }
            }
        }while (gen[0]<LUN); // controllo indice su colonna zero
    
        return 0;
    }
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Rubik ha scritto:


    Partecipo con un mio codice che genera tutte le password, con lunghezza definita a piacere, ottenibili in un range di caratteri scelto a piacere:
    - occhio, gen è una stringa o solo un array di caratteri?
    - dal punto di vista logico a quell'if potresti anche abbinare un else break.

    @StandardOil
    Secondo me risulta più efficiente operare direttamente sugli indici invece che sull' "alfabeto".
    Volendo operare con stringhe, il codice postato in precedenza diventerebbe:
    #include <stdio.h>
    #include <string.h>
    
    #define K 3
    
    int disposizione_R_successiva(unsigned int *u, unsigned int n, unsigned int k)
    {
        unsigned int i;
        for(i = 0; i < k && !(u[i] = (u[i] + 1) % n); ++i);
        return i < k;
    }
    
    void applica_disposizione_R(char *abc, char *s, unsigned int *u, unsigned int k)
    {
        for(unsigned int i = 0; i < k; ++i)
        {
            s[i] = abc[u[k - i - 1]];
        }
    }
    
    int main()
    {
        char *abc = "KoALa";
        unsigned int n = strlen(abc);
        unsigned int u[K] = {0};
        char s[K + 1] = {0};
        do
        {
            applica_disposizione_R(abc, s, u , K);
            printf("%s\n", s);
        }
        while(disposizione_R_successiva(u, n, K));
    }
Devi accedere o registrarti per scrivere nel forum
40 risposte