4017 - Skip
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>