Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    6

    Generazione di stringhe alfanumeriche composte sequenziali e non ripetute

    Devo generare delle stringhe alfabetiche di tre caratteri formati dalla combinazione di questi caratteri tipo:
    AAA
    AAB
    AAC
    ....
    ZZX
    ZZY
    ZZZ


    E devo generare in concatenazione altre stringhe formate da un carattere alfabetico e due numerici che se minori di 10 devono iniziare con lo 0 le quali verranno separate da un trattino.


    nella fattispecie mi serve un output del tipo:
    xxx-yzz
    - dove con xxx intendo il set di caratteri sopra citati
    - il trattino deve rimanere tale
    - la y rappresenta una lettera dell'alfabeto dalla a alla z
    - la zz rappresenta un numero che parte da 01 e finisce a 99


    es. output
    brc-d04.stringa_generica


    La generazione dovrebbe essere incrementale e sequenziale quindi fornirmi tanti output quante sono le combinazioni possibili.


    Le stringhe devono essere generate interamente, una dopo l'altra già finite affinchè queste possano essere successivamente memorizzate in una variabile il cui valore deve subire controlli successivi prima di essere stampato (per i controlli non ci sono problemi so come fare).


    La mia difficoltà sta nel fatto che la stringa è composta.


    Un codice di questo tipo:
    codice:
    <?php
    $maxLength = 3;
    $charSet = 'abcdefgjhklmnopqrstuvwxyz';
    $size = strlen($charSet);
    $base = array();
    $counter = 0;
    $baseSize = 3;
    // Let's see how many combinations exist for the given length and charset
    $combinations = 0;
    for($i=1;$i<=$maxLength;$i++) {
        $combinations += pow($size,$i);
    } 
    echo "There are $combinations possible combinations!<br/><br/>";
    while($baseSize <= $maxLength) {
        // Go through all the possible combinations of last character and output $base
        for($i=0;$i<$size;$i++) {
            $base[0] = $i;
            for($j=$baseSize-1;$j>=0;$j--) {
                echo $charSet[$base[$j]];
            }
            echo '<br/>';    
        }
        // How many $base elements reached their max?
        for($i=0;$i<$baseSize;$i++) {
            if($base[$i] == $size-1) $counter++;
            else break;
        }
        // Every array element reached max value? Expand array and set values to 0. 
        if($counter == $baseSize) {
            // Notice <=$baseSize! Initialize 0 values to all existing array elements and ADD 1 more element with that value
            for($i=0;$i<=$baseSize;$i++) {
                $base[$i] = 0;
            }
            $baseSize = count($base);
        }
        // Carry one
        else {
            $base[$counter]++;
            for($i=0;$i<$counter;$i++) $base[$i] = 0;
        }
        $counter=0;
    }
    ?>
    Non va bene perché genera le stringhe una ad una prima di stamparle. Il tutto devo riuscire a farlo senza DB e senza file intermedi tipo file xml o di testo.


    Ringrazio in anticipo tutti quelli che hanno perso tempo a leggere questo post e spero in una risposta che risolva il mio problema.


    Saluti

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Non ho capito quello che vuoi fare.

    Vuoi una lista tipo ?
    aaa-a01
    aaa-a02
    aaa-a03
    ...
    aaa-z99
    aab-a01
    ...
    zzz-z99
    Cioè una lista di 26x26x26x26x99 elementi ?

    Poi scrivi => Non va bene perché genera le stringhe una ad una prima di stamparle. Il tutto devo riuscire a farlo senza DB e senza file intermedi tipo file xml o di testo.
    Non capisco.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    6
    Ciao e grazie per la risposta. Si devo generare la lista tipo questa:
    aaa-a01
    aaa-a02
    aaa-a03
    ...
    aaa-z99
    aab-a01
    ...
    zzz-z99

    Quando ho scritto:
    Non va bene perché genera le stringhe una ad una prima di stamparle. Il tutto devo riuscire a farlo senza DB e senza file intermedi tipo file xml o di testo.
    Intendevo dire che la stringa finita deve essere memorizzata su un array e dovrà subire un controllo prima di essere stampata a video e solo a video, non su un file di testo, non su un db, no su un file xml.

    Ti ringrazio per l'interesse posto al thread.

    Buona giornata.


  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    26x26x26x26x99 sono più di 45.000.000 combinazioni. Poi 7 bytes per posto sono più 315 Mbytes !
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    6
    Per questo motivo devo fare poi un controllo per "scremare" prima di stampare a video. Comunque dimensioni e tempo di computazione non sono un problema.

  6. #6
    Quote Originariamente inviata da noob.81 Visualizza il messaggio
    Ciao e grazie per la risposta. Si devo generare la lista tipo questa:
    aaa-a01
    aaa-a02
    aaa-a03
    ...
    aaa-z99
    aab-a01
    ...
    zzz-z99

    Quando ho scritto:
    Non va bene perché genera le stringhe una ad una prima di stamparle. Il tutto devo riuscire a farlo senza DB e senza file intermedi tipo file xml o di testo.
    Intendevo dire che la stringa finita deve essere memorizzata su un array e dovrà subire un controllo prima di essere stampata a video e solo a video, non su un file di testo, non su un db, no su un file xml.

    Ti ringrazio per l'interesse posto al thread.

    Buona giornata.


    Usa la base 36
    Codice PHP:
    <?php
    //trasforma 'aaaa' da base 36 a base 10, restituisce 479890
    echo base_convert('aaaa'3610).'<br>';
    echo 
    '<hr>';

    for(
    $i=479890$i<=479893$i++){
     for(
    $j=0$j<=99$j++){
       
    //aggiunge uno zero iniziale quando richiesto
      
    $n=$j<10'0'.$j $j;
       
    //converte da base 10 a base 36
      
    $result=base_convert($i1036).$n
       
    //aggiunge il trattino
      
    echo(substr($result,0,3).'-'.substr($result,3).'<br>');
     }
    }
    ?>

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Codice PHP:
    <?php
    //$lettere = "abcdefghijklmnopqrstuvwxyz";
    $lettere "ab";
    $res = array();
    for (
    $i=0;$i<strlen($lettere);$i++) {
     for (
    $j=0;$j<strlen($lettere);$j++) {
      for (
    $k=0;$k<strlen($lettere);$k++) {
       for (
    $l=0;$l<strlen($lettere);$l++) {
         for (
    $m=0;$m<=9;$m++) {
       for (
    $n=1;$n<=9;$n++) {
         
    $res[] = substr($lettere,$i,1).substr($lettere,$j,1).substr($lettere,$k,1).'-'.substr($lettere,$l,1).$m.$n;
       }
      }
     }
       }
      }
     }
    print_r($res);
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

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 © 2025 vBulletin Solutions, Inc. All rights reserved.