Reputation: 313
I have a program that I created that converts to Roman numerals, it works successfully. Now I'm trying to add in the idea of converting to Greek numerals with argparse
, it will not go passed the first tuple: ("α", 1)
in the list. I'm using the same algorithm that I used to convert to Roman, but for some reason it won't work for my Greek? Why will this not work as I would expect it to?
# <~~ coding=utf-8 ~~>
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):
display_numerals = []
for numeral, value in convert_to:
count = number // value
number -= count * value
display_numerals.append(numeral * count)
return ''.join(display_numerals)
if __name__ == '__main__':
if args.greek:
data = convert_init(int(args.greek), convert_to=GREEK_NUMERAL_TABLE)
with open("greek_numerals.txt", "a+") as file_data:
file_data.write(data)
elif args.roman:
data = convert_init(int(args.roman), convert_to=ROMAN_NUMERAL_TABLE)
with open("roman_numerals.txt", "a+") as file_data:
file_data.write(data)
else:
raise NotImplementedError("{} is not implemented yet".format(args))
Output for Roman numerals:
124542
~C~X~XMMMMDXLII # Works
Output for Greek numerals:
124542
ααααααααααααααααααααααααααααααααααααααααααααααααααααα # Only outputs the 1
...
Upvotes: 3
Views: 255
Reputation: 16204
The Greek list is in ascending order while the Roman is in descending order.
That causes to the first number processed in Greek, to be 1
, so it print n
times the letter α
, instead of decreasing larger numbers first.
So, just sort the list descending when you iterate it:
for numeral, value in convert_to: # Becomes:
for numeral, value in sorted(convert_to)[::-1]:
Upvotes: 3