# Informatyka — zadanie 6.3

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2018-05/zad/6.3
> Wersja Markdown strony zadania (dla asystentów AI). Przy cytowaniu podaj matura.lol i link powyżej.

- arkusz: Informatyka · Matura · maj 2018 (rozszerzona)
- rok: 2018
- poziom: rozszerzona
- typ: open
- punkty: 3
- działy: Bazy danych

## Treść

Kontekst - patrz zadanie 6.1.

Pewnego dnia nastąpiła awaria wszystkich komputerów w jednej z sekcji. Podaj datę awarii oraz symbol sekcji, w której nastąpiła awaria.

## Rozwiązanie — maturazai.pl (AI)

## Poprawna odpowiedź

**Data awarii: 23-12-2015**

**Sekcja: Q**

## Sposób 1 - analiza zadania

**Cel:** znaleźć datę X i sekcję S takie, że WSZYSTKIE komputery sekcji S miały awarię tego dnia.

**Algorytm:**
1. Dla każdej kombinacji (data, sekcja) policz liczbę UNIKALNYCH komputerów, które miały awarię tego dnia.
2. Dla każdej sekcji znajdź liczbę komputerów w sekcji.
3. Znajdź kombinację gdzie obie liczby są EQ.

## Sposób 2 - SQL

```sql
SELECT DATE(a.Czas_awarii) AS dzien, k.Sekcja, COUNT(DISTINCT k.Numer_komputera) AS uszkodzone
FROM awarie a
JOIN komputery k ON a.Numer_komputera = k.Numer_komputera
GROUP BY DATE(a.Czas_awarii), k.Sekcja
HAVING COUNT(DISTINCT k.Numer_komputera) = (
SELECT COUNT(*)
FROM komputery k2
WHERE k2.Sekcja = k.Sekcja
);

Wynik: **(2015-12-23, Q)**.

## Sposób 3 - Python

```python
from collections import defaultdict

# Wczytaj komputery: pesel -> sekcja
komputer_sekcja = {}
sekcja_liczba = defaultdict(int)
with open('komputery.txt', encoding='utf-8') as f:
next(f)
for linia in f:
cz = linia.strip().split('\t')
if len(cz) >= 3:
kom, sek = cz[0], cz[1]
komputer_sekcja[kom] = sek
sekcja_liczba[sek] += 1

# Mapuj (data, sekcja) -> set(komputerów z awarią tego dnia)
awarie = defaultdict(set)
with open('awarie.txt', encoding='utf-8') as f:
next(f)
for linia in f:
cz = linia.strip().split('\t')
if len(cz) >= 4:
kom = cz[1]
czas = cz[2] # format: "2015-01-01 04:40:55"
data = czas[:10] # "2015-01-01"
sek = komputer_sekcja.get(kom)
if sek:
awarie[(data, sek)].add(kom)

# Znajdź (data, sekcja) gdzie awaria objęła wszystkie komputery sekcji
for (data, sek), uszkodzone in awarie.items():
if len(uszkodzone) == sekcja_liczba[sek]:
print(f"Data: {data}, Sekcja: {sek}, Komputerów: {len(uszkodzone)}")
# Data: 2015-12-23, Sekcja: Q, Komputerów: X

## Sposób 4 - arkusz kalkulacyjny

1. W komputery.txt: kolumna A = numer, B = sekcja.
2. W awarie.txt: dodaj kolumnę pomocniczą E = `=LEWY(C2; 10)` (data bez godz.).
3. JOIN: kolumna F = `=WYSZUKAJ.PIONOWO(B2; komputery!A:B; 2; FAŁSZ)` (sekcja).
4. **Tabela przestawna**: wiersze = (E, F), wartości = LICZNIK.UNIKATOWE komputerów.
5. Dla każdej sekcji: liczba wszystkich komputerów (`=LICZ.JEŻELI(komputery!B:B; "Q")`).
6. Znajdź wiersz, gdzie liczba uszkodzonych = liczba całkowita sekcji.

