3257 - Cifre Romane 1: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
Pagină nouă: ''<u>'''Cerința'''</u>'' Dan a plecat în vacanța de vară la Roma. Pe fațada clădirilor apărea anul lor de construcție scris cu cifre romane. Ajutați-l să înțeleagă numărul scris în cifre romane transformându-l în număr scris cu cifre arabe. Dacă numărul nu respectă regulile de scriere a numerelor romane, se afișează mesajul Numar invalid. '''''<u>Date de intrare</u>''''' Fișierul de intrare cifre_romane1.in conține pe prima linie numărul n scris c...
 
Andrada378 (talk | contribs)
No edit summary
 
Line 1: Line 1:
''<u>'''Cerința'''</u>''
== Cerința ==
 
Dan a plecat în vacanța de vară la Roma. Pe fațada clădirilor apărea anul lor de construcție scris cu cifre romane. Ajutați-l să înțeleagă numărul scris în cifre romane transformându-l în număr scris cu cifre arabe. Dacă numărul nu respectă regulile de scriere a numerelor romane, se afișează mesajul Numar invalid.
Dan a plecat în vacanța de vară la Roma. Pe fațada clădirilor apărea anul lor de construcție scris cu cifre romane. Ajutați-l să înțeleagă numărul scris în cifre romane transformându-l în număr scris cu cifre arabe. Dacă numărul nu respectă regulile de scriere a numerelor romane, se afișează mesajul Numar invalid.


'''''<u>Date de intrare</u>'''''
== Date de intrare ==
 
Fișierul de intrare cifre_romane1in.txt conține pe prima linie numărul n scris cu cifre romane.
Fișierul de intrare cifre_romane1.in conține pe prima linie numărul n scris cu cifre romane.
 
'''''<u>Date de ieșire</u>'''''
 
Fișierul de ieșire cifre_romane1.out va conține pe prima linie numărul n scris în cifre arabe dacă numărul este valid și în caz contrar se afișează mesajul Numar invalid.


'''''<u>Restricții și precizări</u>'''''
== Date de ieșire ==
Fișierul de ieșire cifre_romane1out.txt va conține pe prima linie numărul n scris în cifre arabe dacă numărul este valid și în caz contrar se afișează mesajul Numar invalid.


== Restricții și precizări ==
1 ≤ n ≤ 3999
1 ≤ n ≤ 3999


'''''<u>Exemplu:</u>'''''
== Exemplu: ==
 
'''cifre_romane1in.txt'''
cifre_romane1.in


IV
IV


cifre_romane1.out
'''cifre_romane1out.txt'''


4
4


cifre_romane1.in
'''cifre_romane1in.txt'''


IIII
IIII


cifre_romane1.out
'''cifre_romane1out.txt'''


Numar invalid
Numar invalid


'''''<u>Rezolvare</u>'''''
== Rezolvare ==
 
<syntaxhighlight lang="python">
def roman_to_arabic(roman):
def roman_to_arabic(roman):
 
    # Dicționar care mapează cifrele romane la echivalentele lor arabe
    # Dicționar care mapează cifrele romane la echivalentele lor arabe
    roman_numerals = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
 
    arabic = 0
    roman_numerals = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
    prev_value = 0
 
   
    arabic = 0
    # Parcurgem cifrele romane de la dreapta la stânga
 
    for numeral in reversed(roman):
    prev_value = 0
        value = roman_numerals[numeral]
 
       
    # Parcurgem cifrele romane de la dreapta la stânga
        # Dacă cifra curentă este mai mică decât cifra precedentă, scădem valoarea curentă
 
        if value < prev_value:
    for numeral in reversed(roman):
            arabic -= value
 
        else:
        value = roman_numerals[numeral]
            # Altfel, adunăm valoarea curentă
 
            arabic += value
        # Dacă cifra curentă este mai mică decât cifra precedentă, scădem valoarea curentă
       
 
        prev_value = value
        if value < prev_value:
   
 
    return arabic
            arabic -= value
 
        else:
 
            # Altfel, adunăm valoarea curentă
 
            arabic += value
 
        prev_value = value
 
    return arabic


def is_valid_roman_numeral(roman):
def is_valid_roman_numeral(roman):
 
    # Verificăm dacă cifrele romane respectă regulile de scriere
    # Verificăm dacă cifrele romane respectă regulile de scriere  
    combinatii_invalide = ['IIII', 'VIV', 'XXXX', 'LXL', 'CCCC', 'DID', 'CMCM', 'CDCD', 'XCXC', 'XLXL', 'IXIX', 'IVIV']
 
   
    invalid_combinations = ['IIII', 'VIV', 'XXXX', 'LXL', 'CCCC', 'DID', 'CMCM', 'CDCD', 'XCXC', 'XLXL', 'IXIX', 'IVIV']
    for combinatie in combinatii_invalide:
 
        if combinatie in roman:
    for combination in invalid_combinations:
            return False
 
   
        if combination in roman:
    valoare_araba = roman_to_arabic(roman)
 
    if 1 <= valoare_araba <= 3999:
            return False
        return True
 
   
    return True
    return False


