patternpythonMinor
Converting an integer to Greek and Roman numerals
Viewed 0 times
romangreeknumeralsandconvertinginteger
Problem
Yesterday I posted a question about converting an integer to it's Roman Numeral equivalent. Apparently you guys liked it and gave me some good advice, so I decided to take all your advice, and go a step further, it will now not only convert to Roman but will now also convert to Greek numerals.
I would like some critique on this project that I'm continuing.
```
#
import argparse
opts = argparse.ArgumentParser()
opts.add_argument("-g", "--greek", type=int,
help="Convert to Medieval Numerals")
opts.add_argument("-r", "--roman", type=int,
help="Convert to Roman Numerals")
args = opts.parse_args()
ROMAN_NUMERAL_TABLE = (
("~M", 1000000), ("~D", 500000), ("~C", 100000),
("~L", 50000), ("~X", 10000), ("~V", 5000), # "~" indicates a Macron
("M", 1000), ("CM", 900), ("D", 500),
("CD", 400), ("C", 100), ("XC", 90),
("L", 50), ("XL", 40), ("X", 10),
("IX", 9), ("V", 5), ("IV", 4),
("I", 1)
)
GREEK_NUMERAL_TABLE = (
("α", 1), ("β", 2), ("γ", 3),
("δ", 4), ("ε", 5), ("Ϝ", 6),
("ζ", 7), ("η", 8), ("θ", 9),
("ι", 10), ("κ", 20), ("λ", 30),
("μ", 40), ("ν", 50), ("ξ", 60),
("ο", 70), ("π", 80), ("ϙ", 90),
("ρ", 100), ("σ", 200), ("τ", 300),
("υ", 400), ("φ", 500), ("χ", 600),
("ψ", 700), ("ω", 800), ("ϡ", 900),
("α", 1000), ("β", 2000), ("γ", 3000),
("δ", 4000), ("ε", 5000), ("ϛ", 6000),
("ζ", 7000), ("η", 8000), ("θ", 9000) # The Greeks weren't very creative
)
def convert_init(number, convert_to=None):
""" Convert a number to a numeral, Greek or Roman
>>> print(convert_init(45, convert_to=GREEK_NUMERAL_TABLE))
ϜϜϜϜϜϜϜγ
>>> print(convert_init(45, convert_to=ROMAN_NUMERAL_TABLE))
XLV """
display_numerals = []
for numeral, value in sorted(convert_to)[::-1]: # sort the list from largest to least
count = number // value
number -= count * value
display_numerals.append(numeral * count)
return ''.joi
I would like some critique on this project that I'm continuing.
```
#
import argparse
opts = argparse.ArgumentParser()
opts.add_argument("-g", "--greek", type=int,
help="Convert to Medieval Numerals")
opts.add_argument("-r", "--roman", type=int,
help="Convert to Roman Numerals")
args = opts.parse_args()
ROMAN_NUMERAL_TABLE = (
("~M", 1000000), ("~D", 500000), ("~C", 100000),
("~L", 50000), ("~X", 10000), ("~V", 5000), # "~" indicates a Macron
("M", 1000), ("CM", 900), ("D", 500),
("CD", 400), ("C", 100), ("XC", 90),
("L", 50), ("XL", 40), ("X", 10),
("IX", 9), ("V", 5), ("IV", 4),
("I", 1)
)
GREEK_NUMERAL_TABLE = (
("α", 1), ("β", 2), ("γ", 3),
("δ", 4), ("ε", 5), ("Ϝ", 6),
("ζ", 7), ("η", 8), ("θ", 9),
("ι", 10), ("κ", 20), ("λ", 30),
("μ", 40), ("ν", 50), ("ξ", 60),
("ο", 70), ("π", 80), ("ϙ", 90),
("ρ", 100), ("σ", 200), ("τ", 300),
("υ", 400), ("φ", 500), ("χ", 600),
("ψ", 700), ("ω", 800), ("ϡ", 900),
("α", 1000), ("β", 2000), ("γ", 3000),
("δ", 4000), ("ε", 5000), ("ϛ", 6000),
("ζ", 7000), ("η", 8000), ("θ", 9000) # The Greeks weren't very creative
)
def convert_init(number, convert_to=None):
""" Convert a number to a numeral, Greek or Roman
>>> print(convert_init(45, convert_to=GREEK_NUMERAL_TABLE))
ϜϜϜϜϜϜϜγ
>>> print(convert_init(45, convert_to=ROMAN_NUMERAL_TABLE))
XLV """
display_numerals = []
for numeral, value in sorted(convert_to)[::-1]: # sort the list from largest to least
count = number // value
number -= count * value
display_numerals.append(numeral * count)
return ''.joi
Solution
Your conversion routines make no sense. I don't see why 45 should be
Since you are using Unicode for the Greek numerals, I should be pedantic and point out that the Roman numerals should also use the appropriate Unicode characters.
The docstring would be better written as
… since the
What is
Your
ϜϜϜϜϜϜϜγ, as stated in your doctest. I also get this clearly wrong result:>>> convert_init(1939, ROMAN_NUMERAL_TABLE)
'XLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXVIV'Since you are using Unicode for the Greek numerals, I should be pedantic and point out that the Roman numerals should also use the appropriate Unicode characters.
The docstring would be better written as
def convert_init(number, convert_to=None):
"""
Convert a number to a Greek or Roman numeral
>>> convert_init(45, convert_to=ROMAN_NUMERAL_TABLE)
'XLV'
"""
…… since the
print statement obscures the fact that you are returning a string. (Based on just your docstring, it could also be returning some other kind of object, whose __str__ produces the desired output.)What is
convert_init? Did you mean convert_int?Your
args = opts.parse_args() is not guarded by if __name__ == '__main__' as it should be. You shouldn't need to cast int(args.greek) or int(args.roman), since argparse should take care of the type=int for you.Code Snippets
>>> convert_init(1939, ROMAN_NUMERAL_TABLE)
'XLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXVIV'def convert_init(number, convert_to=None):
"""
Convert a number to a Greek or Roman numeral
>>> convert_init(45, convert_to=ROMAN_NUMERAL_TABLE)
'XLV'
"""
…Context
StackExchange Code Review Q#147791, answer score: 4
Revisions (0)
No revisions yet.