## Reference informatyczny - wszystkie elementy grupy

> Reference - Sprawdzenie "wszystkie z grupy":
> - Liczba awarii w grupie = liczba całkowita grupy → wszystkie elementy.
> - Alternatywnie: `NOT EXISTS (SELECT 1 FROM grupa WHERE el NOT IN awarie)`.
>
> Reference - DATE() w SQL:
> - `DATE(timestamp)` - wyciąga datę z timestampa.
> - `SUBSTRING(czas, 1, 10)` - ręczne wyciągnięcie pierwszych 10 znaków.
> - W Python: `czas[:10]` lub `datetime.strptime(czas, ).date()`.
>
> Reference - Korelowany podzapytanie:
> - Podzapytanie odwołujące się do wartości z głównego zapytania.
> - Np. `(SELECT COUNT(*) FROM komputery k2 WHERE k2.Sekcja = k.Sekcja)`.
> - Wykonywane RAZ na wiersz głównego zapytania (potencjalnie wolne, ale tu mało danych).

## Schemat oceniania CKE

> Klucz CKE (zadanie 6.3, max 3 pkt):
> - **2 pkt** za prawidłową datę (23-12-2015)
> - **1 pkt** za prawidłową sekcję (Q)
> - **0 pkt** - błędne lub brak

## Typowe pułapki

- **Format daty: 2015-12-23 vs 23-12-2015** - CKE oczekuje w formacie z treści (DD-MM-YYYY w odpowiedzi).
- **Liczenie awarii zamiast komputerów** - jeden komputer może mieć WIELE awarii tego samego dnia. Liczymy UNIKALNE komputery (DISTINCT).
- **Pomyłka sekcji** - uważać na pomyłkę z innym dniem (mogło być wiele dni z niemal-pełną awarią sekcji).
- **Tylko COUNT na awariach** - nie wystarczy; trzeba zliczać DISTINCT lub używać set.
- **Pominięcie warunku "wszystkich"** - wymóg to 100% sekcji, nie 99%.

## Złożoność obliczeniowa

- Wczytanie 3 plików: O(K + A + N).
- Agregacja po (data, sekcja): O(A) z hashmapą.
- Sprawdzenie warunku dla każdej grupy: O(S·D) gdzie S = sekcje, D = dni.
- **Łącznie: O(A + K).**

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2018-05/zad/6.3)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2018-05%2Fzad%2F6.3)

## Podobne zadania

- [Zadanie 6.3](https://matura.lol/question/informatyka-2018-maj-matura-rozszerzona-2/zad/6.3) — Kontekst - patrz zadanie 6.1. Pewnego dnia nastąpiła awaria wszystkich komputerów w jednej z sekcji. Podaj datę awarii oraz symbol sekcji, w której nastąpiła aw
- [Zadanie 5.2](https://matura.lol/question/informatyka-2016-maj-matura-stara-podstawowa-2/zad/5.2) — Zadanie 5.2. (2 pkt) Podaj nazwy produktów zakupionych przez klienta Anna Kotnicka, grupy towarowe oraz producentów tych produktów. Poziom podstawowy MIN_2P
- [Zadanie 5.5](https://matura.lol/question/informatyka-2016-czerwiec-matura-rozszerzona-2/zad/5.5) — Zadanie 5.5. (0-2) Podaj imię i nazwisko najmłodszego maturzysty oraz nazwy przedmiotów dodatkowych, które ta osoba wybrała na egzaminie maturalnym.
- [Zadanie 6.1](https://matura.lol/question/informatyka-2015-maj-matura-stara-podstawowa-2/zad/6.1) — Zadanie 6.1. (2 pkt) Podaj imię i nazwisko osoby, której numer konta rozpoczyna się od 49.

_Ostatnia aktualizacja danych: 2026-10-03_
