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';
}