Każdy maturzysta przygotowujący się do egzaminu z informatyki prędzej czy później napotyka na problem, który może wywołać niemałe zamieszanie. W zadaniach algorytmicznych, które są stałym elementem arkuszy maturalnych, często mamy do czynienia z tablicami i napisami. I właśnie tutaj pojawia się kłopotliwa rozbieżność między specyfikacją zadań a rzeczywistością języków programowania.
W specyfikacjach zadań maturalnych regularnie spotykamy zapis wskazujący, że tablice czy napisy wejściowe powinny być indeksowane od 1 do n, gdzie n oznacza liczbę elementów.
Weźmy prosty przykład: jeśli mamy napis "Mama", to zgodnie ze specyfikacją pierwsze "M" znajduje się na indeksie 1, drugie "a" na indeksie 2, a ostatnie "a" na indeksie 4.
Brzmi logicznie, prawda? Problem w tym, że w językach programowania dostępnych na maturze – C++, Java i Python – domyślnie indeksuje się tablice i napisy od 0 do n-1. W tych językach dla tego samego napisu "Mama" pierwsze "M" znajduje się na indeksie 0, drugie "a" na indeksie 1, a ostatnie "a" na indeksie 3.
Ta rozbieżność rodzi fundamentalne pytanie: czy rozwiązując zadanie maturalne należy indeksować zgodnie ze specyfikacją (od 1), czy wykorzystać naturalną konwencję języka programowania (od 0)? A może jeszcze ważniejsze: czy niezgodność z zapisem w specyfikacji może skutkować utratą punktów?
Przyjrzyjmy się konkretnemu przykładowi z matury z czerwca 2023 roku.
W zadaniu 2.3 znalazł się zapis: "Dana jest dodatnia liczba całkowita n oraz słowo s[1...n]". Notacja 1...n jednoznacznie wskazuje na indeksowanie od 1, ale przecież w językach programowania słowa mają indeksy od 0.
Aby dostosować się do specyfikacji w języku programowania, maturzysta musiałby:
1. Stworzyć tablicę o jeden element większą – co rodzi pytanie, co zrobić z niewykorzystanym elementem na indeksie 0?
2. W przypadku napisów dodać pusty znak na początku – co wydaje się całkowicie sztuczne i niepotrzebnie komplikuje kod.
Gdyby w arkuszach było wszędzie napisane, że indeksujemy od 0 do n-1, problemu w ogóle by nie było. To tym bardziej dziwne, że na maturze mamy dostępne właśnie te trzy języki, które naturalnie indeksują od zera.
Dotychczas zalecaliśmy uczniom "sztuczne" indeksowanie od 1, traktując to jako bezpieczniejszą opcję. Argumentowaliśmy, że zgodność ze specyfikacją chroni przed ewentualnymi zarzutami egzaminatora, który mógłby uznać indeksowanie od 0 za niedostosowanie się do wymagań zadania.
Postanowiliśmy zapytać Centralną Komisję Egzaminacyjną o oficjalne stanowisko w tej sprawie. Napisaliśmy następującą wiadomość:
"W specyfikacjach wielu zadań maturalnych (przykładowo zadanie 2.3 z czerwca 2023 r.) tablice są opisywane z użyciem indeksów od 1 do n (np. s[1...n], T[1...n]).
W przypadku implementacji rozwiązania w językach programowania, takich jak Python, C++ czy Java, standardowo stosowane jest indeksowanie od 0.
W związku z tym nasuwają się następujące pytania:
Dodatkowo, jeżeli dysponują Państwo takimi informacjami, ciekawi nas również powód stosowania indeksowania tablic od jedynki zamiast od zera w treściach zadań maturalnych."
Odpowiedź CKE okazała się zaskakująca:
"Zdający powinien napisać rozwiązanie zgodne ze specyfikacją. Jeśli użyto pseudokodu nie ma problemu indeksowania tablic. W przypadku języków programowania można wykorzystać obydwa podejścia takie jak: zastosować tablicę o 1 większą, aby korzystać z indeksów od 1 do n, albo n-elementową tablicę i korzystać z indeksów od 0 do n-1, należy jednak pamiętać, aby wyniki były zgodne ze specyfikacją."
Sprzeczność w odpowiedzi
Zauważcie paradoks: CKE stwierdza, że "zdający powinien napisać rozwiązanie zgodne ze specyfikacją", a jednocześnie akceptuje oba podejścia do indeksowania. Jeśli w specyfikacji jasno napisano o indeksowaniu od 1 do n, to jak może być akceptowalne indeksowanie od 0?
Ta odpowiedź budzi więcej wątpliwości niż rozwiewa:
Od ponad 15 lat na maturze z informatyki występuje indeksowanie od 1 do n. Rozwiązaniem wszystkich problemów byłaby zmiana tej konwencji na indeksowanie od 0 do n-1. Taka modyfikacja:
Aktualne podejście CKE generuje dwa poważne problemy:
Po pierwsze, utrudnia życie maturzystom. Jeśli zdający chce postępować zgodnie ze specyfikacją, musi tworzyć tablice o jeden element większe, co zwiększa ryzyko pomyłek algorytmicznych i utraty punktów.
Po drugie, podważa wiarygodność systemu. Tworzone są zadania ze specyfikacją niezgodną z dozwolonymi językami programowania, a następnie informuje się, że rozwiązanie musi być zgodne ze specyfikacją, jednocześnie akceptując rozwiązania z nią niezgodne.
Sytuacja z indeksowaniem tablic na maturze z informatyki wymaga interwencji. Obecny stan rzeczy wprowadza niepotrzebne zamieszanie, utrudnia przygotowania uczniów i podważa spójność systemu egzaminacyjnego.
Liczymy na to, że CKE przemyśli tę kwestię i wprowadzi jednoznaczne zmiany w przyszłych arkuszach maturalnych. Przejście na indeksowanie od 0 do n-1 rozwiązałoby wszystkie opisane problemy i dostosowałoby specyfikacje do rzeczywistości programistycznej.
Do tego czasu pozostaje nam instruować uczniów o dwuznaczności sytuacji i przygotowywać ich na oba scenariusze – choć nie powinno tak być w przypadku egzaminu państwowego.