3669 - Bacon

From Bitnami MediaWiki

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>