1537 - 7 Segmente

De la Universitas MediaWiki

Un indicator cu 7 segmente este un dispozitiv de afişaj electronic destinat afişării unei cifre zecimale. Aceste dispozitive sunt utilizate pe scară largă în ceasuri digitale, contoare electronice şi alte aparate, pentru afişarea informaţiilor numerice. Cele 7 segmente au fost notate cu literele a, b, c, d, e, f, g, după modelul din figura de mai jos.

Proiectarea diverselor sisteme de afişaj trebuie să ţină cont şi de puterea necesară pentru afişarea unei cifre. Pentru aprinderea unui segment este necesară o putere de 1 mW. Astfel, în funcţie de cifra afişată, dispozitivul necesită o putere egală cu numărul de segmente aprinse la afişarea cifrei respective. Puterea necesară pentru afişarea unui număr natural este egală cu suma puterilor necesare afişării fiecăreia dintre cifrele sale.

Cerința

Să se scrie un program care citeşte două numere naturale nenule n şi p, (numărul n având toate cifrele nenule)şi calculează:

  • numărul natural k reprezentând puterea necesară pentru afişarea numărului n;
  • cel mai mare număr natural t, format numai din cifre nenule, mai mic sau egal decât n, care necesită pentru afişare o putere de cel mult p mW.

Date de intrare

Prima linie a fişierului de intrare input.txt conţine două numere naturale nenule n şi p, (numărul n având toate cifrele nenule), despărţite printr-un spaţiu, cu semnificaţia de mai sus.

Date de ieșire

Fişierul de ieşire output.txt va conţine pe o singură linie, cele două numere naturale nenule k şi t (numărul t având toate cifrele nenule), separate printr-un spaţiu, cu semnificaţia de mai sus.

Restricții și precizări

  • 1 ≤ n < 10**19;
  • 2 ≤ p ≤ 150;

Exemplul 1

input.txt:

7654 12

output.txt:

18 7511

Explicație:

Numărul n este 7654; puterea necesară pentru afişare este 3 + 6 + 5 + 4 = 18 mW, iar cel mai mare număr, mai mic sau egal cu 7654, format numai din cifre nenule, care necesită pentru afişare o putere de cel mult 12 mW, este 7511.

Exemplul 2

input.txt:

7654 9999

Output:

Constrangeri neindeplinite

Rezolvare

def ver(n,p):
    if not(1<=n<=10**19):
        print("Constrangeri neindeplinite")
        exit()
    if not(2<=p<=150):
        print("Constrangeri neindeplinite")
        exit()

def main():
    with open("input.txt", "r") as f, open("output.txt", "w") as g:
        v = [0] * 20
        t = [0] * 20
        p = 0

        pw = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6]

        n, p = map(int, f.readline().split())

        ver(n,p)

        pc = 0
        i = 0
        nc = 0
        aux = 0
        dmin = 0
        dmax = 0
        cifra = 0
        egalcif = 1

        v[0] = 0
        i = 0
        while n > 0:
            i += 1
            v[i] = n % 10
            case_dict = {1: 2, 2: 5, 3: 5, 4: 4, 5: 5, 6: 6, 7: 3, 8: 7, 9: 6}
            pc += case_dict.get(n % 10, 0)
            n //= 10
        v[0] = i
        g.write(f"{pc} ")

        for i in range(1, v[0] // 2 + 1):
            aux = v[i]
            v[i] = v[v[0] + 1 - i]
            v[v[0] + 1 - i] = aux

        nc = p // 2
        nc = min(nc, v[0])

        for i in range(1, nc + 1):
            t[i] = 1

        p = p - 2 * nc
        t[0] = nc
        cc = 1
        egalcif = 1
        while p > 0 and cc <= t[0]:
            dmin = 10
            cifra = 1
            dmax = 0

            for i in range(2, 10):
                if t[0] == v[0] and egalcif == 1:
                    if i <= v[cc] and abs(i - v[cc]) <= dmin and p - pw[i] + pw[1] >= 0:
                        cifra = i
                        dmin = abs(i - v[cc])
                if t[0] < v[0] or egalcif == 0:
                    if i >= dmax and p - pw[i] + pw[1] >= 0:
                        cifra = i
                        dmax = i

            if v[cc] - cifra != 0:
                egalcif = 0

            p += pw[1]
            p -= pw[cifra]
            t[cc] = cifra
            cc += 1

        for i in range(1, t[0] + 1):
            g.write(str(t[i]))

        g.write("\n")


if __name__ == "__main__":
    main()