3257 - Cifre Romane 1: Difference between revisions
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: | ||
== 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. | ||
== 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 | |||
== 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 | ||
== Exemplu: == | |||
'''cifre_romane1in.txt''' | |||
IV | IV | ||
'''cifre_romane1out.txt''' | |||
4 | 4 | ||
'''cifre_romane1in.txt''' | |||
IIII | IIII | ||
'''cifre_romane1out.txt''' | |||
Numar invalid | Numar invalid | ||
== Rezolvare == | |||
<syntaxhighlight lang="python"> | |||
def roman_to_arabic(roman): | 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): | 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(): | 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__": | if __name__ == "__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>