o
    "*_P  ã                   @   sÌ   d dl mZ 	 dZdZdZdZd dlZd dlZd dlZd dl	Z	G dd„ de
ƒZG d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZdZdd„ Ze dej¡Zdd„ Zdd„ Zdd„ Zedkrde	 eƒ ¡ dS dS )é    )Úprint_functionz&Mark Pilgrim (f8dy@diveintopython.org)z1.4z8 August 2001ag  Copyright (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                   @   ó   e Zd ZdS )Ú
RomanErrorN©Ú__name__Ú
__module__Ú__qualname__© r	   r	   ú'/usr/lib/python3/dist-packages/roman.pyr      ó    r   c                   @   r   )ÚOutOfRangeErrorNr   r	   r	   r	   r
   r      r   r   c                   @   r   )ÚNotIntegerErrorNr   r	   r	   r	   r
   r   #   r   r   c                   @   r   )ÚInvalidRomanNumeralErrorNr   r	   r	   r	   r
   r   '   r   r   ))ÚMiè  )ÚCMi„  )ÚDiô  )ÚCDi�  )ÚCéd   )ÚXCéZ   )ÚLé2   )ÚXLé(   )ÚXé
   )ÚIXé	   )ÚVé   )ÚIVé   )ÚIé   c                 C   sx   t | tƒs	tdƒ‚d|   k rdk stdƒ‚ tdƒ‚| dkr!dS d}tD ]\}}| |kr9||7 }| |8 } | |ks-q%|S )z convert integer to Roman numeralzdecimals can not be convertedéÿÿÿÿiˆ  z%number out of range (must be 0..4999)r   ÚNÚ )Ú
isinstanceÚintr   r   ÚromanNumeralMap)ÚnÚresultÚnumeralÚintegerr	   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
    c                 C   sŒ   | st dƒ‚| dkrdS t | ¡st d|  ƒ‚d}d}tD ]&\}}| ||t|ƒ … |krC||7 }|t|ƒ7 }| ||t|ƒ … |ks-q|S )z convert Roman numeral to integerzInput can not be blankr&   r   zInvalid Roman numeral: %s)r   ÚromanNumeralPatternÚsearchr*   Úlen)Úsr,   Úindexr-   r.   r	   r	   r
   Ú	fromRoman\   s   
þ€r5   c                  C   sD   t jddd�} | jddd� | jddd	d
dd� |  ¡ }|j|_|S )NÚromanz)convert between roman and arabic numerals)ÚprogÚdescriptionÚnumberzthe value to convert)Úhelpz-rz	--reverseÚ
store_trueFz<convert roman to numeral (case insensitive) [default: False])ÚactionÚdefaultr:   )ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsr9   )ÚparserÚargsr	   r	   r
   rA   q   s   þürA   c                  C   sL   t ƒ } | jr| j ¡ }t|ƒ}t|ƒ tj	S t| jƒ}t|ƒ}t|ƒ tj	S )N)
rA   Úreverser9   Úupperr5   Úprintr)   r/   ÚosÚEX_OK)rC   ÚuÚrÚir+   r	   r	   r
   Úmain‚   s   

ürL   Ú__main__)Ú
__future__r   Ú
__author__Ú__version__Ú__date__Ú__copyright__r>   rG   ÚreÚsysÚ	Exceptionr   r   r   r   r*   r/   ÚcompileÚVERBOSEr0   r5   rA   rL   r   Úexitr	   r	   r	   r
   Ú<module>   s2    
öÿ