2448 - Pătrate3: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 19 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 1: Linia 1:
Sursa: [https://www.pbinfo.ro/probleme/2248/coordonate]
Sursa: [https://www.pbinfo.ro/probleme/2448/patrate3]
== Cerinţa ==
== Cerinţa ==
Pentru valorile n, x, y, val date, trebuie să determinați:
Scrieţi un program care rezolvă următoarele două cerinţe:


* ce valoare V se află în pătratul n x n la poziția (x, y).
1. Citește un număr natural M și determină numărul K de valori conținute de pătratul numerotat cu M;
* la ce poziție (i, j) se află valoarea val în pătratul n x n.
 
2. Citește un număr natural N și determină numărul T al pătratului care conține numărul N pe una dintre laturi.


== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură numerele '''n''', '''x''', '''y''', '''val''', separate prin spații.
Fișierul de intrare '''patrate3.in''' conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2). Dacă C = 1, atunci fişierul conține pe a doua linie numărul natural M. Dacă C = 2, atunci fișierul conține pe a doua linie numărul natural N.


== Date de ieșire ==  
== Date de ieșire ==  
Programul va afișa pe ecran, mesajul "Datele introduse corespund cerințelor" și pe ecran numerele '''V''', '''i''', '''j''', separate prin câte un spațiu, unde '''V''' reprezintă valoarea de la poziția '''(x, y)''', iar '''(i, j)''' reprezintă poziția unde se află valoarea '''val'''. În caz contrar programul va afișa pe o linie noua mesajul "Datele introduse nu corespund cerintelor.".
Dacă C = 1, atunci fişierul de ieşire '''patrate3.out''' conţine pe prima linie numărul K, reprezentând răspunsul la cerința 1 a problemei si mesajul "Datele introduse corespund cerintelor". Dacă C = 2, atunci fişierul de ieşire '''patrate3.out''' conţine pe prima linie numărul natural T, reprezentând răspunsul la cerinţa 2 și mesajul "Datele introduse corespund cerințelor." În caz contrar programul v-a afișa mesajul "Datele introduse nu corespund cenrintelor" și se va inceta executia programului.


== Restricţii şi precizări ==
== Restricţii şi precizări ==
* 1 ⩽ '''n''' ⩽ 20000
* 1 ⩽ '''M''' ⩽ 260.000.000
* 1 ⩽ '''x, y''' ⩽ '''n'''
* 1 ⩽ '''N''' ⩽ 2.147.302.920
* 1 ⩽ '''val''' ⩽ n^2
* Numerele N, M, T și K sunt numere naturale


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Intrare
: 4
: ''patrate3.in''
: 2
: 1 3
: 3
: 12
; Ieșire
; Ieșire
: 7 3 4
: Datele introduse corespund cerințelor
: ''patrate3.out''
: 24
<br>
<br>


== Exemplul 2 ==
== Exemplul 2 ==
; Intrare
; Intrare
: 21367283
: ''patrate3.in''
: 287357253812
: 0 0
: 216932863921
: 89730960
; Ieșire
; Ieșire
: Datele introduse nu corespund cerintelor.
: Datele introduse nu corespund cerințelor
<br>
<br>


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#2248
#2448
def is_valid_input(n, x, y, v):
import math
     if not (1 <= n <= 20000):
 
         print("Datele introduse nu corespund cerintelor.")
 
        exit()
def validate_input(m, n):
     if not (1 <= x <= n) or not (1 <= y <= n):
     if not (1 <= m <= 260000000):
         print("Datele introduse nu corespund cerintelor.")
         return False
        exit()
     if not (1 <= n <= 2147302920):
     if not (1 <= v <= n ** 2):
        return False
         print("Datele introduse nu corespund cerintelor.")
    # Verifică că M și N sunt numere naturale
         exit()
    if not isinstance(m, int) or not isinstance(n, int):
         return False
    # Verifică că nu există două pătrate cu același număr de valori scrise pe laturi
    num_values = [m, n]
     for i in range(2):
         count = num_values.count(num_values[i])
         if count > 1:
            return False
     return True
     return True




def calculate_coordinates(n, x, y, v):
def read_input():
     # Verifică dacă intrările sunt valide
     with open("patrate3.in", "r") as f:
    if not is_valid_input(n, x, y, v):
        cer, n = map(int, f.readline().split())
        return None
    return cer, n


    # Calculează coordonatele folosind formulele din program
    coord_x = (x - 1) * n + y
    coord_y = v // n if v % n == 0 else v // n + 1
    coord_z = n if v % n == 0 else v % n


     return (coord_x, coord_y, coord_z)
def write_output(output):
     with open("patrate3.out", "w") as f:
        f.write(str(output))




def main():
def solve(cer, n):
     n = int(input())
     if cer == 1:
     x = int(input())
        return 8 * n
    y = int(input())
     else:
    v = int(input())
        m = int(math.sqrt(n))
        if m % 2 == 1:
            return (m + 1) // 2
        else:
            return m // 2


    # Calculează coordonatele folosind funcția definită anterior
    coords = calculate_coordinates(n, x, y, v)


     if coords is None:
if __name__ == '__main__':
         print("Input invalid")
    cer, n = read_input()
     if not validate_input(cer, n):
         print("Datele introduse nu corespund cerintelor.")
     else:
     else:
        # Afișează coordonatele separate printr-un spațiu
         print("Datele introduse corespund cerintelor.")
         print("Datele introduse corespund cerintelor.")
         print(coords[0], coords[1], coords[2])
         output = solve(cer, n)
 
        write_output(output)


main()
</syntaxhighlight>
</syntaxhighlight>


== Explicatie rezolvare ==
== Explicatie rezolvare ==
Acest program citește date de intrare dintr-un fișier numit '''patrate3.in''', validează datele de intrare conform unor criterii prestabilite, rezolvă problema specifică (calculând o valoare pentru variabila output) și afișează rezultatul final într-un fișier numit '''patrate3.out'''.
Funcția '''validate_input(m, n)''' verifică dacă m și n îndeplinesc anumite condiții și returnează True dacă sunt valide, sau False în caz contrar.
Funcția '''read_input()''' deschide fișierul '''patrate3.in''', citește primul număr (cer) și al doilea număr (n) din prima linie, apoi le returnează sub formă de tuplu.
Funcția '''write_output(output)''' deschide fișierul "patrate3.out" și scrie valoarea output în el.
Funcția '''solve(cer, n)''' primește cer și n și returnează o valoare specifică în funcție de valoarea lui cer și n.
În secțiunea main, programul citește datele de intrare, verifică dacă sunt valide prin apelul funcției '''validate_input''', apoi rezolvă problema și afișează rezultatul final dacă datele de intrare sunt valide.

Versiunea curentă din 12 mai 2023 18:24

Sursa: [1]

Cerinţa

Scrieţi un program care rezolvă următoarele două cerinţe:

1. Citește un număr natural M și determină numărul K de valori conținute de pătratul numerotat cu M;

2. Citește un număr natural N și determină numărul T al pătratului care conține numărul N pe una dintre laturi.

Date de intrare

Fișierul de intrare patrate3.in conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2). Dacă C = 1, atunci fişierul conține pe a doua linie numărul natural M. Dacă C = 2, atunci fișierul conține pe a doua linie numărul natural N.

