3669 - Bacon
Bacon[edit | edit source]
Cifrul Bacon funcţionează așa:
- se citește un mesaj
- fiecare litera este înlocuită cu un cod: A-0, B-1, C-2, ... Z-25.
- codul fiecarei litere este scris în baza 2 cu exact 5 cifre: A-00000, B-00001, C-00010, … Z-11001
- fiecare cifră de 0 este înlocuită cu litera A
- fiecare cifră de 1 este înlocuită cu litera B
Cerinţa[edit | edit source]
Pentru un număr c:
- dacă c=1, se dă un mesaj ce trebuie codificat
- dacă c=2, se dă un mesaj ce trebuie decodificat
Date de intrare[edit | edit source]
Fișierul de intrare baconin.txt conține pe prima linie numărul c, iar pe a doua linie un mesaj
Date de ieșire[edit | edit source]
Fișierul de ieșire baconout.txt va conține pe prima linie mesajul codificat, dacă c=1 sau mesajul decodificat in caz contrar
Restricţii şi precizări[edit | edit source]
- 1 ⩽ lungimea mesajului necodificat ⩽ 10000
- mesajul necodificat va conține numai litere mari ale alfabetului englez
Exemplu 1[edit | edit source]
- baconin.txt
1 PBINFO
- baconout.txt
Datele de intrare corespund restrictiilor impuse ABBBBAAAABABAAAABBABAABABABBBA
Exemplu 2[edit | edit source]
- baconin.txt
2 ABBBBAAAABABAAAABBABAABABABBBA
- baconout.txt
Datele de intrare corespund restrictiilor impuse PBINFO
Exemplu 3[edit | edit source]
- baconin.txt
1 pbinfo
- baconout.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def codificare(mesaj):
# Transformă fiecare literă în codul său corespunzător return .join(['A' if cifra == '0' else 'B' for litera in mesaj for cifra in format(ord(litera) - ord('A'), '05b')])
def decodificare(mesaj):
# Transformă fiecare cod în litera sa corespunzătoare return .join([chr(int(mesaj[i:i+5].replace('A', '0').replace('B', '1'), 2) + ord('A')) for i in range(0, len(mesaj), 5)])
def main():
with open('baconin.txt', 'r') as fin, open('baconout.txt', 'w') as fout: c = int(fin.readline().strip()) mesaj = fin.readline().strip()
# Verifică dacă mesajul respectă restricțiile if len(mesaj) > 10000 or not mesaj.isupper(): fout.write("Datele de intrare nu corespund restrictiilor impuse\n") return
fout.write("Datele de intrare corespund restrictiilor impuse\n")
# Codifică sau decodifică mesajul în funcție de valoarea lui c if c == 1: fout.write(codificare(mesaj) + '\n') elif c == 2: fout.write(decodificare(mesaj) + '\n')
if __name__ == "__main__":
main()
</syntaxhighlight>