4127 – Șiruri4

De la Universitas MediaWiki

Cerința

Dându-se cele N numere din șir să se determine:
Câte numere din șirul inițial nu au nevoie de transformare (conțin doar cifre distincte)?
Câte numere va conține șirul după realizarea tuturor operațiilor de unire?
Care este numărul maxim de cifre ale unui număr din noul șir și câte numere au acest număr maxim de cifre?

Date de intrare

Fișierul de intrare siruri.in conține pe prima linie un număr natural c (1, 2 sau 3). Pe a doua linie se găsește un număr natural nenul N. Pe a treia linie se află N numere naturale separate de câte un spațiu reprezentând șirul inițial.

Date de ieșire

În fișierul de ieșire siruri.out se va afla în funcție de cerința dată:
dacă c = 1, se va afișa pe prima linie numărul de numere ce nu au nevoie de transformare
dacă c = 2, se va afișa pe prima linie numărul de numere din șir după realizarea tuturor operațiilor de unire
dacă c = 3, se vor afișa pe prima linie două numere separate printr-un singur spatiu, reprezentând numărul maxim de cifre ale unui număr după efectuarea operațiilor de unire, respectiv numărul de astfel de numere cu număr maxim de cifre.

Restricții și precizări

c ∈ {1, 2, 3}
1 ≤ N ≤ 100.000
1 ≤ a[i] ≤ 1.000.000.000
a[i] conține doar cifre nenule, pentru oricare 1 ≤ i ≤ n
Pentru 18 puncte, c = 1
Pentru 40 puncte, c = 2
Pentru 42 puncte, c = 3

Exemplul 1

siruriin.txt
1
8
21245 51278 869 33447 723 397897 545786 6783221
siruriout.txt
3


Exemplul 2

siruriin.txt
2
8
21245 51278 869 33447 723 397897 545786 6783221
siruriout.txt
4


Rezolvare

#4127 – Șiruri4
def transformare_numar(numar):
    cifre_pastrate = set()
    rezultat = ""

    for cifra in str(numar)[::-1]:
        if cifra not in cifre_pastrate:
            cifre_pastrate.add(cifra)
            rezultat += cifra

    return int(rezultat[::-1])

def procesare_sir(sir):
    numere_transformate = 0
    numere = []

    for i in range(len(sir) - 1):
        if str(sir[i])[-1] == str(sir[i + 1])[0]:
            numar_nou = transformare_numar(int(str(sir[i]) + str(sir[i + 1])))
            numere_transformate += 1
            numere.append(numar_nou)
        else:
            numere.append(transformare_numar(sir[i]))

    numere.append(transformare_numar(sir[-1]))

    return numere_transformate, numere
def verificare_restrictii(numar):    # funcția de verificare a datelor de intrare
    if 1 < numar <= 100.000   # adăugăm restricția pentru n
       1 < a[i] <= 1.000.000.000:
        return True
    else:
        return False

def main():
    with open("siruriin.txt", "r") as file_in:
        cerinta = int(file_in.readline().strip())
        N = int(file_in.readline().strip())
        sir = list(map(int, file_in.readline().split()))

    if cerinta == 1:
        numere_fara_transformare = sum(transformare_numar(numar) == numar for numar in sir)
        with open("siruriout.txt", "w") as file_out:
            file_out.write(str(numere_fara_transformare))
    elif cerinta == 2:
        _, numere_dupa_procesare = procesare_sir(sir)
        with open("siruriout.txt", "w") as file_out:
            file_out.write(str(len(numere_dupa_procesare)) + "\n")
            file_out.write(" ".join(map(str, numere_dupa_procesare)))
    elif cerinta == 3:
        _, numere_dupa_procesare = procesare_sir(sir)
        numar_maxim_cifre = max(len(str(numar)) for numar in numere_dupa_procesare)
        numere_maxim_cifre = sum(len(str(numar)) == numar_maxim_cifre for numar in numere_dupa_procesare)
        with open("siruriout.txt", "w") as file_out:
            file_out.write(f"{numar_maxim_cifre} {numere_maxim_cifre}\n")

if __name__ == "__main__":
    main()
def transformare_numar(numar):
    cifre_pastrate = set()
    rezultat = ""

    for cifra in str(numar)[::-1]:
        if cifra not in cifre_pastrate:
            cifre_pastrate.add(cifra)
            rezultat += cifra

    return int(rezultat[::-1])

def procesare_sir(sir):
    numere_transformate = 0
    numere = []

    for i in range(len(sir) - 1):
        if str(sir[i])[-1] == str(sir[i + 1])[0]:
            numar_nou = transformare_numar(int(str(sir[i]) + str(sir[i + 1])))
            numere_transformate += 1
            numere.append(numar_nou)
        else:
            numere.append(transformare_numar(sir[i]))

    numere.append(transformare_numar(sir[-1]))

    return numere_transformate, numere

def main():
    with open("siruriin.txt", "r") as filein.txt:
        cerinta = int(filein.txt.readline().strip())
        N = int(filein.txt.readline().strip())
        sir = list(map(int, filein.txt.readline().split()))

    if cerinta == 1:
        numere_fara_transformare = sum(transformare_numar(numar) == numar for numar in sir)
        with open("siruriout.txt", "w") as fileout.txt:
            fileout.txt.write(str(numere_fara_transformare))
    elif cerinta == 2:
        _, numere_dupa_procesare = procesare_sir(sir)
        with open("siruriout.txt", "w") as fileout.txt:
            fileout.txt.write(str(len(numere_dupa_procesare)) + "\n")
            fileout.txt.write(" ".join(map(str, numere_dupa_procesare)))
    elif cerinta == 3:
        _, numere_dupa_procesare = procesare_sir(sir)
        numar_maxim_cifre = max(len(str(numar)) for numar in numere_dupa_procesare)
        numere_maxim_cifre = sum(len(str(numar)) == numar_maxim_cifre for numar in numere_dupa_procesare)
        with open("siruriotxtut.", "w") as fileout.txt:
            fileout.txt.write(f"{numar_maxim_cifre} {numere_maxim_cifre}\n")

if __name__ == "__main__":
    main()