25/02/2009
Project Euler : solution au problème 17, en Python
Le problème 17 est de la catégorie "bête et méchant à priori, mais qui se fait se gratter la tête avec vigueur pour obtenir une solution un peu élégante". Il s'agit de calculer le nombre de caractères que représente l'énumération de tous les nombres de 1 à 1000 en toutes lettres, en anglais, en ignorant les espaces et les traits d'union.
Distrayant :-)
#! /usr/bin/env python
# 2009/02/25 - euler017.py
# Solution au Probleme 17 de Project Euler
# http://projecteuler.net/index.php?section=problems&id=17
# Jean Karim Bockstael - jkb@jkbockstael.be
numbers = {
0: "",
1: "one",
2: "two",
3: "three",
4: "four",
5: "five",
6: "six",
7: "seven",
8: "eight",
9: "nine",
10: "ten",
11: "eleven",
12: "twelve",
13: "thirteen",
14: "fourteen",
15: "fifteen",
16: "sixteen",
17: "seventeen",
18: "eighteen",
19: "nineteen",
20: "twenty",
30: "thirty",
40: "forty",
50: "fifty",
60: "sixty",
70: "seventy",
80: "eighty",
90: "ninety",
100: "hundred",
1000: "thousand"
}
def spellout(num):
if num < 21:
return numbers[num]
if num < 100:
return numbers[num - (num % 10)] + numbers[num % 10]
if num < 1000:
if num % 100 == 0:
return numbers[(num - (num % 100)) / 100] + numbers[100]
else:
return spellout(num - (num % 100)) + "and" + spellout(num % 100)
if num == 1000:
return numbers[1] + numbers[1000]
def euler17(num):
sum = 0
for i in range(1, num+1):
sum = sum + len(spellout(i))
return sum
print euler17(1000)