def main():
def main():
 
    try:
    try:
        # Deschidem fișierul de intrare în modul citire și pe cel de ieșire în modul scriere
 
        with open('cifre_romane1in.txt', 'r') as file_in, open('cifre_romane1out.txt', 'w') as file_out:
        # Deschidem fișierul de intrare în modul citire și pe cel de ieșire în modul scriere
            # Citim cifrele romane din fișier
 
            cifre_romane = file_in.readline().strip()
        with open('cifre_romane1in.txt', 'r') as file_in, open('cifre_romane1out.txt', 'w') as file_out:
           
 
            # Verificăm dacă cifrele romane sunt valide
            # Citim cifrele romane din fișier
            if is_valid_roman_numeral(cifre_romane):
 
                # Convertem cifrele romane în cifre arabe și scriem rezultatul în fișierul de ieșire
            roman_numeral = file_in.readline().strip()
                cifre_arabe = roman_to_arabic(cifre_romane)
 
                file_out.write(str(cifre_arabe) + '\n')
            # Verificăm dacă cifrele romane sunt valide
            else:
 
                # Dacă cifrele romane nu sunt valide, scriem un mesaj corespunzător în fișierul de ieșire
            if is_valid_roman_numeral(roman_numeral):
                file_out.write('Numar invalid\n')
 
    except FileNotFoundError:
                # Convertem cifrele romane în cifre arabe și scriem rezultatul în fișierul de ieșire
        print("Fisierul de intrare nu exista!")
 
                arabic_numeral = roman_to_arabic(roman_numeral)
 
                file_out.write(str(arabic_numeral) + '\n')
 
            else:
 
                # Dacă cifrele romane nu sunt valide, scriem un mesaj corespunzător în fișierul de ieșire
 
                file_out.write('Numar invalid\n')
 
    except FileNotFoundError:
 
        print("Fisierul de intrare nu exista!")


if __name__ == "__main__":
if __name__ == "__main__":
    main()


    main()
</syntaxhighlight>

Latest revision as of 23:07, 3 January 2024

Cerința[edit | edit source]

Dan a plecat în vacanța de vară la Roma. Pe fațada clădirilor apărea anul lor de construcție scris cu cifre romane. Ajutați-l să înțeleagă numărul scris în cifre romane transformându-l în număr scris cu cifre arabe. Dacă numărul nu respectă regulile de scriere a numerelor romane, se afișează mesajul Numar invalid.

Date de intrare[edit | edit source]

Fișierul de intrare cifre_romane1in.txt conține pe prima linie numărul n scris cu cifre romane.

Date de ieșire[edit | edit source]

Fișierul de ieșire cifre_romane1out.txt va conține pe prima linie numărul n scris în cifre arabe dacă numărul este valid și în caz contrar se afișează mesajul Numar invalid.

Restricții și precizări[edit | edit source]

1 ≤ n ≤ 3999

Exemplu:[edit | edit source]

cifre_romane1in.txt

IV

cifre_romane1out.txt

4

cifre_romane1in.txt

IIII

cifre_romane1out.txt

Numar invalid

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> def roman_to_arabic(roman):

   # Dicționar care mapează cifrele romane la echivalentele lor arabe
   roman_numerals = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
   arabic = 0
   prev_value = 0
   
   # Parcurgem cifrele romane de la dreapta la stânga
   for numeral in reversed(roman):
       value = roman_numerals[numeral]
       
       # Dacă cifra curentă este mai mică decât cifra precedentă, scădem valoarea curentă
       if value < prev_value:
           arabic -= value
       else:
           # Altfel, adunăm valoarea curentă
           arabic += value
       
       prev_value = value
   
   return arabic

def is_valid_roman_numeral(roman):

   # Verificăm dacă cifrele romane respectă regulile de scriere
   combinatii_invalide = ['IIII', 'VIV', 'XXXX', 'LXL', 'CCCC', 'DID', 'CMCM', 'CDCD', 'XCXC', 'XLXL', 'IXIX', 'IVIV']
   
   for combinatie in combinatii_invalide:
       if combinatie in roman:
           return False
   
   valoare_araba = roman_to_arabic(roman)
   if 1 <= valoare_araba <= 3999:
       return True
   
   return False

def main():

   try:
       # Deschidem fișierul de intrare în modul citire și pe cel de ieșire în modul scriere
       with open('cifre_romane1in.txt', 'r') as file_in, open('cifre_romane1out.txt', 'w') as file_out:
           # Citim cifrele romane din fișier
           cifre_romane = file_in.readline().strip()
           
           # Verificăm dacă cifrele romane sunt valide
           if is_valid_roman_numeral(cifre_romane):
               # Convertem cifrele romane în cifre arabe și scriem rezultatul în fișierul de ieșire
               cifre_arabe = roman_to_arabic(cifre_romane)
               file_out.write(str(cifre_arabe) + '\n')
           else:
               # Dacă cifrele romane nu sunt valide, scriem un mesaj corespunzător în fișierul de ieșire
               file_out.write('Numar invalid\n')
   except FileNotFoundError:
       print("Fisierul de intrare nu exista!")

if __name__ == "__main__":

   main()

</syntaxhighlight>