4017 - Skip

From Bitnami MediaWiki

Cifrul Skip[edit | edit source]

Gigel a găsit pe o foaie criptări ale unor cuvinte în cifrul Skip. Criptarea funcționează astfel:

Fie un cuvânt de lungime n. Cuvântul îl vom impărti în două părti, prima parte de lungime [n/2], iar a doua parte de [(n+1)]/2. Vom scrie prima literă din prima parte, prima literă din a doua parte, a 2-a literă din prima parte, a 2-a literă din a doua parte, a 3-a literă din prima parte, a 3-a literă din a doua parte … :.

  • AMONG -> AOMNG
  • SUSPICIOUS -> SCUISOPUIS
  • SECRET -> SREECT
  • CIPHER' -> CHIEPR

Criptarea unui text constă în criptarea succesivă a fiecărui cuvânt.

Cerinta[edit | edit source]

Se dă un numar c care poate fi doar 1 sau 2 și un text în care cuvintele sunt separate printr-un spațiu. Pentru c=1, textul reprezintă un mesaj necriptat și se cere să-l afișați în urma criptării. Pentru c=2, textul reprezintă un mesaj criptat și se cere să-l afișați în urma decriptării.

Date de intrare[edit | edit source]

Fișierul de intrare skipin.txt citește un număr c și un mesaj.

Date de ieșire[edit | edit source]

Fișierul de ieșire skipout.txt va conține pe prima linie mesajul rezultat în urma operației cerute.

Restricţii şi precizări[edit | edit source]

  • 1 ⩽ lungimea mesajului ⩽ 1000000

Exemplu 1[edit | edit source]

skipin.txt
1
THERE IS ONE IMPOSTOR AMONG US
skipout.txt
Datele de intrare corespund restrictiilor impuse
TEHRE IS ONE ISMTPOOR AOMNG US


Exemplu 2[edit | edit source]

skipin.txt
-1
THERE IS ONE IMPOSTOR AMONG US
skipout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def skip_cipher(c, text):

   words = text.split(' ')
   result = []
   for word in words:
       n = len(word)
       part1 = word[:n // 2]
       part2 = word[n // 2:]
       if c == 1:  # Encryption
           encrypted_word = .join([part1[i] + part2[i] for i in range(len(part1))] + list(part2[len(part1):]))
           result.append(encrypted_word)
       elif c == 2:  # Decryption
           decrypted_word = .join(
               [word[i] for i in range(0, len(word), 2)] + [word[i] for i in range(1, len(word), 2)])
           result.append(decrypted_word)
   return ' '.join(result)


def main():

   # Deschidem fișierul de intrare și citim datele
   with open('skipin.txt', 'r') as f:
       c = int(f.readline().strip())
       text = f.readline().strip()
   # Verificăm dacă lungimea textului respectă restricțiile și dacă c este 1 sau 2
   if 1 <= len(text) <= 1000000 and c in [1, 2]:
       # Dacă da, aplicăm funcția de criptare/decriptare
       result = skip_cipher(c, text)
       status = "Datele de intrare corespund restrictiilor impuse."
   else:
       # Dacă nu, nu aplicăm funcția și afișăm un mesaj de eroare
       result = ""
       status = "Datele de intrare nu corespund restrictiilor impuse."
   # Scriem rezultatul în fișierul de ieșire
   with open('skipout.txt', 'w') as f:
       f.write(status + '\n' + result)


if __name__ == "__main__":

   main()

</syntaxhighlight>


Explicatie[edit | edit source]