Skip to content

Instantly share code, notes, and snippets.

@yngwie74
Created February 22, 2012 16:43
Show Gist options
  • Save yngwie74/1885963 to your computer and use it in GitHub Desktop.
Save yngwie74/1885963 to your computer and use it in GitHub Desktop.
Mi implementación de la kata "Roman Numerals", en estilo funcional
#!/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)
@alcidesfp
Copy link

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.

@yngwie74
Copy link
Author

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