Siguiente consecutivo alfanumérico: calcular matrículas con reglas de prioridad

Un miembro de la comunidad, J. Gil, planteó un problema clásico con un giro interesante: calcular el siguiente consecutivo de una matrícula alfanumérica tipo BAC99Y, donde cada posición tiene su propio rango y reglas de reinicio.

El esquema es el de las matrículas de coche antiguas: cuando una posición llega a su límite, se reinicia a su valor mínimo y la siguiente (de mayor prioridad) avanza. La dificultad está en manejar correctamente los extremos, donde varias posiciones cambian a la vez:

- BAC99Y → BAC00Z (el 99 reinicia a 00 y la Y pasa a Z)
- CZZ99Z → DAA00A (todas las posiciones encadenan el reinicio)

La comunidad propuso dos enfoques muy distintos.

Oscar: detectar la posición a incrementar con BUSCARX

``
=MAP(A2:A7;LAMBDA(a;LET(
w; EXTRAE(a;{4;6;3;2;1};{2;1;1;1;1});
x; BUSCARX(0;N(w={"99";"Z";"Z";"Z";"Y"});w);
SI.ND(SUSTITUIR(a;x;SI.ERROR(TEXTO(x+1;"00");CARACTER(CODIGO(x)+1)));"ERROR")
)))
`

Oscar descompone la cadena en sus 5 posiciones con EXTRAE y usa BUSCARX para encontrar la primera que no está en su valor máximo. A esa posición le suma 1 (numérica o alfabéticamente con CARACTER/CODIGO). Solución elegante y legible, pero no cubre el caso extremo donde varias posiciones cambian a la vez.

John: tratar la cadena como número en base 36

`
=MAP(A2:A7;LAMBDA(a;LET(
E; EXTRAE;
p; {4;6;3;2;1};
q; 1+(p=4);
w; E(a;p;q);
@FILTRAR(
REEMPLAZAR(a;p;q;SI(q=2;BASE(w+1;10;2);UNICAR(CODIGO(w)+1)));
w<>E("YZZ99Z";p;q);
"ERROR"
)
)))
`

John aborda el problema desde otra óptica: si se trata toda la cadena como un único número en base 36, el problema se reduce a sumar 1 respetando el orden de prioridad. Usa BASE para el tramo numérico y UNICAR/CODIGO para las posiciones alfabéticas, con FILTRAR como control del valor máximo (YZZ99Z).

Conclusión

El mismo problema admite enfoques radicalmente distintos según se piense en "posiciones independientes" (Oscar) o en "un único número con base mixta" (John). El archivo adjunto contiene el planteamiento original de J. Gil y la propuesta final de John con los ejemplos extremos ya resueltos.

Un recordatorio útil de que MAP + LAMBDA + LET son la combinación natural cuando hay que aplicar una lógica condicional a cada fila de un rango, y de que BASE/UNICAR/CODIGO` permiten trabajar con representaciones numéricas arbitrarias sin salir de la hoja.

El reto: el "siguiente" de un código alfanumérico

J. Gil planteó en la comunidad un problema clásico con un giro: calcular el siguiente consecutivo de una matrícula alfanumérica tipo BAC99Y, donde cada posición tiene su propio rango y sus reglas de reinicio. Es el esquema de las matrículas de coche antiguas: cuando una posición llega a su tope, vuelve a su valor mínimo y la posición de mayor prioridad avanza una unidad.

La dificultad está en los extremos, donde varias posiciones cambian a la vez:

  • BAC99Y pasa a BAC00Z: el 99 reinicia a 00 y la Y avanza a Z.
  • CZZ99Z pasa a DAA00A: el reinicio se encadena por todas las posiciones.

La comunidad propuso dos enfoques muy distintos, y la comparación es lo interesante.

Enfoque 1 (Oscar): localizar la posición a incrementar

La idea es descomponer la cadena en sus cinco posiciones con EXTRAE, detectar la primera que todavía puede crecer y sumarle uno —numérica o alfabéticamente—:

=MAP(A2:A7;LAMBDA(a;LET(
    w; EXTRAE(a;{4;6;3;2;1};{2;1;1;1;1});
    x; BUSCARX(0;N(w={"99";"Z";"Z";"Z";"Y"});w);
    SI.ND(SUSTITUIR(a;x;SI.ERROR(TEXTO(x+1;"00");CARACTER(CODIGO(x)+1)));"ERROR")
)))

BUSCARX busca la primera posición que aún no está en su valor máximo; a esa se le suma 1 con TEXTO si es numérica o con CARACTER/CODIGO si es una letra. Es una solución elegante y muy legible. Su límite: no cubre el caso extremo en el que varias posiciones se reinician a la vez.

Enfoque 2 (John): tratar la cadena como un número en base 36

John abordó el problema desde otra óptica. Si consideras toda la matrícula como un único número en base 36 (los dígitos 0 al 9 más las letras), calcular el siguiente consecutivo se reduce a "sumar uno" respetando el orden de prioridad, exactamente igual que al pasar de 99 a 100 en base 10. Para ello:

  • Usa BASE para avanzar el tramo puramente numérico.
  • Usa UNICAR y CODIGO para hacer avanzar las posiciones alfabéticas letra a letra.
  • Controla el valor máximo del sistema (YZZ99Z) para devolver un aviso cuando ya no hay siguiente.

La ventaja de pensar en base mixta es que el encadenamiento de reinicios sale solo, sin tratar cada extremo como un caso especial.

Funciones clave

  • MAP + LAMBDA + LET: aplican una lógica condicional a cada fila de un rango, el patrón natural para este tipo de problema.
  • EXTRAE: separa la cadena en sus posiciones.
  • BUSCARX: localiza la primera posición que todavía puede incrementarse.
  • BASE, UNICAR, CODIGO: permiten trabajar con representaciones numéricas y con letras dentro de la hoja.

Conclusión

El mismo problema admite enfoques radicalmente distintos según cómo lo pienses: como "posiciones independientes" que se incrementan una a una (Oscar) o como "un único número con base mixta" al que sumas uno (John). El segundo es más abstracto pero maneja los reinicios en cadena con naturalidad. Este contraste entre soluciones —cada una con sus ventajas— es justo lo que hace valiosa a la comunidad de Influexcel: no una respuesta, sino varias formas de mirar el mismo reto.

Más casos con estas funciones

Más contenido de Excel en InflueXcel