o "* _P@sddlmZ dZdZdZdZddlZddlZddlZddl Z Gddde Z Gd d d e Z Gd d d e Z Gd dde ZdZddZedejZddZddZddZedkrde edSdS))print_functionz&Mark Pilgrim (f8dy@diveintopython.org)z1.4z 8 August 2001agCopyright (c) 2001 Mark Pilgrim This program is part of "Dive Into Python", a free Python tutorial for experienced programmers. Visit http://diveintopython.org/ for the latest version. This program is free software; you can redistribute it and/or modify it under the terms of the Python 2.1.1 license, available at http://www.python.org/2.1.1/license.html Nc@ eZdZdS) RomanErrorN__name__ __module__ __qualname__r r '/usr/lib/python3/dist-packages/roman.pyrrc@r)OutOfRangeErrorNrr r r r r r r c@r)NotIntegerErrorNrr r r r r #r r c@r)InvalidRomanNumeralErrorNrr r r r r'r r) )Mi)CMi)Di)CDi)Cd)XCZ)L2)XL()X )IX )V)IV)IcCsxt|ts tdd|krdkstdtd|dkr!dSd}tD]\}}||kr9||7}||8}||ks-q%|S)z convert integer to Roman numeralzdecimals can not be convertediz%number out of range (must be 0..4999)rN) isinstanceintr r romanNumeralMap)nresultnumeralintegerr r r toRoman;s  r/a8 ^ # beginning of string M{0,4} # thousands - 0 to 4 M's (CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's), # or 500-800 (D, followed by 0 to 3 C's) (XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's), # or 50-80 (L, followed by 0 to 3 X's) (IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's), # or 5-8 (V, followed by 0 to 3 I's) $ # end of string cCs|std|dkr dSt|std|d}d}tD]&\}}|||t||krC||7}|t|7}|||t||ks-q|S)z convert Roman numeral to integerzInput can not be blankr&rzInvalid Roman numeral: %s)rromanNumeralPatternsearchr*len)sr,indexr-r.r r r fromRoman\s    r5cCsDtjddd}|jddd|jddd d d d |}|j|_|S) Nromanz)convert between roman and arabic numerals)prog descriptionnumberzthe value to convert)helpz-rz --reverse store_trueFzrGresys Exceptionrr r rr*r/compileVERBOSEr0r5rArLrexitr r r r s2