Todas las combinaciones posibiesq

38 views
Skip to first unread message

aguml

unread,
Sep 3, 2020, 10:39:30 PM9/3/20
to CyC++ Buenos Aires
Buenas amigos, llevo varias horas intentando hacer un código que me muestre todas las combinaciones de un rango de caracteres que yo le indique. Suponiendo que el rango es abc serían;
a, b, c, aa, ba, ca, ab, bb, cb, ac, bc, cc, aaa, baa, caa, aba, bba, , cba, aca, bca, cca, aab, bab, cab, abb, bbb, cbb, acb, bcb, ccb, aac, bac, cac, abc, bbc,  cbc, acc, bcc, ccc

El orden tiene que ser de izquierda a derecha tan como se ve y en este caso hay 3^1 + 3^2 + 3^3 o sea en este caso serían 39 posibilidades. No me sirve solo con números.

Daniel Gutson

unread,
Sep 4, 2020, 8:10:09 AM9/4/20
to cppba
Proba partiendo el programa en tres: todas las combinaciones de tamaño 1, todas las de tamaño 2, y todas las de tamaño 3.
Después te fijás si podés generalizarlo en una sola forma.

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/cppba/536de6d0-e729-4159-8248-0596bd496cafn%40googlegroups.com.


--
Who’s got the sweetest disposition?
One guess, that’s who?
Who’d never, ever start an argument?
Who never shows a bit of temperament?
Who's never wrong but always right?
Who'd never dream of starting a fight?
Who get stuck with all the bad luck?

Nicolás Gómez

unread,
Sep 4, 2020, 9:27:40 AM9/4/20
to cp...@googlegroups.com
No reinventes la rueda :)

si estas tratando de crackear un hash, ya tenes el hashcat jejeje

aco...@gmail.com

unread,
Sep 11, 2020, 12:05:19 AM9/11/20
to CyC++ Buenos Aires
Hola; un poco tarde, claro.

Esta es una solución que viene a ser una transliteración de una especie de máquina de combinar, que sería así:
Un eje donde se pueden ir insertando rueditas.
Cada una de esas rueditas tiene una cantidad de dígitos, por ejemplo, una ruedita puede tener tres dígitos: 'a', 'b', 'c', por ejemplo, u otros ('1', '2', '3', '4' o lo que se sea).
La idea es que en ese Eje se pueden ir colocando rueditas, cada una con su serie de dígitos, y se van girando de a una. Por ejemplo, la primera clic, clic, clic, hasta que que se vuelve al origen. Después se pasa a girar la segunda un clic, y se empieza la serie otra vez con la primera. Así con todas y cada una, hasta que se termine de girar la última. Si más o menos me supe explicar, lo que se está haciendo es ir multiplicando.
Ejemplo; con dos rueditas {a, b} y {1, 2} al ir girándolas queda: a1, a2, b1, b2.
Aclaro, cada ruedita puede tener distintas cantidades de dígitos, en el código de abajo pongo tres rueditas todas con {'a', 'b', 'c'} pero podrían tener cada una distintos dígitos y distinta cantidad de dígitos, total que de todos modos lo que hace es ir girando de a uno.

Bueno, esta es la criatura:

#include <iostream>
#include <initializer_list>
#include <vector>

class Ruedita {
public:
    Ruedita(const std::initializer_list<char>& lista_de_digitos)
    {
        for (const auto& d : lista_de_digitos) {
            digitos.push_back(d);
        }
        a_cero();
    }
    bool avanzar_uno() // gira la ruedita un paso
    {
        ++posicion_actual;

        if (posicion_actual == digitos.size()) { // vuelve a la posición inicial
            a_cero();
            return false;
        }

        digito_actual = digitos.at(posicion_actual); // avanza al dígito siguiente
        return true;
    }
    char digito() const {
        return digito_actual;
    }
    void a_cero() {
        posicion_actual = 0;
        digito_actual = digitos.at(0);
    }
private:
    std::vector<char> digitos;
    char digito_actual;
    size_t posicion_actual;
};