Date de ieșire

Dacă C = 1, atunci fişierul de ieşire patrate3.out conţine pe prima linie numărul K, reprezentând răspunsul la cerința 1 a problemei si mesajul "Datele introduse corespund cerintelor". Dacă C = 2, atunci fişierul de ieşire patrate3.out conţine pe prima linie numărul natural T, reprezentând răspunsul la cerinţa 2 și mesajul "Datele introduse corespund cerințelor." În caz contrar programul v-a afișa mesajul "Datele introduse nu corespund cenrintelor" și se va inceta executia programului.

Restricţii şi precizări

  • 1 ⩽ M ⩽ 260.000.000
  • 1 ⩽ N ⩽ 2.147.302.920
  • Numerele N, M, T și K sunt numere naturale

Exemplul 1

Intrare
patrate3.in
1 3
Ieșire
Datele introduse corespund cerințelor
patrate3.out
24


Exemplul 2

Intrare
patrate3.in
0 0
Ieșire
Datele introduse nu corespund cerințelor


Rezolvare

#2448
import math


def validate_input(m, n):
    if not (1 <= m <= 260000000):
        return False
    if not (1 <= n <= 2147302920):
        return False
    # Verifică că M și N sunt numere naturale
    if not isinstance(m, int) or not isinstance(n, int):
        return False
    # Verifică că nu există două pătrate cu același număr de valori scrise pe laturi
    num_values = [m, n]
    for i in range(2):
        count = num_values.count(num_values[i])
        if count > 1:
            return False
    return True


def read_input():
    with open("patrate3.in", "r") as f:
        cer, n = map(int, f.readline().split())
    return cer, n


def write_output(output):
    with open("patrate3.out", "w") as f:
        f.write(str(output))


def solve(cer, n):
    if cer == 1:
        return 8 * n
    else:
        m = int(math.sqrt(n))
        if m % 2 == 1:
            return (m + 1) // 2
        else:
            return m // 2


if __name__ == '__main__':
    cer, n = read_input()
    if not validate_input(cer, n):
        print("Datele introduse nu corespund cerintelor.")
    else:
        print("Datele introduse corespund cerintelor.")
        output = solve(cer, n)
        write_output(output)

Explicatie rezolvare

Acest program citește date de intrare dintr-un fișier numit patrate3.in, validează datele de intrare conform unor criterii prestabilite, rezolvă problema specifică (calculând o valoare pentru variabila output) și afișează rezultatul final într-un fișier numit patrate3.out.

Funcția validate_input(m, n) verifică dacă m și n îndeplinesc anumite condiții și returnează True dacă sunt valide, sau False în caz contrar.

Funcția read_input() deschide fișierul patrate3.in, citește primul număr (cer) și al doilea număr (n) din prima linie, apoi le returnează sub formă de tuplu.

Funcția write_output(output) deschide fișierul "patrate3.out" și scrie valoarea output în el.

Funcția solve(cer, n) primește cer și n și returnează o valoare specifică în funcție de valoarea lui cer și n.

În secțiunea main, programul citește datele de intrare, verifică dacă sunt valide prin apelul funcției validate_input, apoi rezolvă problema și afișează rezultatul final dacă datele de intrare sunt valide.