# Informatyka — zadanie 6.2

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2017-05/zad/6.2
> 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: 2
- działy: Programowanie i algorytmika

## Treść

Kontekst - patrz zadanie 6.1.

Podaj, ile wynosi najmniejsza liczba wierszy, które należy usunąć, żeby obraz miał pionową oś symetrii. Obraz ma pionową oś symetrii, jeśli w każdym wierszu i-ty piksel od lewej strony przyjmuje tę samą wartość, co i-ty piksel od prawej strony, dla dowolnego 1 ≤ i ≤ 320.

Dla danych z pliku przyklad.txt wynikiem jest 3.

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

## Poprawna odpowiedź

**Najmniejsza liczba wierszy do usunięcia: 149** (z 200 wierszy w `dane.txt`).

Dla `przyklad.txt`: 3.

Interpretacja: obraz będzie miał pionową oś symetrii, jeśli zostawimy tylko te wiersze, które SAMODZIELNIE są palindromami (czytane od lewej = od prawej). Wystarczy zliczyć wiersze NIE-palindromowe - te trzeba usunąć.

Pionowa oś symetrii działa NIEZALEŻNIE w każdym wierszu - wiersz jest "symetryczny", gdy A[k] = A[321-k] dla k = 1 160 (lub równoważnie [0 159] przy indeksowaniu od 0).

## Sposób 1 - Python (najczystszy)

```python
usuwajacych = 0
with open('dane.txt') as f:
for linia in f:
wiersz = linia.split() # 320 stringow
# Sprawdz palindrom
if wiersz != wiersz[::-1]:
usuwajacych += 1

print(usuwajacych) # 149

Lub jedno-linijkowo:
```python
with open('dane.txt') as f:
print(sum(1 for l in f if (w := l.split()) != w[::-1]))

## Sposób 2 - C++

```cpp
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main() {
ifstream plik("dane.txt");
int do_usuniecia = 0;
string linia;
while (getline(plik, linia)) {
vector<int> w;
size_t pos = 0, next;
// Parsuj liczby z linii
while ((next = linia.find(' ', pos)) != string::npos) {
w.push_back(stoi(linia.substr(pos, next - pos)));
pos = next + 1;
}
if (pos < linia.size()) w.push_back(stoi(linia.substr(pos)));
// Sprawdz palindrom
bool palindrom = true;
int n = w.size();
for (int i = 0; i < n / 2; i++) {
if (w[i] != w[n - 1 - i]) { palindrom = false; break; }
}
if (!palindrom) do_usuniecia++;
}
cout << do_usuniecia << endl; // 149
return 0;
}

## Sposób 3 - Pascal

```pascal
program OsSymetrii;
var
f: TextFile;
wiersz: array[1 320] of Integer;
i, j, n: Integer;
do_usuniecia: Integer;
palindrom: Boolean;
begin
AssignFile(f, 'dane.txt');
Reset(f);
do_usuniecia := 0;
for i := 1 to 200 do
begin
for j := 1 to 320 do Read(f, wiersz[j]);
Readln(f);
palindrom := True;
for j := 1 to 160 do
if wiersz[j] <> wiersz[321 - j] then
begin
palindrom := False;
Break;
end;
if not palindrom then Inc(do_usuniecia);
end;
CloseFile(f);
Writeln(do_usuniecia); // 149
end.

## Reference algorytmiczny - sprawdzanie palindromu

> Reference - palindromiczność wiersza:
> - Wiersz jest palindromem ⇔ wiersz[i] = wiersz[n-1-i] dla każdego i ∈ [0, n/2).
> - Złożoność: O(n/2) = O(n) na wiersz.
> - W Pythonie najprościej: `wiersz == wiersz[::-1]` (operator slice odwracający listę).
> - Dla 200 wierszy × 320 pikseli: łącznie 200 × 160 = 32 000 porównań. Szybko.

## Schemat oceniania CKE

> Klucz CKE (zadanie 6.2, max 2 pkt):
> - **2 pkt** - prawidłowa odpowiedź: **149**.
> - **0 pkt** - odpowiedź błędna lub brak.
> - **UWAGA:** Nie przyznaje się 1 pkt.

## Typowe pułapki

- **Mylenie sensu pionowej osi symetrii** - to symetria LEWO-PRAWO (kolumna i = kolumna 321-i), a nie góra-dół.
- **"Najmniejsza liczba wierszy do usunięcia"** - to po prostu liczba wierszy NIE-palindromowych (każdy taki MUSI być usunięty, palindromowe MOGĄ zostać).
- **Indeksowanie 1 320 vs 0 319** - w Python od 0, w pseudokodzie CKE od 1. `wiersz[i] vs wiersz[321-i]` jeśli indeksujemy od 1, a `wiersz[i] vs wiersz[319-i]` od 0.
- **Tylko połowa porównań wystarczy** - sprawdzaj `i` od 0 do n/2-1 (lub do n//2). Sprawdzanie wszystkich par jest podwójną pracą.
- **Pomylenie z liczbą wierszy POZOSTAŁYCH** - pytanie o USUNIĘTE (149), nie zachowane (51 = 200 - 149).

## Złożoność obliczeniowa

- Wczytanie: O(n × m) = O(64 000).
- Sprawdzenie palindromu per wiersz: O(m/2) = O(160) = O(m).
- **Całkowita: O(n × m) = O(64 000)**, liniowa względem rozmiaru obrazu.

## Linki

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

## 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_
