C sharp - Letras a numeros

 
Vista:

Letras a numeros

Publicado por William (1 intervención) el 27/05/2021 22:06:17
Desarrollar un programa que reciba del usuario un número en palabras y el programa lo imprima en
números entre cero y un millón
Por ejemplo, el usuario digita la palabra mil, el programa imprime el número 1000.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-1
Responder
sin imagen de perfil
Val: 326
Plata
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Letras a numeros

Publicado por Miguel (143 intervenciones) el 28/05/2021 01:13:04
Y cual es la pregunta, este es un foro para contestar dudas sobre programacion. Agrega el codigo que haz intentado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 88
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Letras a numeros

Publicado por Kabuto (16 intervenciones) el 28/05/2021 12:38:38
Pues no es un ejercicio sencillo..., de hecho, iba a escribir un mensaje preguntando si más que un ejercicio, era un castigo o similar xD

A primera vista, la solución posible me parecía que sería hacer un switch gigantesco para devolver el valor de cada palabra que representa un valor, desde "cero" hasta "nueve mil novecientos noventa y nueve"
Lo cuál es absurdo...así que me paré a pensar en otra solución.

Y sí he dado con una. Básicamente es trasladar al código la lógica (aproximada) que usamos los humanos para reconocer los valores de estas palabras.
Es decir, hacer un análisis sintáctico de las palabras.

Si un humano leer por ejemplo el texto: "doscientos cincuenta y siete".

Pues reconocemos la palabras "doscientos" y sabemos que es 200.

A continuación reconocemos la palabra "cincuenta", sabemos que es 50, y que se suma al valor anterior 200 + 50

Reconocemos la palabra "y", y sabemos que no tiene valor numérico, solo es una conjunción. La ignoramos.

Por último, encontramos la palabra "siete", sabemos que es 7 y que se suma a los otros valores ya reconocidos:
200 + 50 + 7 = 257

Por lo general, cada palabra reconocida tiene un valor y se suman entre ellas.

Hay una excepción, la palabra "mil".
Supongamos el texto: "dosmil"

Reconocemos la palabras "dos", y sabemos que es 2.

Reconocemos la palabra "mil", sabemos que es 1000, pero para este caso también sabemos que no se suma al valor anterior:
2 +1000 = 1002
No, eso no es "dosmil"
Cuando encontramos la palabra "mil", en este caso se multiplica con el valor anterior:
2 x 1000 = 2000
Ahora sí hemos interpretado bien el "dosmil"


Bueno, básicamente, esta sería la lógica a seguir: Reconocer palabras del texto, obtener su valor y sumarlos o multiplicarlos según corresponda.


¿Y cómo hacemos para "reconocer" las palabras en el código del programa?

