2362 - Bal Mascat

De la Universitas MediaWiki

Sursa: [1]


Cerinţa

Un grup de copii participă la un Bal Mascat. Participanții nu pot să-și aleagă singuri costumul. Organizatorii au pregătit exact atâtea costume câți copii sunt. Au ambalat costumele în cutii numerotate și le-au așezat într-o cameră. Copiii intră în camera cu costume și își aleg câte o cutie (la întâmplare). Fiind puși pe glume, organizatorii au scos încălțămintea din anumite cutii, după regula: cutia cu numărul p ramâne fără încălțări, apoi cutia cu numărul 2*p, apoi cutia cu numărul 3*p și așa mai departe până la terminarea cutiilor. Dacă ultima cutie a rămas cu tot costumul, atunci organizatorii scot încălțămintea și din ea. După ce primesc cutiile cu costume, copiii constată că nu se pot deschide decât cu ajutorul unui cod (același la toate cutiile). Organizatorii le dau indicii despre cum să afle codul: se calculează numărul de cutii care au rămas fără încălțăminte, se află ultima cifră din acest număr (notată cu c). Apoi se formează un cod intermediar cu exact 2*p cifre, astfel: dacă c are o valoare diferită de 9, atunci prima cifră (pornind de la stânga numărului) are valoarea (c+1). Dacă c are valoarea 9 atunci prima cifră este (c-1). A doua cifră are valoarea c. A treia cifră este egală cu prima, cifra a patra urmând să fie egală cu a doua și tot așa până se află toate cele 2*p cifre. La final, se taie ultima cifră și ajungem la codul corect cu care se deschid cutiile.

Scrieţi un program care să îi ajute pe copii să afle codul cu care se deschid cutiile.

Date de intrare

Fișierul de intrare balmascat.in conţine pe prima linie două valori: un număr natural n ce reprezintă numărul de copii ce participă la balul mascat și un număr p ce reprezintă pasul cu care se stabilesc cutiile din care se scot încălțările.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi fișierul de ieșire balmascat.out va conţine codul de acces cu care se deschid cutiile. În caz contrar, pe ecran se va afișa: "Datele nu au fost introduse corect."

Restricţii şi precizări

  • 11 ≤ n ≤ 10000
  • 1 ≤ p ≤ 8.

Exemple

Exemplul 1

balmascat.in
15 3
Ecran
Datele sunt introduse corect.
balmascat.out
65656

Exemplul 2

balmascat.in
421 6
Ecran
Datele sunt introduse corect.
balmascat.out
21212121212

Exemplul 3

balmascat.in
35 4
Ecran
Datele sunt introduse corect.
balmascat.out
8989898

Rezolvare

# 2362

def verificare_date_intrare(n, p):
    if not (11 <= n <= 10000) or not (1 <= p <= 8):
        print("Datele nu au fost introduse corect.")
        return False
    print("Datele sunt introduse corect.")
    return True

def rezolva_problema(n, p):
    c = str(sum(1 for i in range(1, n+1) if i % p != 0))
    cifre = [(int(c)+1) % 10 if i % 2 == 0 else int(c) for i in range(2*p)]
    cod = "".join(str(cifre[i % len(cifre)]) for i in range(2*p))
    cod_corect = cod[:-1]
    return cod_corect

if __name__ == "__main__":
    with open("balmascat.in") as f:
        n, p = map(int, f.readline().split())
    if verificare_date_intrare(n, p):
        cod_corect = rezolva_problema(n, p)
        with open("balmascat.out", "w") as f:
            f.write(cod_corect)

Explicație rezolvare

Prima funcție, "verificare_date_intrare(n, p)", primește doi parametri, n și p, și verifică dacă valorile acestora se încadrează în anumite limite. Dacă valorile nu sunt în limitele specificate, afișează un mesaj de eroare și returnează False. În caz contrar, afișează un mesaj de confirmare și returnează True.

A doua funcție, "rezolva_problema(n, p)", primește, de asemenea, doi parametri, n și p, și rezolvă problema specifică dată în cod. Folosind o compunere de expresii generatoare și metode str, calculează un cod de lungime fixă, în funcție de valorile parametrilor. Aceasta returnează partea din codul generat fără ultima cifră.

În secțiunea "if name == "main":", codul citeste valorile pentru n și p din fișierul balmascat.in. Dacă datele sunt corecte, se calculează cod_corect apelând funcția rezolva_problema(n, p). Apoi, se deschide un fișier de ieșire balmascat.out și se scrie cod_corect în fișier.