3596 - Cifre Romane 2

De la Universitas MediaWiki

Cerința

Alexandru a învăţat că pe lângă cifrele romane I, V, X, L, C, D, M mai există cifrele (V), (X), (L), (C), (D), (M) care au valorile 5000, 10000, 50000, 100000, 500000 respectiv 1000000. Dându-se un număr c:

  • pentru c=1, se dă numărul a scris cu cifre arabe și trebuie să-l scrieti cu cifre romane.
  • pentru c=2, se dă numărul b scris cu cifre romane și trebuie să-l scrieti cu cifre arabe.

Date de intrare

Fișierul de intrare cifre_romane2.in conține pe prima linie numărul c, iar pe a doua linie, dacă c=1 atunci se citește numarul a . Dacă c=2 atunci se citește numărul b.

Date de ieșire

Fișierul de ieșire cifre_romane2.out va conține pe prima linie :

  • dacă c=1 atunci se va afișa numărul a scris cu cifre romane
  • dacă c=2 atunci afișăm numărul b dacă acesta este valid sau mesajul Numar invalid dacă acesta nu este valid.

Restricții și precizări

  • 1≤a,b≤3999999
  • Cifrele romane sunt:
    • I=1
    • V=5
    • X=10
    • L=50
    • C=100
    • D=500
    • M=1000
    • (V)=5000
    • (X)=10000
    • (L)=50000
    • (C)=100000
    • (D)=500000
    • (M)=1000000

Exemplul 1:

cifre_romane2.in
1
758
cifre_romane2.out
DCCLVIII


Exemplul 2:

cifre_romane2.in
2
MDLI
cifre_romane2.out
1551


Exemplul 3:

cifre_romane2.in
1
MDLI
cifre_romane2.out
invalid

Rezolvare

#3596 Cifre_romane2
def arabic_to_roman(number):
    numere_romane = {
        1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X',
        40: 'XL', 50: 'L', 90: 'XC', 100: 'C', 400: 'CD',
        500: 'D', 900: 'CM', 1000: 'M', 5000: '(V)', 10000: '(X)',
        50000: '(L)', 100000: '(C)', 500000: '(D)', 1000000: '(M)'
    }

    result = ""
    for value, numeral in sorted(numere_romane.items(), key=lambda x: x[0], reverse=True):
        while number >= value:
            result += numeral
            number -= value

    return result


def roman_to_arabic(roman):
    numere_romane = {
        'I': 1, 'IV': 4, 'V': 5, 'IX': 9, 'X': 10, 'XL': 40, 'L': 50, 'XC': 90, 'C': 100, 'CD': 400, 'D': 500, 'CM': 900, 'M': 1000, '(V)': 5000, '(X)': 10000,
        '(L)': 50000, '(C)': 100000, '(D)': 500000, '(M)': 1000000
    }

    result = 0
    prev_value = 0

    for numeral in reversed(roman):
        value = numere_romane[numeral]
        if value < prev_value:
            result -= value
        else:
            result += value
        prev_value = value

    return result


def main():
    with open("cifre_romane2.in", "r") as input_file, open("cifre_romane2.out", "w") as output_file:
        try:
            c = int(input_file.readline().strip())
        except ValueError:
            output_file.write("Numar invalid\n")
            return

        if c == 1:
            try:
                a = int(input_file.readline().strip())
                roman_a = arabic_to_roman(a)
                output_file.write(roman_a + "\n")
            except ValueError:
                output_file.write("Numar invalid\n")
        elif c == 2:
            b = input_file.readline().strip()
            try:
                arabic_b = roman_to_arabic(b)
                if 1 <= arabic_b <= 3999999:
                    output_file.write(str(arabic_b) + "\n")
                else:
                    output_file.write("Numar invalid\n")
            except KeyError:
                output_file.write("Numar invalid\n")
            except ValueError:
                output_file.write("Numar invalid\n")
        else:
            output_file.write("Numar invalid\n")


if __name__ == "__main__":
    main()