class Eje { // donde se van insertando las Rueditas
public:
    void agregar_una(const Ruedita& ruedita) {
        rueditas.push_back(ruedita);
    }
    bool girar_una() {
        for (auto& r : rueditas) {
            if (r.avanzar_uno()) {
                return true;
            }
        }
        return false;
    }
    void girar() {
        mostrar();
        while (girar_una()) {
            mostrar();
        }
        for (auto& r : rueditas) {
            r.a_cero();
        }
    }
    void mostrar() {
        for (const auto& r : rueditas) {
            std::cout << r.digito();
        }
        std::cout << ' ';
    }
private:
    std::vector<Ruedita> rueditas;
};

int main()
{
    Eje eje{};
    Ruedita r1{ 'a', 'b', 'c' };
    eje.agregar_una(r1);
    eje.girar();
    std::cout << '\n';

    Ruedita r2{ 'a', 'b', 'c' };
    eje.agregar_una(r2);
    eje.girar();
    std::cout << '\n';

    Ruedita r3{ 'a', 'b', 'c' };
    eje.agregar_una(r3);
    eje.girar();
    std::cout << '\n';
}

Daniel Gutson

unread,
Sep 14, 2020, 8:50:48 PM9/14/20
to cppba
Te faltan los espacios, y considerar de tamaño 1 y 2. x ej: a, ab.

Carlos Bederián

unread,
Sep 14, 2020, 8:57:05 PM9/14/20
to CPPBA
Quote que me vino a la mente: 

"Sometimes, the elegant implementation is just a function. Not a method. Not a class. Not a framework. Just a function."
- John Carmack

RFOG

unread,
Sep 17, 2020, 10:44:39 PM9/17/20
to cp...@googlegroups.com
Yo voy a añadir también una frase: "Si quieres hacer algo y existe una librería para ello, y encima si es estándar, ¡¡usa la puta librería y un reinventes una rueda hexagonal, jodío!!"

:-P

Daniel Gutson

unread,
Sep 21, 2020, 5:54:25 PM9/21/20
to cppba
Se trata de un ejercicio que todavía no resolvieron. 

Alejandro Comes

unread,
Sep 21, 2020, 10:05:04 PM9/21/20
to cp...@googlegroups.com
Salvo error u omisión...

Y a ver otras soluciones?


#include <iostream>
#include <initializer_list>
#include <vector>
#include <algorithm>
        variar();

    }
    bool girar_una()
    {
        for (auto& r : rueditas) {
            if (r.avanzar_uno()) {
                return true;
            }
        }
        return false;
    }
    void variar()
    {
        do {
            insertar();
        } while (girar_una());
    }
    void insertar()
    {
        for (const auto& r : rueditas) {
            variaciones.push_back(r.digito());
        }
        variaciones.push_back(',');
        variaciones.push_back(' ');
    }
    std::string getVariaciones()
    {
        std::string svar(variaciones.begin(), variaciones.end());
        if(svar.size())
            svar.pop_back();
        if (svar.size())
            svar.pop_back();
        return svar;

    }

private:
    std::vector<Ruedita> rueditas;
    std::vector<char> variaciones;

};

int main()
{
    Eje eje{};

    Ruedita r1{ 'a', 'b', 'c' };
    eje.agregar_una(r1);

    Ruedita r2{ 'a', 'b', 'c' };
    eje.agregar_una(r2);

    Ruedita r3{ 'a', 'b', 'c' };
    eje.agregar_una(r3);
    std::cout << eje.getVariaciones() << '\n';

}

Has recibido este mensaje porque estás suscrito a un tema del grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/cppba/7PucLvC5FNw/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a cppba+un...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/cppba/CAFdMc-3b9qN0BWhoP8OSU%2BwzHg05YNwuR4m8JU9-3Os8piFn_A%40mail.gmail.com.

Carlos Bederián

unread,
Sep 22, 2020, 8:09:14 AM9/22/20
to CPPBA
La solución ~clásica de...algoritmos 1?
https://godbolt.org/z/5eWY1K

aco...@gmail.com

unread,
Sep 24, 2020, 5:10:54 AM9/24/20
to CyC++ Buenos Aires
Bué, el mío es mejor, lejos.
Reply all
Reply to author
Forward
0 new messages