3596 - Cifre Romane 2

From Bitnami MediaWiki

Cerința[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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:[edit | edit source]

cifre_romane2.in
1
758
cifre_romane2.out
DCCLVIII


Exemplul 2:[edit | edit source]

cifre_romane2.in
2
MDLI
cifre_romane2.out
1551


Exemplul 3:[edit | edit source]

cifre_romane2.in
1
MDLI
cifre_romane2.out
invalid

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 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()

</syntaxhighlight>