Pagina 3 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 34
  1. #21
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    codice:
    #include<stdio.h>
    
    #include<windows.h>  
    char box[]=
    {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l',
    'm','n','o','p','q','r','s','t','u','v','w','x','y','z'};  
    
    int A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,zero,uno,due,tre,quattro,
        cinque,sei,sette,otto,nove,dieci;
    int c1,c2;
    int validCode(char* string){
        A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=Q=R=S=T=U=V=W=X=Y=Z=zero=uno=due=tre=quattro=cinque=sei=sette=otto=nove=dieci=0;
        for(c1=0;c1<25;c1++){
                      if(string[c1]==box[0]) zero++;
                      if(string[c1]==box[1]) uno++;
                      if(string[c1]==box[2]) due++;
                      if(string[c1]==box[3]) tre++;
                      if(string[c1]==box[4]) quattro++;
                      if(string[c1]==box[5]) cinque++;
                      if(string[c1]==box[6]) sei++;
                      if(string[c1]==box[7]) sette++;
                      if(string[c1]==box[8]) otto++;
                      if(string[c1]==box[9]) nove++;
                      if(string[c1]==box[10]) dieci++;
                      if(string[c1]==box[11]) A++;
                      if(string[c1]==box[12]) B++;
                      if(string[c1]==box[13]) C++;
                      if(string[c1]==box[14]) D++;
                      if(string[c1]==box[15]) E++;
                      if(string[c1]==box[16]) F++;
                      if(string[c1]==box[17]) G++;
                      if(string[c1]==box[18]) H++;
                      if(string[c1]==box[19]) I++;
                      if(string[c1]==box[20]) J++;
                      if(string[c1]==box[21]) K++;
                      if(string[c1]==box[22]) L++;
                      if(string[c1]==box[23]) M++;
                      if(string[c1]==box[24]) N++;
                      if(string[c1]==box[25]) O++;
                      if(string[c1]==box[26]) P++;
                      if(string[c1]==box[27]) Q++;
                      if(string[c1]==box[28]) R++;
                      if(string[c1]==box[29]) S++;
                      if(string[c1]==box[30]) T++;
                      if(string[c1]==box[31]) U++;
                      if(string[c1]==box[32]) V++;
                      if(string[c1]==box[33]) W++;
                      if(string[c1]==box[34]) X++;
                      if(string[c1]==box[35]) Y++;
                      if(string[c1]==box[36]) Z++;
                                   }
                                   if(A>4||B>4||C>4||D>4||E>4||F>4||G>4||H>4||I>4||J>4||K>4||
                                   L>4||M>4||N>4||O>4||P>4||Q>4||R>4||S>4||T>4||U>4||V>4||W>4||
                                   X>4||Y>4||Z>4||zero>4||uno>4||due>4||tre>4||quattro>4||
                                   cinque>4||sei>4||sette>4||otto>4||nove>4||dieci) return 0;
        return 1;
        }
    main() 
    
    {    
          int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;
          char buf[24];     
       
        for(a = 0;a<36;a++)
        for(b = 0;b<36;b++)
        for(c = 0;c<36;c++)  
        for(d = 0;d<36;d++)  
        for(e = 0;e<36;e++)  
        for(f = 0;f<36;f++)  
        for(g = 0;g<36;g++)  
        for(h = 0;h<36;h++)  
        for(i = 0;i<36;i++)  
        for(j = 0;j<36;j++)  
        for(k = 0;k<36;k++)  
        for(l = 0;l<36;l++)  
        for(m = 0;m<36;m++)  
        for(n = 0;n<36;n++)  
        for(o = 0;o<36;o++)  
        for(p = 0;p<36;p++)  
        for(q = 0;q<36;q++)  
        for(r = 0;r<36;r++)  
        for(s = 0;s<36;s++)  
        for(t = 0;t<36;t++)  
        for(u = 0;u<36;u++)  
        for(v = 0;v<36;v++)  
        for(w = 0;w<36;w++)  
        for(x = 0;x<36;x++)  {
              sprintf(buf,"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%\n",box[a],box[b],box[c],box[d],
              box[e],box[f],box[g],box[h],box[i],box[j],box[k],box[l],box[m],box[n],box[o],box[p],box[q],
              box[r],box[s],box[t],box[u],box[v],box[w],box[x]);
    if(validCode(buf))printf("%s",buf);
    }
     }
    dovrebbe funzionare ma rimarrà ore senza stampare niente (soprattutto se hai un processore di media potenza) perchè per trovare un codice valido deve comunque scorrerli tutti.

    inviterei comunque oregon a controllare se ho tralasciato qualcosa

  2. #22
    codice:
    int A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,zero,uno,due,tre,quattro,
        cinque,sei,sette,otto,nove,dieci;
    (seguono seimila righe di codice)
    Ma... usare un array?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #23
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da MItaly
    codice:
    int A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,zero,uno,due,tre,quattro,
        cinque,sei,sette,otto,nove,dieci;
    (seguono seimila righe di codice)
    Ma... usare un array?
    per la leggibilità del codice è ovvio, ma credi sia meglio a livello di efficienza?
    valuta il ciclo per azzerare l'array ogni chiamata della funzione, il ciclo ulteriore per scorrere e confrontare

  4. #24
    ant_alt ...grazie per lo spuntone
    ...senti ma non capisco bene..come funziona il programma..

    codice:
    int validCode(char* string)
    ...ma questo sarebbe robba di puntatori?...
    ...capisco che ci metta molto tempo a restituirmi a video per il fatto che deve eseguire tutto il ciclo..ma se gentilmente mi potresti spiegare il perchè...o meglio come funziona il prog?

  5. #25
    Originariamente inviato da ant_alt
    valuta il ciclo per azzerare l'array ogni chiamata della funzione,
    ... ciclo che di fatto viene eseguito lo stesso con la riga
    codice:
        A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=Q=R=S=T=U=V=W=X=Y=Z=zero=uno=due=tre=quattro=cinque=sei=sette=otto=nove=dieci=0;
    ,
    anzi, forse addirittura in maniera meno efficiente se le variabili non sono tutte in fila in memoria; con un array la memset potrebbe azzerare il tutto il blocco sfruttando le sue conoscenze su come sia più efficiente indirizzare e scrivere la memoria (su x86 a gruppi di DWORD, se non erro).
    il ciclo ulteriore per scorrere e confrontare
    ... ciclo che il compilatore, se lo ritiene conveniente, può smontare da sé (loop unrolling). Inoltre anche la riduzione delle dimensioni del codice può essere conveniente rispetto al loop unrolling, il poco codice resta tutto in cache e il tempo di accesso ad esso diminuisce.
    Si può obiettare che tenendo le variabili separate il compilatore può utilizzare i registri, molto più veloci della cache e della RAM, ma dato che nell'architettura x86 i registri general-purpose sono pochi e qui le variabili sono tante il miglioramento di prestazioni derivante dall'uso dei registri per tre/quattro variabili sarebbe irrisorio.
    Ma al di là di tutte queste considerazioni puramente teoriche, tieni sempre presente che "premature optimization is the root of all evil". La cosa migliore è partire da un codice che sia il più pulito e logico possibile, lasciare che l'ottimizzatore del compilatore faccia il lavoro sporco e, se serve la massima efficienza, confrontare le performance della versione pulita e di quella ottimizzata, magari facendosi aiutare da un profiler.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #26
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da MItaly
    ..
    ok..
    codice corretto
    codice:
    #include<stdio.h>
     
    char box[]=
    {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l',
    'm','n','o','p','q','r','s','t','u','v','w','x','y','z'};  
    
    int cont[36];
    int c1,c2;
    int validCode(char* string){
                                for(c1=0;c1<36;c1++)cont[c1]=0;
        
                                for(c1=0;c1<25;c1++)
                                   for(c2=0;c2<36;c2++)
                                       if(string[c1]==box[c2]) cont[c2]++;
                                
                                for(c1=0;c1<25;c1++)
                                         if(cont[c1]>4) return 0;            
    
        return 1;
        }
    main() 
    
    {    
          int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;
          char buf[24];     
        
        for(a = 0;a<36;a++)
        for(b = 0;b<36;b++)
        for(c = 0;c<36;c++)  
        for(d = 0;d<36;d++)  
        for(e = 0;e<36;e++)  
        for(f = 0;f<36;f++)  
        for(g = 0;g<36;g++)  
        for(h = 0;h<36;h++)  
        for(i = 0;i<36;i++)  
        for(j = 0;j<36;j++)  
        for(k = 0;k<36;k++)  
        for(l = 0;l<36;l++)  
        for(m = 0;m<36;m++)  
        for(n = 0;n<36;n++)  
        for(o = 0;o<36;o++)  
        for(p = 0;p<36;p++)  
        for(q = 0;q<36;q++)  
        for(r = 0;r<36;r++)  
        for(s = 0;s<36;s++)  
        for(t = 0;t<36;t++)  
        for(u = 0;u<36;u++)  
        for(v = 0;v<36;v++)  
        for(w = 0;w<36;w++)  
        for(x = 0;x<36;x++)  {
              sprintf(buf,"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%\n",box[a],box[b],box[c],box[d],
              box[e],box[f],box[g],box[h],box[i],box[j],box[k],box[l],box[m],box[n],box[o],box[p],box[q],
              box[r],box[s],box[t],box[u],box[v],box[w],box[x]);
    if(validCode(buf))printf("%s",buf);
    }
     }
    ora però tu spiegalo all'utente

    ps: credo ci sia qualche errore nei numeri: tipo 36, forse è errato da qualche parte

  7. #27
    ..va bè..ringrazio tutti ..quando andrò avanti con il C me lo riesamino da solo..

    ... saluti !

  8. #28
    A titolo di curiosità, questo consente di calcolare tutte le combinazioni specificando arbitrariamente il set di caratteri (modificando l'array valori) e la lunghezza della stringa (modificando il #define NUMEROCIFRE).
    codice:
    #include <stdio.h>
    
    #define ARRSIZE(arr)    (sizeof(arr)/sizeof(*(arr)))
    
    #define NUMEROCIFRE 5
    
    int main()
    {
        const char valori[]= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char buffer[NUMEROCIFRE+1]={0};
        int stack[NUMEROCIFRE]={0};
        int cifraCorrente=0;
        for(; ; )
        {
            //Se siamo passati oltre
            if(stack[cifraCorrente]==ARRSIZE(valori))
            {
                //Torna alla cifra precedente, eventualmente esce
                if(--cifraCorrente==-1)
                    break;
                //Ripete il controllo
                continue;
            }
            buffer[cifraCorrente]=valori[stack[cifraCorrente]];
            //Se siamo nel ciclo più interno stampa il risultato
            if(cifraCorrente==NUMEROCIFRE-1)
                puts(buffer);
            stack[cifraCorrente]++;
            //Passa alla cifra successiva, a meno che non siamo già all'ultima
            if(cifraCorrente<NUMEROCIFRE-1)
            {
                cifraCorrente++;
                stack[cifraCorrente]=0;
            }
        }
        return 0;    
    }
    Con le impostazioni in questione (alfabeto di 36 simboli, 5 lettere di lunghezza):
    codice:
    matteo@teoubuntu:~/cpp$ gcc -Wall -O3 combinazioni.c -o combinazioni.o
    matteo@teoubuntu:~/cpp$ time ./combinazioni.o > combinazioni.txt
    
    real	0m4.078s
    user	0m2.424s
    sys	0m1.380s
    Di fatto quindi il calcolo effettivo impiega circa 2.42 secondi, gli 1.38 secondi di sys sono IO (e la differenza tra usr+sys e real è tempo dedicato ad altri processi). In sostanza, al netto dell'IO fa circa 25 milioni di combinazioni al secondo sul mio vecchio Athlon64 3800+.
    Inizio e fine del file generato:
    codice:
    matteo@teoubuntu:~/cpp$ head combinazioni.txt 
    00000
    00001
    00002
    00003
    00004
    00005
    00006
    00007
    00008
    00009
    matteo@teoubuntu:~/cpp$ tail combinazioni.txt 
    zzzzq
    zzzzr
    zzzzs
    zzzzt
    zzzzu
    zzzzv
    zzzzw
    zzzzx
    zzzzy
    zzzzz
    Non credo che terrò combinazioni.txt per ricordo...
    codice:
    matteo@teoubuntu:~/cpp$ ls -lh combinazioni.txt
    -rw-r--r-- 1 matteo matteo 346M 2009-10-06 22:52 combinazioni.txt
    matteo@teoubuntu:~/cpp$ rm combinazioni.txt 
    matteo@teoubuntu:~/cpp$
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #29
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da MItaly
    ..
    ma cos'è 346MB? i gruppi di 5?
    e a gruppi di 24 quanto peserà

    36^5=60.466.176 :master:

  10. #30
    36^5=60.466.176 combinazioni da 5 caratteri + ritorno a capo ciascuna = 60466176*6=362797056 bytes=345,99 MiB.
    Supponendo che il programma macini 25 milioni di combinazioni al secondo (non consideriamo l'IO) anche solo per "visitare" tutte le 36^24 combinazioni ci metterebbe circa 2,85*10^22 anni; se le dovesse anche scrivere, otterremmo un file di circa 1,23*10^26 TiB. Non credo che terrei neanche quello; preferisco le risposte compatte a lunghi calcoli (che so, 42 (cit.)).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.