3257 - Cifre Romane 1
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()