0922 - Puncte

De la Universitas MediaWiki

Cerinţa

Se dau coordonatele carteziene a n puncte în plan. Să se determine distanța maximă dintre un punct dat și originea sistemului de coordonate și numărul de puncte situate la acea distanță față de origine.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n perechi de puncte x y, reprezentând coordonatele punctelor.

Date de ieşire

Programul va afișa pe ecran două numere D C, reprezentând distanța maximă față de originea sistemului și numărul de puncte situate la acea distanță.

Restricții și precizări

  • 1 ⩽ n ⩽ 100
  • coordonatele punctelor sunt numere întregi din intervalul [-1000,1000]
  • distanța maximă se va afișa cu cel puțin trei zecimale exacte

Exemplul 1

Intrare
7
2 -1
-2 4
2 3
3 -1
-2 -4
2 -2
-4 2
Ieșire
Datele introduse corespund restricțiilor impuse.
4.472 3


Exemplul 2

Intrare
9
244a
Ieșire
Datele introduse nu corespund restricțiilor impuse.


Explicație

Cele trei puncte aflate la distanța 4.472 față de origine sunt: -2 4, -2 -4 și -4 2.

Rezolvare

# 0922  Puncte
def verificare(n1_val, puncte_val1):
    # Verificăm dacă numărul de puncte este în intervalul [1, 100]
    if 1 <= n1_val <= 100:
        # Verificăm dacă coordonatele fiecărui punct sunt în intervalul [-1000, 1000]
        for x1_val, y1_val in puncte_val1:
            if not(-1000 <= x1_val <= 1000 and -1000 <= y1_val <= 1000):
                # Dacă un punct nu respectă restricțiile, ridicăm o excepție
                raise ValueError
        # Dacă toate punctele respectă restricțiile, returnăm numărul de puncte
        return n1_val
    else:
        # Dacă numărul de puncte nu este în intervalul [1, 100], ridicăm o excepție
        raise ValueError


def distanta_maxima(numar_valoare, puncte_valoare):
    # Inițializăm distanța maximă și numărul de puncte
    distanta_max = 0
    numar_puncte = 0
    for i in range(numar_valoare):    # Parcurgem fiecare punct
        x_valoare, y_valoare = puncte_valoare[i]    # Extragem coordonatele punctului

        # Calculăm distanța de la origine până la punct
        distanta = (x_valoare**2 + y_valoare**2)**0.5

        # Dacă distanța este mai mare decât distanța maximă curentă
        if distanta > distanta_max:
            # Actualizăm distanța maximă și resetăm numărul de puncte
            distanta_max = distanta
            numar_puncte = 1
        # Dacă distanța este egală cu distanța maximă curentă
        elif distanta == distanta_max:
            numar_puncte += 1    # Incrementăm numărul de puncte
    return round(distanta_max, 3), numar_puncte


if __name__ == "__main__":
    try:
        # Citim numărul de puncte de la utilizator
        n_main = input("Introduceti numarul de puncte: ")
        puncte_main = []    # Inițializăm lista de puncte
        # Citim coordonatele fiecărui punct de la utilizator
        for _ in range(int(n_main)):
            x_main, y_main = map(int, input("Introduceti coordonatele punctului: ").split())
            puncte_main.append((x_main, y_main))

        # Validăm numărul de puncte și coordonatele acestora
        n_main = verificare(int(n_main), puncte_main)

        # Dacă datele introduse sunt valide, calculăm și afișăm distanța maximă și numărul de puncte
        print("Datele introduse corespund restricțiilor impuse.")
        dist_max, nr_puncte = distanta_maxima(n_main, puncte_main)
        print(f"{dist_max} {nr_puncte}")
    except ValueError:
        print("Datele introduse nu corespund restricțiilor impuse.")