3356 - Alfa: Diferență între versiuni

De la Universitas MediaWiki
Fără descriere a modificării
Fără descriere a modificării
Linia 4: Linia 4:
* Secvențele de elemente diferile de '''x''' aflate între două poziții cu valoarea '''x''' se ordonează crescător (între aceleași două elemente cu valoarea '''x''' se vor afla aceleași elemente ca la început dar în ordine crescătoare).
* Secvențele de elemente diferile de '''x''' aflate între două poziții cu valoarea '''x''' se ordonează crescător (între aceleași două elemente cu valoarea '''x''' se vor afla aceleași elemente ca la început dar în ordine crescătoare).
== Date de intrare ==
== Date de intrare ==
Fișierul '''alfa.in''' conține pe prima linie un număr natural '''n''' reprezentând dimensiunea șirului și un număr '''x''' cu semnificația de mai sus. Pe linia a doua '''n''' numere naturale, separate prin câte un spațiu, reprezentând elementele șirului.
Fișierul '''alfain.txt''' conține pe prima linie un număr natural '''n''' reprezentând dimensiunea șirului și un număr '''x''' cu semnificația de mai sus. Pe linia a doua '''n''' numere naturale, separate prin câte un spațiu, reprezentând elementele șirului.
== Date de ieşire ==
== Date de ieşire ==
Fișierul '''alfa.out''' conține cele '''n''' elemente ale șirului în ordinea cerută.
Fișierul '''alfaout.txt''' conține cele '''n''' elemente ale șirului în ordinea cerută.
== Restricții și precizări ==
== Restricții și precizări ==
* '''2 <= n <= 1000'''
* '''2 <= n <= 1000'''
* Elementele șirului dat sunt naturale nenule formate din maximum '''4''' cifre
* Elementele șirului dat sunt naturale nenule formate din maximum '''4''' cifre
* Pentru '''40''' de puncte șirul conține doar două elemente cu valoarea '''x''' (primul și ultimul).
* Pentru '''40''' de puncte șirul conține doar două elemente cu valoarea '''x''' (primul și ultimul).
== Exemplu ==
== Exemplul 1 ==
; alfa.in
; alfain.txt
: 10 3
: 10 3
: 3 4 1 2 3 7 9 8 3 3
: 3 4 1 2 3 7 9 8 3 3
; alfa.out
; alfaout.txt
: Datele introduse corespund restricțiilor impuse.
: 3 1 2 4 3 7 8 9 3 3
: 3 1 2 4 3 7 8 9 3 3
== Exemplul 2 ==
; alfain.txt
: 1 3
: 3 4 1 2 3 7 9 8 3 3
; alfaout.txt
: Datele introduse nu corespund restricțiilor impuse.
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def transforma_sir(n, x, sir):
def validare(lungime_intrare1, numar_tinta1, lista_numere1):  # functia de validare a datelor de intrare
    if lungime_intrare1 > 1000 or lungime_intrare1 < 2:
        raise ValueError
    if len(lista_numere1) != lungime_intrare1:
        raise ValueError
    if lista_numere1[0] != numar_tinta1 or lista_numere1[-1] != numar_tinta1:
        raise ValueError
    for numar in lista_numere1:
        if not (0 < numar < 10000):
            raise ValueError
    return "Datele de intrare corespund restrictiilor impuse."
 
 
def transforma_lista(lungime_intrare1, numar_tinta1, lista_numere1):
     i = 0
     i = 0
    # Parcurgem șirul de numere
     while i < lungime_intrare1:
     while i < n:
         if lista_numere1[i] == numar_tinta1:
        # Dacă numărul curent este egal cu x
         if sir[i] == x:
            # Căutăm următorul număr egal cu x
             j = i + 1
             j = i + 1
             while j < n and sir[j] != x:
             while j < lungime_intrare1 and lista_numere1[j] != numar_tinta1:
                 j += 1
                 j += 1
            # Dacă am găsit un alt număr egal cu x
             if j < lungime_intrare1:
             if j < n:
                 lista_numere1[i + 1:j] = sorted(lista_numere1[i + 1:j])
                 # Sortăm numerele dintre cele două numere egale cu x
                sir[i+1:j] = sorted(sir[i+1:j])
            # Ne mutăm la următorul număr egal cu x
             i = j
             i = j
         else:
         else:
            # Dacă numărul curent nu este egal cu x, trecem la următorul număr
             i += 1
             i += 1
     # Întoarcem șirul transformat
     return lista_numere1
     return sir
 
 
