Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyswietlanie różnych n cyfrowych ciagów znaków

Ostatnio zmodyfikowano 2016-12-28 22:46
Autor Wiadomość
mateczek
» 2016-12-26 19:25:34
insert dałem tylko by lepiej było widać kolejność. Jedno o co mi chodziło, to to że algorytm trzeba wywołać w jeszcze jednej pętli. I tak dla liter a,b,c i długości 2 generuje ciąg:


a  b  c  ba bb bc ca cb cc //taki generuje
aa ab ac ba bb bc ca cb cc //taki powinien. literka "a" jest traktowana jak zero w systemie liczbowym i algorytm je pomija. dlatego zamiast 01 jest po prostu 1

dlatego zaproponowałem dopełnienie do żądanej długości zerowym elementem tablicy (tutaj literka "a"). I wywołanie algorytmu w pętli dla poszczególnych długości ciądgu
i tak dla długośći jeden


dla długości =1
a  b  c
dla długości =2
aa ab ac ba bb bc ca cb cc
dla długości =3
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb

Takie zachowanie bierze się stąd, że Twój algorytm jest wzorowany na zamianie liczb(tutaj licznika) na inne systemy liczbowe (tutaj system bodajże trzydziestko-szóstko-wy:))
P-155462
mokrowski
» 2016-12-26 19:48:56
No i takie było wymaganie :-) Popatrz post nr 1. Tam zaczynało się od:
1
2
3
...

:-)
A i tak jeśli nawet przyjąć Twoją @mataczek interpretację, to lepiej będzie dopełnić na końcu "zerami" (jakiekolwiek one by nie były) i ew. obrócić.

PS. Dodatkowa pętla (o ile dobrze zrozumiałem) także nie będzie potrzebna... może umieszczę przykład za chwilę...
P-155466
mateczek
» 2016-12-26 20:30:22
po prostu dla danych wejśćiowych 123 i długości równej 2 twój algorytm pominie takie ciągi jak
11
21
31
ogólnie wszystkie ciągi z jedynką na końcu. Jeśli wywołać go 2 razy. Raz dla długości=1 potem dla długości=2 i w drugim przypadku dopełniając do wymaganej długości to będzie ok
P-155474
mokrowski
» 2016-12-26 20:45:14
Ach.. ok, zrozumiałem :) Twoja racja. Interpretowałem inaczej wymagania kolegi ;-)
P-155479
mokrowski
» 2016-12-26 23:26:09
A że zawsze warto się poprawić to...
Tak bym to napisał w "starym stylu":
C/C++
#include <iostream>
#include <string>
#include <cmath>

using namespace std;

string getStringCombination( const size_t & counter, const string & chars, const size_t & positions ) {
   
    const size_t charsLength = chars.length();
    string answer( "" );
   
    // Pusty string syngalizuje zakończenie generowania.
    // Tu lepszy jest optional ale nie u każdego w kompilatorze jeszcze jest (ma być w C++17)
    if( counter > pow( charsLength, positions ) ) {
        return answer;
    }
   
    size_t value = counter;
    for( size_t i = 0; i < positions; ++i ) {
        answer += chars[ value % charsLength ];
        value /= charsLength;
    }
    // Tym razem obrócę dla lepszej czytelności...
    return string( answer.rbegin(), answer.rend() );
}

int main() {
    const string chars( "12345" );
    const size_t positions = 2;
    size_t counter = 0;
   
    while( true ) {
        string answer = getStringCombination( counter++, chars, positions );
        if( answer == "" ) {
            break;
        }
        cout << answer << endl;
    }
}
A tak w nowym z użyciem optional (nie w każdym kompilatorze się jeszcze uda):
C/C++
#include <iostream>
#include <string>
#include <cmath>
// TODO: Jeszcze jest jeszcze w nagłówkach experimental
#include <experimental/optional>

using namespace std;
using namespace experimental;

optional < string >
getOptionStringCombination( const size_t & counter, const string & chars, const size_t & positions ) {
   
    optional < string > answer;
    const size_t charsLength = chars.length();
   
    if( counter > pow( charsLength, positions ) ) {
        return answer;
    }
    // TODO: Jeszcze nie mam w kompilatorze make_optional
    answer = string( positions, ' ' );
    size_t value = counter;
    for( auto & answerChar: * answer ) {
        answerChar = chars[ value % charsLength ];
        value /= charsLength;
    }
    return string( answer->crbegin(), answer->crend() );
}

int main() {
    const string chars { "12345" };
    constexpr size_t positions = 4;
    size_t counter = 0;
    while( true ) {
        optional < string > answer = getOptionStringCombination( counter++, chars, positions );
        if( not answer ) {
            break;
        }
        cout << * answer << endl;
    }
}
P-155495
killjoy
» 2016-12-27 00:02:23
Kiedyś napotkałem podobny problem. W zasadzie żeby uzyskać generowanie permutacji ciągu o zmiennej długości wystarczy stara dobra rekurencja. A z racji, że mam gotowy kod, to go wklejam, może komuś się jeszcze przyda:
C/C++
#include <fstream>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;




const char * cset;
char * Out;

unsigned int cset_len = 0;


void fill( int max, int ci )
{
   
    if( ci >= max )
         return;
   
    for( int n = 0; n < cset_len; n++ )
    {
        Out[ ci ] = cset[ n ];
       
        fill( max, ci + 1 );
       
        if( ci == max - 1 )
             printf( "%s\n", Out );
       
    }
   
   
}

int main( int argc, char ** argv )
{
   
   
    if( argc < 3 )
    {
        cout << "usage: [iteration_start-iteration_end] [charset]" << endl;
        return 1;
    }
   
    unsigned int Beg, End;
    char Sep = 0;
   
    if( sscanf( argv[ 1 ], "%d%c%d", & Beg, & Sep, & End ) == EOF || Sep != '-' || Beg > End || Beg < 1 )
    {
        cout << "Invalid iteration interval!" << endl;
        return 2;
    }
   
   
   
    cset_len = strlen( argv[ 2 ] );
    cset = argv[ 2 ];
   
    if( !cset_len )
    {
        cout << "Invalid charset!" << endl;
        return 3;
    }
   
    Out = new char[ End + 1 ];
    memset( Out, 0, End + 1 );
   
    long double Permutations = 0;
   
    for( int n = Beg; n < End + 1; n++ )
         Permutations += pow( cset_len, n );
   
    cout.setf( ios::fixed );
    cout.unsetf( ios::showpoint );
    cout.precision( 0 );
    cout << "Permutations: " << Permutations << endl << endl;
   
    for( int n = Beg; n < End + 1; n++ )
         fill( n, 0 );
   
    delete[] Out;
   
   
   
   
   
   
    return 0;
}

Tylko nie patrz na ten program jak na objawienie, pisany był jako single use only.
P-155498
Tomal
Temat założony przez niniejszego użytkownika
» 2016-12-28 22:46:22
Kurcze faktycznie, przy takiej ilości danych w pliku, nie zwróciłem uwagi, że elementu o "zerowym indeksie" brakuje. Dzięki za zwrócenie na to uwagi.
P-155620
1 « 2 »
Poprzednia strona Strona 2 z 2