Podemos confeccionar unos "diccionarios" de valores.
A mi se me ha ocurrido hacer unos arrays con las palabras según el tipo de valor. Son las palabras que habitualmente utilizamos en nuestro idioma.
Luego con estos arrays, construyo una matriz para tenerlo todo junto en un único objeto.
1
2
3
4
5
6
7
        //Diccionarios de palabras que representan valores.
        static String[] unidades = { "un", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve" };
        static String[] valoresDiez = { "once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve" };
        static String[] decenas = { "diez", "veinte", "veinti", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" };
        static String[] centenas = { "cien", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos" };
        //Matriz con los cuatro diccionarios
        static String[][] matrizValores = { unidades, valoresDiez, decenas, centenas };

Con estos diccionarios, yo luego puedo recibir un String tipo: "cuarentayocho"
Busco que palabras de los diccionarios están en ese String, puedo guardarlas por separado en alguna colección como un List<String> y en el orden en que se encuentran en el String.
Cuando encuentro una palabra, la elimino de este String (método SubString() ) y sigo buscando en lo que queda de cadena.
Este proceso lo repito hasta que el String original se ha quedado vacío.

En este proceso también hay que buscar la palabra "mil", aunque no está en los diccionarios, pero ya hemos visto que es un caso especial y se trata de forma distinta a las demás, pero hay que buscarla también y guardarla en el List de palabras encontradas.
También busco la palabra "y", más que nada para descartarla del String original, pero sin guardar en el List, ya que no tiene valor numérico.

Al terminar este proceso, tendría las palabras encontradas en el List.
Pues ahora lo recorro y según la palabra, en un int voy sumando sus valores, o multiplicando si una palabra es "mil".

¿Y como se el valor numérico de cada palabra?
En realidad lo ideal sería aplicar POO y utilizar una clase cuyos atributos relacionen una palabra String con su valor numérico int.

Pero como no se si puedes aplicarlo en este ejercicio, se puede resolver buscando cada palabra en la matriz de valores y obteniendo en que posición se encuentra, fila y columna.

Luego ya con switch, métodos, o lo que se necesite, se puede decidir el valor correspondiente según las posiciones.

Si por ejemplo fila == 2 y columna == 1 (palabra "veinte"), retornamos 20.

Puede parecer que se necesitan muchos switchs, o muchos métodos, para evitar anidar montones de if else consultando los valores de fila y columna y decidir el valor correspondiente.
Pero no se necesita tanto, si se le echa un poco de imaginación.


He explicado de forma aproximada la lógica que yo he seguido.
Haz un intento de seguir esa lógica, u otra que se te ocurra a ti. Da igual si no lo consigues, ya he dicho que no es un ejercicio sencillo (a mi al menos me ha parecido complicadete...), pero lo importante es intentarlo, atascarse y equivocarse... es cuando más se aprende.

Yo luego más tarde compartiré mi solución, aunque insisto en la importancia de que intentes "algo", por muy pobre que vaya a ser el resultado.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 88
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Letras a numeros

Publicado por Kabuto (16 intervenciones) el 29/05/2021 00:17:26
Bueno, dejo aquí mi solución.
A William le insisto en que intente su propio código, llegue hasta donde llegue.

Si se limita a copiar mi solución y presentarla, no solo no aprenderá nada, si no que además siempre es un riesgo presentar un ejercicio que no se comprende y que por tanto no se sabe explicar.

He añadido la palabra "ciento" al diccionario de centenas, que antes no la tenía y haciendo pruebas me he dado cuenta de que me faltaba.

Incluye varios comentarios explicando, aún así, si alguien no entiende algo que lo pregunte y lo comentamos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
using System;
using System.Collections.Generic;
 
namespace LetrasANumeros
{
    class Program
    {
        //Diccionarios de palabras que representan valores.
        static String[] unidades = { "un", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve" };
        static String[] valoresDiez = { "once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve" };
        static String[] decenas = { "diez", "veinte", "veinti", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" };
        static String[] centenas = { "cien", "ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos" };
        //Matriz con los cuatro diccionarios
        static String[][] matrizValores = { unidades, valoresDiez, decenas, centenas };
 
        static void Main(string[] args)
        {
            String repetir = "";
            do
            {
 
                List<String> palabras = new List<string>();
 
                Console.Write("Teclea con letras un número entre cero y un millon: ");
                String numero = Console.ReadLine().ToLower();
                numero = numero.Replace(" ", ""); //Eliminamos espacios en blanco
 
                Console.Write("\nValor: ");
                Console.ForegroundColor = ConsoleColor.Yellow;
 
                //Descartamos primero los límites
                if (numero.Equals("cero"))
                    Console.Write(0);
                else if (numero.EndsWith("millon"))
                    Console.Write(1000000);
                else
                {
                    /*
                     * Buscamos palabras de nuestros diccionarios en el String mediante método buscaPalabras()
                     * Este método retorna true si encuentra una palabra reconocida o false si detecta una palabra
                     * que no está en nuestros diccionarios de valores, en cuyo caso pondremos fin al programa.
                     *
                     * Cada palabra encontrada, se restará del String.
                     * Por tanto, buscaremos mientras el String aún contenga texto
                     * o hasta que el método de buscar palabras retorne false.
                     */
                    bool continuar = true;
                    while (numero.Length > 0 && continuar)
                        continuar = BuscaPalabras(ref palabras, ref numero);
 
                    if (!continuar)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("Hay palabras desconocidas. No se puede analizar el valor introducido.");
                    }
                    else //Hemos encontrado y reconocido todas las palabras del String
                    {
                        int valor = 0;
                        //Analizaremos las palabras encontradas para decidir su valor, y si se suman a la siguiente o se multiplican
                        foreach (String palabra in palabras)
                            if (palabra.Equals("mil")) //Caso especial, se multiplica por el valor actual
                                valor *= 1000;
                            else
                                valor += CalcularValor(palabra);
                        //Mostramos el valor calculado
                        Console.WriteLine(valor);
 
                    }
 
                    Console.ResetColor();
                    Console.WriteLine("\n¿Repetir?(si/no)");
                    repetir = Console.ReadLine().ToLower();
                }
            } while (!repetir.Equals("no"));
        }
 
        static bool BuscaPalabras(ref List<String> palabras, ref String numero)
        {
            String palabraEncontrada = null;
 
            if (numero.StartsWith("mil")) //mil es un caso especial
            {
                palabraEncontrada = "mil";
            }
            else if (numero.StartsWith("y"))//La conjunción "y" es otro caso especial
            {
                palabraEncontrada = "y";
            }
            else
            {
                //Buscamos en la matriz
                for (int fila = 0; fila < matrizValores.Length; fila++)
                    for (int col = 0; col < matrizValores[fila].Length; col++)
                        if (numero.StartsWith(matrizValores[fila][col]))
                            palabraEncontrada = matrizValores[fila][col];
            }
            //Comprobamos si hemos encontrado una palabra reconocida.
            if (palabraEncontrada == null)
                return false; //Hay palabras que no reconocemos. No seguiremos adelante.
            else if (palabraEncontrada.Equals("y"))
            {
                //La "y" no se contabiliza en el List de palabras porque no tiene valor numérico.
                //Pero no la consideramos desconocida, así que la eliminamos
                //y retornaremos true
                numero = numero.Substring(1);
                return true;
            }
            else
            {
                //Guardamos la palabra encontrada
                palabras.Add(palabraEncontrada);
                //Eliminamos la palabra encontrada del String original.
                int indice = palabraEncontrada.Length;
                numero = numero.Substring(indice);
                return true; //Seguiremos buscando más palabras
            }
 
        }
 
        static int CalcularValor(String palabra)
        {
            //Buscamos posicion en la matriz de valores
            int fila = 0, col = 0;
 
            for (int f = 0; f < matrizValores.Length; f++)
                for (int c = 0; c < matrizValores[f].Length; c++)
                    if (palabra.Equals(matrizValores[f][c]))
                    {
                        fila = f;
                        col = c;
                    }
 
            //Segun fila y columna, decidimos el valor de esta palabra
            switch (fila)
            {
                case 0: //Unidades
                    if (col == 0) //Palabra es "un"
                        return 1;
                    else
                        return col; // El resto de valores, su valor coincide con su posición en la columna de la matriz
 
                case 1: //ValoresDiez
                    return col + 11; //Su valor equivale a su posicion en la col + 11
 
                case 2: //Decenas
                    if (col == 0) //Palabra es "diez"
                        return 10;
                    else if (col <= 2) //Palabras "veinte" y "veinti"
                        return 20;
                    else
                        return col * 10; //Resto de valores, su valor coincide con su posición en la columna de la matriz, multiplicado por 10
 
                case 3: //Centenas
                    if (col == 0) //Cien
                        return 100;
                    else
                        return 100 * col; //Incrementos de cien, según posicion en columna
 
                default: //Por si fila no es un valor entre 0 y 3, caso imposible, pero compilador obliga a contemplarlo como posibilidad
                    return 0;
            }
        }
    }
}


Si lo probamos, vemos que parece funcionar bien con cualquier número que se introduzca, tenga espacios en blanco o no:

imagen_2021-05-28_235824

Ojalá alguien comparta una solución alternativa.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
sin imagen de perfil
Val: 373
Plata
Ha aumentado su posición en 2 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Letras a numeros

Publicado por Agustin (171 intervenciones) el 29/05/2021 15:32:56
A ver muchachos... hay tanta tela para cortar acá.

Voy a empezar por decir que C# NO ES java, y que si vamos a usar un lenguaje moderno como C# empecemos a aprovechar las características de un lenguaje moderno en lugar de programar como si fuera 1999 como se hace en java.

Segundo, acá voy a mostrar la ENORME ventaja de un approach funcional contra un approach procedimental como el que usaste, lleno de bucles for, arrays anidados, y busquedas por indice que no tienen mucho sentido.

Tercero, voy a aprovechar para mostrar las características del lenguaje y como se pueden usar para producir código terriblemente limpio y sencillo.

El primer ejemplo que voy a dar es funcionalmente igual a lo que vos hiciste:

ZnFVtO2

Con la enorme diferencia de que:

- la cantidad de código es un tercio de la tuya
- Utiliza un diccionario para mapear las palabras con sus respectivos valores numéricos
- NO utiliza bucles for
- NO utiliza arrays anidadas (que son un asco, siempre que hagas algo así preguntate si no hay algo fundamentalmente mal en tu código)
- NO hay lógica "rara" y difícil de seguir como validar la posición de un elemento en un array o cosas por el estilo.
- NO utiliza Números mágicos como en tu código en el switch de la línea 134
- El código es muchísimo más simple, no tiene ifs, no salta de acá para allá entre distintos métodos, y no tiene bucles.

Ahora bien, veamos las ventajas del lenguaje que se usaron acá:

1 - Lo primero que cabe destacar es que en C# para hacer una simple aplicación de consola NO hace falta declarar un namespace, una clase, ni un metodo main. Todo esto se puede eliminar y la aplicación va a funcionar perfectamente.

2 - Utilizamos var para declarar variables, en lugar de repetir el tipo dos veces. Esto se llama type inference, y no cambia el tipo del objeto, sino que lo infiere para simplificar el código.

3 - En la línea 23 se puede observar un Switch Expression, que reemplaza el if/else if de la línea 32 de tu código, y sirve para asignar un valor dependiendo del input.

4 - El valor que devuelve el método Buscar() es de tipo Int nuleable, y lo usamos para indicar (mediante el uso de null) que no se pudo obtener un valor válido.

5 - En la línea 31 usamos 3 ventajas de C#, para mostrar el resultado:

- la expresion valor?.ToString() utiliza Null Propagation para descartar el valor, en caso de que éste sea null

- luego se utiliza Null coalescing (??) para devolver la expresión de la derecha en caso de que la anterior sea nula.

- Finalmente se usa String Interpolation para incluir el valor de input dentro del mensaje, sin usar concatenación.

6 - En las líneas 39 y 41 es donde ocurre la "magia":

- primero se divide el string en partes separadas por espacio (o sea cada palabra).

- Luego se utiliza el método Select() de LINQ para transformar cada palabra de la lista, en el resultado de la Expresión lambda, que a su vez contiene una expresión ternaria que devuelve el valor correspondiente si encuentra la palabra en el diccionario, y sino devuelve null.

Acá cabe destacar que LINQ es una parte integral y fundamental de C# y .NET, y no una "librería" rara hecha por algún hippie random de internet, como suele haber en otros lenguajes.

7 - El resultado de la transformación es una lista de int?, es decir, de valores que pueden ser o bien un int o null, que quiere decir que es una palabra inválida, y por lo tanto no tiene valor numérico. Entonces en la línea 44 usamos el método Any() de LINQ para corroborar si hay algun valor null, es decir inválido, y por lo tanto todo el resultado es inválido.

8 - Finalmente en la línea 47 usamos el método Sum() de LINQ para sumar todos los valores numéricos, y luego devolverlos.


Hasta acá todo bien, mi código hace lo mismo que el tuyo, pero hay un problema: le faltan varias validaciones, tanto tu código como el mío devuelven valores incorrectos para los siguientes casos:

- "cuatro cuarenta"
- "doscientos treinta y doscientos"
- "ciento cuarenta cuarenta cuarenta"

Y muchos similares. La razón es que simplemente estamos buscando palabras y sumando sus valores.

Podemos agregar un par de validaciones para evitar algunos de estos casos:

HiPMXgn

Ahí ya estamos mucho mejor parados. La mayoría de los valores inválidos o casos incoherentes se están atajando.

Y fijate que sigue siendo menos de la mitad de tu código, con mucha más funcionalidad.
Ese es el poder de C#, que lo diferencia de los lenguajes dinosaurio horrendos y obsoletos como java.

Te dejo el código completo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
 
var dict = new Dictionary<string, int>
{
    ["uno"]    =   1, ["dos"]        =   2, ["tres"]        =   3, ["cuatro"]        =   4, ["cinco"]      =   5, ["seis"]        =   6, ["siete"]       =   7, ["ocho"]        =   8, ["nueve"]       =   9,
    ["once"]   =  11, ["doce"]       =  12, ["trece"]       =  13, ["catorce"]       =  14, ["quince"]     =  15, ["dieciseis"]   =  16, ["diecisiete"]  =  17, ["dieciocho"]   =  18, ["diecinueve"]  =  19,
    ["diez"]   =  10, ["veinte"]     =  20, ["treinta"]     =  30, ["cuarenta"]      =  40, ["cincuenta"]  =  50, ["sesenta"]     =  60, ["setenta"]     =  70, ["ochenta"]     =  80, ["noventa"]     =  90,
    ["ciento"] = 100, ["doscientos"] = 200, ["trescientos"] = 300, ["cuatrocientos"] = 400, ["quinientos"] = 500, ["seiscientos"] = 600, ["setecientos"] = 700, ["ochocientos"] = 800, ["novecientos"] = 900,
 
    // casos especiales
    ["cero"] = 0, ["un"] = 1, ["cien"] = 100, ["mil"] = 1000, ["veinti"] = 20, ["un millón"] = 1_000_000, ["y"] = 0
};
 
while (true)
{
    Write("Teclea con letras un número entre cero y un millón: ");
    var input = ReadLine().ToLower();
 
    var valor =
        input switch
        {
            "cero" => 0,
            "un millón" => 1_000_000,
            _ => Buscar(input)
        };
 
 
    WriteLine(valor?.ToString() ?? $"Hay palabras desconocidas o el formato es incorrecto. No se puede analizar el valor introducido: {input}");
    WriteLine("Continuar? (S/N): ");
    if (ReadLine().ToLower() != "s")
        return 0;
}
 
int? Buscar(string input)
{
    var palabras = input.Split(" ", StringSplitOptions.RemoveEmptyEntries);
 
    var valores = palabras.Select(x => dict.TryGetValue(x, out var v) ? v : (int?)null)
                          .ToList();
 
    int OrdenDeMagnitud(int? x) => (int)Math.Floor(Math.Log10((int)x) + 1);
    bool NoEsCeroNiMil(int? x) => x != 1000 && x != 0;
 
    return valores switch
    {
        // verificar que haya algún valor
        _ when !valores.Any() => null,
 
        // verificar que todos los valores sean validos
        _ when valores.Any(x => x == null) => null,
 
        // verificar que no haya valores duplicados en el mismo orden de magnitud antes del multiplicador de miles (por ejemplo "dieci quince" o "doscientos ciento uno")
        _ when valores.TakeWhile(x => x != 1000).GroupBy(OrdenDeMagnitud).Any(x => x.Count() > 1) => null,
 
        // verificar que no haya valores duplicados en el mismo orden de magnitud después del multiplicador de miles (por ejemplo "dieci quince" o "doscientos ciento uno")
        _ when valores.SkipWhile(x => x != 1000).GroupBy(OrdenDeMagnitud).Any(x => x.Count() > 1) => null,
 
        // verificar que los ordenes de magnitud sean decrecientes, exceptuando los miles y el cero
        _ when !valores.TakeWhile(NoEsCeroNiMil).OrderByDescending(x => x).SequenceEqual(valores.TakeWhile(NoEsCeroNiMil)) => null,
 
        // verificar que si existe "y" existan las decenas
        _ when valores.Contains(0) && !valores.Any(x => OrdenDeMagnitud(x) == 2 && x > 19) => null,
 
        // verificar que "y" venga siempre antes de las decenas
        _ when valores.Contains(0) && valores.IndexOf(0) != valores.IndexOf(valores.First(x => OrdenDeMagnitud(x) == 2)) + 1 => null,
 
        // resultado correcto entre 1000 y 1999
        _ when valores.First() == 1000 => valores.Sum(),
 
        // resultado correcto con multiplicador de miles
        _ when valores.Contains(1000) =>
            (valores.TakeWhile(x => x != 1000).Sum() * 1000) +
             valores.SkipWhile(x => x != 1000).Skip(1).Sum(),
 
        _ => valores.Sum()
 
    };
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
Imágen de perfil de Kabuto
Val: 88
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Letras a numeros

Publicado por Kabuto (16 intervenciones) el 30/05/2021 00:27:08
Uooo..
Muchas gracias por aportar tu solución.

Es cierto que no conozco, para nada.., todas las posibilidades de C#. Voy aprendiendo de lo que veo por ahí y de tu mensaje puedo aprender mucho.

Desconocía por completo la existencia de los Dictionary. Sí había pensado hacer algo similar con enum, pero como no sabía que nivel de conocimientos tenía el compañero que propuso el ejercicio, pensé que quizás se sentiría más familiarizado con arrays.
De ahí la importancia de que la gente intente un código y lo comparta, eso nos da una idea de su nivel y podemos adaptar la ayuda a sus capacidades.

Esa sería la única pega que le pondría a tu código. Es impecable, pero supongo que para alguien que está en sus inicios de aprendizaje en programación (al margen del lenguaje que esté empleando), encontrarse con un código como este puede hacer que la cabeza le de vueltas je je.

1
2
3
4
5
pero hay un problema: le faltan varias validaciones, tanto tu código como el mío devuelven valores incorrectos para los siguientes casos:
 
- "cuatro cuarenta"
- "doscientos treinta y doscientos"
- "ciento cuarenta cuarenta cuarenta"

Esto también lo pensé y valoré añadir comprobaciones, como que los valores que van delante han de ser mayores que los que van detrás: primero centenas, luego decenas, luego unidades...

Pero de nuevo no quise "complicar" más el código y en todo caso decidí esperar a que el compañero que pedía ayuda, confirmase que entendía la lógica que se estaba siguiendo y entonces ya sí proponer mejoras.


Gracias de nuevo por tu aportación, buena oportunidad para aprender más.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar