Number Letter Counts
Si escribimos los números del 1 al 5 en palabras: one, two, three, four, five,
usamos 3 + 3 + 5 + 4 + 4 = 19 letras en total.
Si escribimos todos los números del 1 al 1000 en palabras (inglés británico),
¿cuántas letras usamos?
1 Descomponiendo el Problema
La clave es identificar los bloques básicos y cómo se combinan para formar cualquier número.
Total: 3+3+5+4+4+3+5+5+4 = 36 letras
Total: 3+6+6+8+8+7+7+9+8+8 = 70 letras
Ojo: Es "forty" (no "fourty"). Un error común.
Patrón para Centenas (100-999)
100 = one hundred
200 = two hundred
...
101 = one hundred and one
115 = one hundred and fifteen
342 = three hundred and forty-two
Regla británica: Se usa "and" cuando hay unidades o decenas después de "hundred".
100 = "one hundred" (sin and)
101-199 = "one hundred and ..." (con and)
Caso especial: 1000
1000 = "one thousand" = 11 letras
Solo hay un número con "thousand" en nuestro rango, así que es fácil manejarlo por separado.
Ejemplos del enunciado
| Número | Palabra | Letras |
|---|---|---|
| 342 | threehundredandfortytwo | 23 |
| 115 | onehundredandfifteen | 20 |
Recuerda: espacios y guiones NO se cuentan.
2 Implementación con Diccionarios
Usaremos diccionarios para mapear números a sus palabras, construyendo desde las piezas básicas.
¿Por qué Diccionarios?
Los diccionarios son perfectos para este problema porque:
- Mapeo directo: número → palabra
- Lookup O(1): acceso instantáneo
- Legibilidad: el código se lee como una tabla
# Ejemplo de estructura
units = {1: "one", 2: "two", 3: "three", ...}
tens = {20: "twenty", 30: "thirty", ...}
Descomponiendo un número: 342
342 // 100 = 3 → "three" + "hundred"
342 % 100 = 42 → queda 42, añadimos "and"
42 // 10 * 10 = 40 → "forty"
42 % 10 = 2 → "two"
Errores Comunes
- "fourty" en vez de "forty" (sin u)
- Olvidar el "and" después de hundred
- Poner "and" en números redondos como 100, 200 (no llevan)
- Contar espacios o guiones (no deben contarse)
- Olvidar el 1000 al final
3 Diccionarios: La Estructura de Datos Más Útil
Los diccionarios son probablemente la estructura de datos más usada en Python. Entenderlos bien te ahorrará horas de código y dolores de cabeza.
Piensa en una Agenda de Teléfonos
Agenda física (lista ordenada)
Ana ......... 555-0101
Carlos ...... 555-0202
Diana ....... 555-0303
Eduardo ..... 555-0404
... 500 nombres más ...
Zoe ......... 555-9999
Para encontrar a "María", revisas uno por uno hasta la M
Diccionario Python
# Acceso INSTANTÁNEO
agenda = {
"Ana": "555-0101",
"Carlos": "555-0202",
"María": "555-0505",
...
}
agenda["María"] # → "555-0505"
Encuentra a "María" instantáneamente, sin importar cuántos nombres haya
¿Cómo es posible que sea instantáneo?
Los diccionarios usan algo llamado "tabla hash". Suena complicado, pero la idea es simple:
Imagina un armario con 1000 cajones numerados
Cuando guardas "María" → "555-0505", Python calcula un número mágico (hash) de "María"
El hash de "María" podría ser, digamos, 347. Python guarda el valor en el cajón 347.
Cuando preguntas por agenda["María"], Python calcula el hash otra vez (347), va directo al cajón 347, y te da el valor.
Tres formas de convertir 3 → "three"
def numero_a_palabra(n):
if n == 1: return "one"
elif n == 2: return "two"
elif n == 3: return "three" # ← llega aquí después de 3 comparaciones
elif n == 4: return "four"
... # 9 ifs para 9 números
Problema: Para encontrar "nine" hace 9 comparaciones. Imagina con 1000 números.
palabras = ["", "one", "two", "three", "four", ...]
palabras[3] # → "three" (instantáneo)
Problema: Solo funciona si las claves son números consecutivos (0, 1, 2, 3...). ¿Y si quiero mapear 20 → "twenty"? Desperdiciaría 19 posiciones vacías.
palabras = {1: "one", 2: "two", 3: "three", 20: "twenty", 90: "ninety"}
palabras[3] # → "three" (instantáneo)
palabras[90] # → "ninety" (también instantáneo)
Mejor de ambos mundos: Rápido como lista, flexible como if-elif.
¿Cuándo usar cada estructura?
| Estructura | Usa cuando... | Ejemplo |
|---|---|---|
| if-elif | Pocas opciones (2-4) con lógica diferente en cada rama | if edad < 18: ... elif edad < 65: ... |
| Lista | Claves son índices consecutivos (0, 1, 2...) | dias = ["Lun", "Mar", "Mie"...] |
| Diccionario | Claves son arbitrarias (números salteados, strings, etc.) | capitales = {"España": "Madrid", ...} |
¿Qué puede ser una clave de diccionario?
✓ Puede ser clave:
- Números:
1,3.14 - Strings:
"hola" - Tuplas:
(1, 2) - Booleanos:
True,False
✗ NO puede ser clave:
- Listas:
[1, 2] - Diccionarios:
{"a": 1} - Sets:
{1, 2}
(Solo tipos "inmutables" pueden ser claves)