4017 - Skip

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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