papasmurf papasmurf - 10 months ago 44
Python Question

Converting to Greek numerals will not work as expected

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
...

Answer Source

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]: