# Informatyka — zadanie 4.1

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

- arkusz: Informatyka · Matura · maj 2017 (rozszerzona)
- rok: 2017
- poziom: rozszerzona
- typ: open
- punkty: 1
- działy: Programowanie i algorytmika

## Treść

Zadanie 4. Słodzik

Firma Słodzik zajmuje się sprzedażą cukru. W pliku cukier.txt znajdują się 2162 wiersze z danymi dotyczącymi sprzedaży w latach 2005-2014. W każdym wierszu podane są dane opisujące jedną transakcję sprzedaży, oddzielone pojedynczymi znakami tabulacji: data sprzedaży (rrrr-mm-dd), numer NIP klienta (13-znakowy tekst) i ilość sprzedanego cukru w kg (co najwyżej 3-cyfrowa liczba całkowita dodatnia). Transakcje są uporządkowane niemalejąco według daty.

Przykład:
2005-01-01 | 872-13-44-365 | 10
2005-01-04 | 369-43-03-176 | 2

Firma Słodzik ustala cenę sprzedaży w złotych na początku roku. Ustalona cena obowiązuje przez cały rok. W pliku cennik.txt przedstawiono ceny sprzedaży 1 kg cukru ustalone przez firmę Słodzik w latach 2005-2014.

Przykład cennik:
2005 | 2,00
2006 | 2,05
2007 | 2,09

Podaj numery NIP trzech klientów, którzy w całym okresie 2005-2014 kupili łącznie najwięcej cukru. Dla każdego z tych klientów podaj łączną liczbę kilogramów zakupionego przez niego cukru.

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

## Poprawna odpowiedź

| NIP | Łączna liczba kg cukru |
| **254-14-00-156** | **27 505** |
| **847-48-41-699** | **26 955** |
| **392-78-93-552** | **26 451** |

## Sposób 1 - Python (agregacja słownikiem)

```python
from collections import defaultdict

sumy = defaultdict(int)
with open('cukier.txt', encoding='utf-8') as f:
for linia in f:
data, nip, kg = linia.strip().split('\t')
sumy[nip] += int(kg)

# Trzech największych
top3 = sorted(sumy.items(), key=lambda x: -x[1])[:3]
for nip, kg in top3:
print(nip, kg)

Wynik:
254-14-00-156 27505
847-48-41-699 26955
392-78-93-552 26451

## Sposób 2 - SQL

Zakładając, że `cukier.txt` zaimportowano do tabeli `sprzedaz(data, nip, kg)`:

```sql
SELECT nip, SUM(kg) AS suma
FROM sprzedaz
GROUP BY nip
ORDER BY suma DESC
LIMIT 3;

## Sposób 3 - arkusz kalkulacyjny

1. Wczytaj cukier.txt jako 3 kolumny: A (data), B (NIP), C (kg).
2. Pobierz unikalne NIPy w kolumnę E (Data → Usuń duplikaty z B).
3. W F2: `=SUMA.JEŻELI(B:B; E2; C:C)` - łączna suma kg per NIP.
4. Posortuj E:F malejąco po F.
5. Wynik: 3 pierwsze wiersze.

Alternatywnie tabela przestawna: Wiersze = NIP, Wartości = SUMA kg → sortowanie malejące.

## Sposób 4 - Pascal

```pascal
program Slodzik41;
uses sysutils;
var
f: TextFile;
data, nip: string;
kg, i, j, n: LongInt;
nipy: array[1 3000] of string;
sumy: array[1 3000] of LongInt;
found: Boolean;
tmpS: string; tmpL: LongInt;
begin
n := 0;
AssignFile(f, 'cukier.txt');
Reset(f);
while not Eof(f) do
begin
ReadLn(f, data); // czyta cały wiersz, należy sparsować
// [parsowanie split po tabulatorze omijam dla zwięzłości]
// szukaj nip w tablicy; jeśli nie ma - dodaj
end;
CloseFile(f);
// sortuj nipy malejąco po sumy (np. bubble)
// wypisz pierwsze 3
end.

## Reference algorytmiczny - agregacja danych

> Reference - agregacja grupowa (group by):
> - W Python: `collections.defaultdict(int)` lub `collections.Counter` dla zliczeń.
> - W SQL: `GROUP BY + agregat` (SUM, COUNT, AVG).
> - W arkuszu: `SUMA.JEŻELI` lub tabela przestawna.
> - Top-N: sortowanie malejąco i wzięcie pierwszych N.

## Schemat oceniania CKE

> Klucz CKE (zadanie 4.1, max 1 pkt):
> - **1 pkt** - za podanie 3 NIPów Z prawidłowymi sumami kg
> - **0 pkt** - odpowiedź niepełna lub błędna albo brak

## Typowe pułapki

- **Format separatora** - w pliku separator to **tabulacja (\t)**, nie spacja czy przecinek. W Python `split('\t')`.
- **Kolejność sortowania** - sortuj malejąco po sumie kg, nie po NIP.
- **Konwersja liczby kg** - kg to liczba całkowita, użyj `int(kg)` lub `parseInt`.
- **Klucz CKE może mieć inny porządek** - kolejność trzech klientów w odpowiedzi może się różnić, ale wszystkie 3 NIPy i wartości muszą być poprawne.

## Złożoność obliczeniowa

- Pojedyncze przejście pliku + agregacja w słowniku: **O(n)**, gdzie n = liczba transakcji (2162).
- Sortowanie unikalnych NIPów: O(k log k), gdzie k = liczba unikalnych klientów.

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2017-05/zad/4.1)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2017-05%2Fzad%2F4.1)

## Podobne zadania

- [Zadanie 2](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/2) — Zadanie 2. Zapis symboliczny W pliku symbole.txt zapisano 2000 napisów. Każdy z nich jest zapisany w osobnym wierszu i składa się z dokładnie 12 znaków spośród:
- [Zadanie 7](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/7) — Zadanie 7. Poszukiwanie wody na Marsie W trzech plikach tekstowych o nazwach laziki.txt, obszary.txt, pomiary.txt zapisano informacje zawierające dane o poszuki
- [Zadanie 3](https://matura.lol/question/informatyka-2023-maj-matura-rozszerzona/zad/3) — Zadanie 3. Liczba Pi Pewien matematyk jest zafascynowany liczbą π ≈ 3,14159265 do tego stopnia, że zapisał jej rozwinięcie dziesiętne z dokładnością do 10 000 c
- [Zadanie 3](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/3) — Zadanie 3. Dron Tor lotu pewnego drona składa się z prostych odcinków. Lot rozpoczyna się w punkcie (0, 0), a kończy w punkcie (20000, 0). Dron poza startem i l

_Ostatnia aktualizacja danych: 2026-10-03_
