Pole nałożenia się dwóch prostokątów

Zadanie 3 z 11 · rozdział 18Trudność: 2 z 3classstaticgeometria

Treść zadania

Zaprojektuj klasę Prostokat opisującą prostokąt o bokach równoległych do osi układu współrzędnych. Prostokąt jest wyznaczony przez dwa przeciwległe wierzchołki: lewy dolny $(x_1, y_1)$ i prawy górny $(x_2, y_2)$.

Klasa ma mieć:

  1. Konstruktor __init__(self, x1, y1, x2, y2).
  2. Metodę __str__() zwracającą napis lewy dolny (x1, y1), prawy górny (x2, y2).
  3. Metodę statyczną pole_wspolne(a, b) zwracającą pole części wspólnej prostokątów a i b. Jeśli prostokąty nie nachodzą na siebie (albo stykają się tylko bokiem lub wierzchołkiem), pole części wspólnej wynosi 0.

Program wczytuje dwa prostokąty $A$ i $B$, wypisuje je i podaje pole ich części wspólnej.

Dane wejściowe

  • 1. linia: cztery liczby całkowite $x_1$, $y_1$, $x_2$, $y_2$ — prostokąt $A$
  • 2. linia: cztery liczby całkowite $x_1$, $y_1$, $x_2$, $y_2$ — prostokąt $B$

Dane wyjściowe

Trzy linie:

Prostokąt A: lewy dolny (x1, y1), prawy górny (x2, y2)
Prostokąt B: lewy dolny (x1, y1), prawy górny (x2, y2)
Pole części wspólnej: <pole>

Pole jest liczbą całkowitą.

Ograniczenia

  • $-1000 \le x_1 < x_2 \le 1000$, $-1000 \le y_1 < y_2 \le 1000$

Uwagi

  • Część wspólna (jeśli istnieje) też jest prostokątem. Jej lewa krawędź leży na $\max$ z lewych krawędzi obu prostokątów, a prawa na $\min$ z prawych krawędzi — analogicznie w pionie.

Przykład

Wejście
3 4 9 6
2 2 7 5
Wyjście
Prostokąt A: lewy dolny (3, 4), prawy górny (9, 6)
Prostokąt B: lewy dolny (2, 2), prawy górny (7, 5)
Pole części wspólnej: 4

Częścią wspólną jest prostokąt o wierzchołkach $(3, 4)$ i $(7, 5)$, czyli o wymiarach $4 \times 1$.

Zasady obowiązujące w rozdziale 18

Zadania w tym rozdziale uczą projektowania klas: konstruktora __init__, atrybutów, metod, metod statycznych (@staticmethod) oraz metod specjalnych, dzięki którym obiekty można wypisywać (__str__), porównywać (__eq__) i łączyć operatorami (__add__, __sub__, __mul__, …). Ostatnie zadania wprowadzają też wyjątki (raise, try/except), klasy danych (@dataclass) i generatory (yield).

Konwencje wspólne:

  • Każde zadanie to osobny program: czyta standardowe wejście i wypisuje wynik na standardowe wyjście.
  • W każdym zadaniu dostajesz kod startowy ze szkieletem klasy, a zwykle także z gotowym wczytywaniem danych i wypisywaniem wyników. Twoim zadaniem jest przede wszystkim uzupełnienie metod klasy — wynik programu zależy od tego, jak działa Twoja klasa.
  • Nazwy klas i metod podane w treści są obowiązkowe (kod startowy z nich korzysta). Nazwy w kodzie piszemy bez polskich znaków, np. Kolo, Prostokat.
  • „Z dokładnością do 2 miejsc po przecinku” oznacza dokładnie dwie cyfry po kropce, np. f"{x:.2f}" (3.00, -0.50).
  • Program nie wypisuje komunikatów typu „Podaj liczbę:”.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
0 0 2 2
5 5 7 8
Oczekiwane wyjście
Prostokąt A: lewy dolny (0, 0), prawy górny (2, 2)
Prostokąt B: lewy dolny (5, 5), prawy górny (7, 8)
Pole części wspólnej: 0

Test 2

Nie uruchomiono
Wejście
0 0 2 2
2 0 4 2
Oczekiwane wyjście
Prostokąt A: lewy dolny (0, 0), prawy górny (2, 2)
Prostokąt B: lewy dolny (2, 0), prawy górny (4, 2)
Pole części wspólnej: 0

Test 3

Nie uruchomiono
Wejście
0 0 10 10
2 3 5 7
Oczekiwane wyjście
Prostokąt A: lewy dolny (0, 0), prawy górny (10, 10)
Prostokąt B: lewy dolny (2, 3), prawy górny (5, 7)
Pole części wspólnej: 12

Test 4

Nie uruchomiono
Wejście
-3 -2 1 2
-3 -2 1 2
Oczekiwane wyjście
Prostokąt A: lewy dolny (-3, -2), prawy górny (1, 2)
Prostokąt B: lewy dolny (-3, -2), prawy górny (1, 2)
Pole części wspólnej: 16

Test 5

Nie uruchomiono
Wejście
0 1 8 3
2 -1 5 6
Oczekiwane wyjście
Prostokąt A: lewy dolny (0, 1), prawy górny (8, 3)
Prostokąt B: lewy dolny (2, -1), prawy górny (5, 6)
Pole części wspólnej: 6
Uruchom z własnymi danymi