if __name__ == '__main__':
    fisier_intrare = open("alfain.txt", "r")        # declararea fisierelor
    fisier_iesire = open("alfaout.txt", "w")      # fisierul out trebuie declarat cu optiunea "w" (write)
 
    try:
        lungime_intrare, numar_tinta = map(int, fisier_intrare.readline().split())
        lista_numere = list(map(int, fisier_intrare.readline().split()))
 
        mesaj_validare = validare(lungime_intrare, numar_tinta, lista_numere)  # apelul functiei de validare
        lista_numere = transforma_lista(lungime_intrare, numar_tinta, lista_numere)     # apelul functiei de rezolvare
 
        fisier_iesire.write(mesaj_validare + '\n')
        fisier_iesire.write(' '.join(map(str, lista_numere)) + '\n')


if __name__ == "__main__":
    except ValueError:
    n = 10
        fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")
    x = 3
    sir = [3, 4, 1, 2, 3, 7, 9, 8, 3, 3]
    # Apelăm funcția cu valorile date și afișăm rezultatul
    print(transforma_sir(n, x, sir))


</syntaxhighlight>
</syntaxhighlight>

Versiunea de la data 19 noiembrie 2023 19:30

Cerinţa

Se dă un șir format din n numere naturale. Se mai dă o valoare x și se garantează că șirul începe și se termină cu valoarea x. Transformați șirul astfel:

  • Elementele cu valoarea x rămân pe pozițiile lor;
  • Secvențele de elemente diferile de x aflate între două poziții cu valoarea x se ordonează crescător (între aceleași două elemente cu valoarea x se vor afla aceleași elemente ca la început dar în ordine crescătoare).

Date de intrare

Fișierul alfain.txt conține pe prima linie un număr natural n reprezentând dimensiunea șirului și un număr x cu semnificația de mai sus. Pe linia a doua n numere naturale, separate prin câte un spațiu, reprezentând elementele șirului.

Date de ieşire

Fișierul alfaout.txt conține cele n elemente ale șirului în ordinea cerută.

Restricții și precizări

  • 2 <= n <= 1000
  • Elementele șirului dat sunt naturale nenule formate din maximum 4 cifre
  • Pentru 40 de puncte șirul conține doar două elemente cu valoarea x (primul și ultimul).

Exemplul 1

alfain.txt
10 3
3 4 1 2 3 7 9 8 3 3
alfaout.txt
Datele introduse corespund restricțiilor impuse.
3 1 2 4 3 7 8 9 3 3

Exemplul 2

alfain.txt
1 3
3 4 1 2 3 7 9 8 3 3
alfaout.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare

def validare(lungime_intrare1, numar_tinta1, lista_numere1):   # functia de validare a datelor de intrare
    if lungime_intrare1 > 1000 or lungime_intrare1 < 2:
        raise ValueError
    if len(lista_numere1) != lungime_intrare1:
        raise ValueError
    if lista_numere1[0] != numar_tinta1 or lista_numere1[-1] != numar_tinta1:
        raise ValueError
    for numar in lista_numere1:
        if not (0 < numar < 10000):
            raise ValueError
    return "Datele de intrare corespund restrictiilor impuse."


def transforma_lista(lungime_intrare1, numar_tinta1, lista_numere1):
    i = 0
    while i < lungime_intrare1:
        if lista_numere1[i] == numar_tinta1:
            j = i + 1
            while j < lungime_intrare1 and lista_numere1[j] != numar_tinta1:
                j += 1
            if j < lungime_intrare1:
                lista_numere1[i + 1:j] = sorted(lista_numere1[i + 1:j])
            i = j
        else:
            i += 1
    return lista_numere1


if __name__ == '__main__':
    fisier_intrare = open("alfain.txt", "r")         # declararea fisierelor
    fisier_iesire = open("alfaout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)

    try:
        lungime_intrare, numar_tinta = map(int, fisier_intrare.readline().split())
        lista_numere = list(map(int, fisier_intrare.readline().split()))

        mesaj_validare = validare(lungime_intrare, numar_tinta, lista_numere)   # apelul functiei de validare
        lista_numere = transforma_lista(lungime_intrare, numar_tinta, lista_numere)     # apelul functiei de rezolvare

        fisier_iesire.write(mesaj_validare + '\n')
        fisier_iesire.write(' '.join(map(str, lista_numere)) + '\n')

    except ValueError:
        fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")