← Euler Lab
#017

Contando Letras en Números

Cargando Python...

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?

Nota: No contar espacios ni guiones. Usar "and" según el inglés británico (ej: 115 = "one hundred and fifteen").
Diccionarios Strings Descomposición sistemática

1 Descomponiendo el Problema

La clave es identificar los bloques básicos y cómo se combinan para formar cualquier número.

1-9 Unidades
1
one
3 letras
2
two
3 letras
3
three
5 letras
4
four
4 letras
5
five
4 letras
6
six
3 letras
7
seven
5 letras
8
eight
5 letras
9
nine
4 letras

Total: 3+3+5+4+4+3+5+5+4 = 36 letras

10-19 Los "teens" (casos especiales)
10
ten
3 letras
11
eleven
6 letras
12
twelve
6 letras
13
thirteen
8 letras
14
fourteen
8 letras
15
fifteen
7 letras
16
sixteen
7 letras
17
seventeen
9 letras
18
eighteen
8 letras
19
nineteen
8 letras

Total: 3+6+6+8+8+7+7+9+8+8 = 70 letras

20-90 Decenas (múltiplos de 10)
20
twenty
6 letras
30
thirty
6 letras
40
forty
5 letras
50
fifty
5 letras
60
sixty
5 letras
70
seventy
7 letras
80
eighty
6 letras
90
ninety
6 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.

Letras del 1 al 1000
21,124
Números escritos
1000

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", ...}

Python — Solución completa
// Output aparecerá aquí

Descomponiendo un número: 342

1.
342 // 100 = 3 → "three" + "hundred"
2.
342 % 100 = 42 → queda 42, añadimos "and"
3.
42 // 10 * 10 = 40 → "forty"
4.
42 % 10 = 2 → "two"
Resultado: "threehundredandfortytwo" = 23 letras ✓
Python — Versión optimizada (precalculando 1-99)
// Output aparecerá aquí

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
Diccionarios como tablas de lookup Descomposición de problemas División entera y módulo

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

0
1
2
3
4
5
6
7
8
...
1.

Cuando guardas "María" → "555-0505", Python calcula un número mágico (hash) de "María"

2.

El hash de "María" podría ser, digamos, 347. Python guarda el valor en el cajón 347.

3.

Cuando preguntas por agenda["María"], Python calcula el hash otra vez (347), va directo al cajón 347, y te da el valor.

¡No busca! Sabe exactamente dónde está. Por eso es O(1) - tiempo constante, sin importar si hay 10 o 10 millones de elementos.

Tres formas de convertir 3 → "three"

Opción 1: Cadena de if-elif O(n) comparaciones

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.

Opción 2: Lista (array) O(1) pero limitado

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.

Opción 3: Diccionario O(1) + flexible

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.

Python — Comparando las 3 opciones
// Output aparecerá aquí

¿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)

Python — Operaciones comunes con diccionarios
// Output aparecerá aquí

Resumen: ¿Por qué diccionarios?

Rápido
O(1) para buscar, añadir, eliminar
🔑
Flexible
Cualquier clave inmutable
📖
Legible
El código se autodocumenta
Hash tables (conceptual) O(1) vs O(n) lookup dict vs list vs if-elif Operaciones de diccionario