1059 - Schimb Cifre

De la Universitas MediaWiki

Sursă: [1]

Cerinţa

Se dă un număr natural n. Asupra lui se efectuează s serii de transformări, o serie constând în t transformări de genul: cifra de pe poziția i se interschimbă cu cifra de pe poziția j. Să se afişeze numărul obţinut după efectuarea celor s serii de transformări.

Date de intrare

Programul citește de la tastatură numerele n, s și t, iar apoi t perechi de numere naturale, separate prin spații, fiecare pereche reprezentând pozițiile cifrelor care se interschimbă.

Date de ieşire

Dacă datele introduse sunt corecte, pe ecran se va afișa "Datele introduse sunt corecte.", apoi programul va afișa pe ecran numărul obținut în urma efectuării celor s serii de transformări. În caz contrar, se va afișa pe ecran mesajul "Datele introduse nu sunt corecte.".

Restricții și precizări

  • 1 ⩽ n ⩽ 1.000.000.000
  • 1 ⩽ s ⩽ 2.000.000.000
  • 1 ⩽ t ⩽ 10
  • prima cifră din scrierea lui n se află pe poziția 1
  • numerele din cele t perechi reprezentând pozițiile cifrelor care se interschimbă sunt mai mici sau egale cu numărul cifrelor lui n
  • cifra 0 nu va ajunge pe prima poziţie în urma unei interschimbări

Exemplu

Intrare
1234 2 2
2 4
1 4
Ieșire
Datele introduse sunt corecte.
4132

Explicație

Se efectuează prima serie de transformări: 1234 → 1432 → 2431 A doua serie de transformări: 2431 → 2134 → 4132

Rezolvare

#1059

from typing import List, Tuple

# Funcție de verificare a datelor conform restricțiilor
def verificare_date(n: int, s: int, t: int, interschimbari: List[Tuple[int, int]]) -> bool:
    # Verificare restricție n
    if n < 1 or n > 1000000000:
        return False

    # Verificare restricție s
    if s < 1 or s > 2000000000:
        return False

    # Verificare restricție t
    if t < 1 or t > 10:
        return False

    # Verificare restricție interschimbari
    for i, j in interschimbari:
        if i < 1 or i > len(str(n)) or j < 1 or j > len(str(n)):
            return False

    return True


# Funcție pentru interschimbarea cifrelor la pozițiile i și j într-un număr
def interschimbare_cifre(numar: int, i: int, j: int) -> int:
    cifre = [int(cifra) for cifra in str(numar)]
    cifre[i-1], cifre[j-1] = cifre[j-1], cifre[i-1]
    return int("".join(map(str, cifre)))


# Funcția main
if __name__ == "__main__":
    # Citire date de intrare
    n, s, t = map(int, input("Introduceti datele separate prin spatii: ").split())

    interschimbari = []
    for i in range(t):
        i, j = map(int, input("Introduceti datele separate prin spatii: ").split())
        interschimbari.append((i, j))

    # Verificare date de intrare
    if not verificare_date(n, s, t, interschimbari):
        print("Datele introduse nu sunt corecte.")
        exit()

    # Efectuare serii de transformări
    for k in range(s):
        for i, j in interschimbari:
            if i > j:
                i, j = j, i
            n = interschimbare_cifre(n, i, j)

    # Afișare rezultat
    print("Datele introduse sunt corecte.")
    print(n)