3669 - Bacon

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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