4017 - Skip

De la Universitas MediaWiki

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


Explicatie