3257 - Cifre Romane 1

From Bitnami MediaWiki
Revision as of 12:34, 28 December 2023 by 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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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.

Date de intrare

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

Date de ieșire

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.

Restricții și precizări

1 ≤ n ≤ 3999

Exemplu:

cifre_romane1.in

IV

cifre_romane1.out

4

cifre_romane1.in

IIII

cifre_romane1.out

Numar invalid

Rezolvare

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

    invalid_combinations = ['IIII', 'VIV', 'XXXX', 'LXL', 'CCCC', 'DID', 'CMCM', 'CDCD', 'XCXC', 'XLXL', 'IXIX', 'IVIV']

    for combination in invalid_combinations:

        if combination in roman:

            return False

    return True

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

            roman_numeral = file_in.readline().strip()

            # Verificăm dacă cifrele romane sunt valide

            if is_valid_roman_numeral(roman_numeral):

                # Convertem cifrele romane în cifre arabe și scriem rezultatul în fișierul de ieșire

                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__":

    main()