4017 - Skip
Cifrul Skip
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
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
Fișierul de intrare skipin.txt citește un număr c și un mesaj.
Date de ieșire
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
- 1 ⩽ lungimea mesajului ⩽ 1000000
Exemplu 1
- 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
- skipin.txt
-1 THERE IS ONE IMPOSTOR AMONG US
- skipout.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare
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()