Created
February 22, 2012 16:43
-
-
Save yngwie74/1885963 to your computer and use it in GitHub Desktop.
Mi implementación de la kata "Roman Numerals", en estilo funcional
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
""" | |
Implementación de la kata "Roman Numerals" en estilo funcional. | |
""" | |
from itertools import izip, count | |
_NUMERALES = ( | |
('', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'), | |
('', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'), | |
('', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'), | |
('', 'M', 'MM', 'MMM'), | |
) | |
def digitsOf(n): | |
"Obtiene las cifras de un número base 10 como una lista" | |
def getDigits(n, l): | |
if n == 0: | |
return l | |
l.append(n % 10) | |
return getDigits(n / 10, l) | |
return getDigits(n, []) or [0] | |
def romanOf(n): | |
"Obtiene la representación de un número arábigo en su equivalente romano" | |
return ''.join([p[d] for (p, d) in izip(_NUMERALES, digitsOf(n))][::-1]) | |
if __name__ == '__main__': | |
print romanOf(2999) |
A decir verdad, no me molesta tanto el uso del [::-1], pero si el hecho de que no es explísito lo que hace. Creo que debí usar Reversed en su lugar o como mínimo, encapsular su uso en una función aparte.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Me llama la atención la influencia de los "one-liners" en la última (y única) línea de la función romanOf, no se si sea mi imaginación pero creo que el final de la línea resulta un tanto críptico, en especial ese [::-1] al final, el cual a mí personalmente me trae muy malos recuerdos... Asimismo creo IMHO que la claridad del código mejoraría mucho utilizando nombres de variables mas significativos (en lugar de l,n,p,d, etc). Saludos.