3669 - Bacon

De la Universitas MediaWiki

Bacon

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

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

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

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

  • 1 ⩽ lungimea mesajului necodificat ⩽ 10000
  • mesajul necodificat va conține numai litere mari ale alfabetului englez

Exemplu 1

baconin.txt
1
PBINFO
baconout.txt
Datele de intrare corespund restrictiilor impuse
ABBBBAAAABABAAAABBABAABABABBBA


Exemplu 2

baconin.txt
2
ABBBBAAAABABAAAABBABAABABABBBA
baconout.txt
Datele de intrare corespund restrictiilor impuse
PBINFO

Exemplu 3

baconin.txt
1
pbinfo
baconout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare

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()