1059 - Schimb Cifre

From Bitnami MediaWiki
Revision as of 18:54, 28 April 2023 by Tamas Claudia (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

<syntaxhighlight lang="python" line>

  1. 1059

from typing import List, Tuple

  1. 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


  1. 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)))


  1. 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)


</syntaxhighlight>