Matura 2017 (nowa) - zadanie 1 (Prostokąt)

Zadanie 1.1 (2 punkty)

Proste zadanie na rozgrzewkę. Należało wpisać trzy liczby będące polami powierzchni największych prostokątów, mających boki o różnych długościach wybranych ze zbioru A. Pole to ma dodatkowo nie być podzielne przez liczbę pierwszą p. Z tego wynika, że żaden z boków nie może być podzielny przez p i nie ma możliwości aby iloczyn dowolnych dwóch liczb niepodzielnych przez p dał wartość podzielną przez p. W poniższej tabeli przekreśliłem liczby ze zbioru A podzielne przez p. Do obliczenienia wyniku z pozostałych wybieramy dwie największe liczby, których iloczyn daje odpowiedź.

Zbiór A p S - pole szukanego prostokąta
15, 12, 10, 6, 5, 1 5 72 (12 x 6)
6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18 7 216 (18 x 12)
4, 34, 16, 8, 6, 22, 14, 12, 2, 7 2 0

 

Zadanie 1.2 (4 punkty)

W tym zadaniu należy skonstruować algorytm obliczający pole największego prostokąta spełniającego warunki. Dla utrudnienia ograniczono liczbę operacji arytmetycznych, które można użyć. Dodatkowo przy ocenie będzie brana pod uwagę złożoność obliczeniowa.

Algorytm ten można napisać na dwa sposoby. Najprostsza wersja do napisania to mnożenie każdej liczby z każdą, sprawdzanie czy iloczyn nie jest podzielny przez p i szukanie z nich maksa. Jest bardzo prosty a największą trudnością jest nieuwzględnienie dwukrotnie w iloczynie tego samego odcinka. Niestety złożoność tego algorytmu jest taka sobie (kwadratowa), więc na pewno nie można za niego uzyskać maksymalnej liczby punktów.

Lepszym rozwiązaniem jest znalezienie dwóch najdłuższych boków o długości niepodzielnej przez p i zwrócenie ich iloczynu. Algorytm taki ma złożoność liniową. Przykładowym rozwiązaniem może być:

maks1 ← 0

maks2 ← 0

dla i=1 ... n

    jeżeli A[i] mod p ≠ 0

        jeżeli A[i] > maks1

            maks2 ← maks1

            maks1 ← A[i]

        w przeciwnym razie jeżeli A[i] > maks2

            maks2 ← A[i]

zwróć wynik maks1 • maks2

gdzie operacja mod oznacza resztę z dzielenia.

W powyższym rozwiązaniu zmienne maks1 i maks2 oznaczają kolejno najdłuższy i drugi co długości bok niepodzielne przez p. Jeżeli nie ma takich dwóch boków, to przynajmniej jedna z tych zmiennych pozostanie równa 0, dzięki temu ich iloczyn będzie równy 0 i otrzymamy poprawny wynik oznaczający brak prostokąta spełniającego warunki zadania. Nie mam jednak bladego pojęcia jak może nastąpić podział punktów. W tym rozwiązaniu jest kilka niezależnych rzeczy, które warto punktować (bo można zrobić je z błędem):

  • sprawdzanie podzielności przez p
  • znalezienie najdłuższego boku
  • znalezienie drugiego co do długości boku
  • obliczenie pola
  • podanie jako wynik "0" w przypadku braku prostokąta spełniającego warunki zadania
  • złożoność obliczeniowa

Jak w 4 punktach zostanie zmieszczone te 6 czynności - nie wiem. Pewnie jakoś będą pogrupowane. Analizując potencjalne rozwiązanie kwadratowe punkty można przydzielać za:

  • sprawdzanie podzielności przez p
  • znalezienie największego iloczynu
  • podanie jako wynik "0" w przypadku braku prostokąta spełniającego warunki zadania
  • złożoność obliczeniowa - tutaj oczywiście zero, ale za rozwiązanie kwadratowe nie można otrzymać wszystkich punktów

 

Na dzisiaj starczy. Jutro zadanie 2.

Matura 2017 (nowa) - zadanie 2 (Rekurencja)

Zadanie 2.1 (2 punkty)

Mała tabelka do uzupełnienia. Po dokładnej analizie wywołań dla poszczególnych wartości uzupełniamy ją następującymi wynikami:

x licz(x)
11 2
13 2
21 1
32 -4

Można się spodziewać, że na poprawne dwa poprawne wyniki (z trzech do uzupełnienia) będzie można otrzymać jeden punkt. Za jeden poprawny wynik raczej nie można liczyć na jakiekolwiek punkty.

Zadanie 2.2 (2 punkty)

Po krótkiej analizie algorytmu można zobaczyć, że każde wywołanie funkcji licz z argumentem x większym od 1 powoduje kolejne wywołanie z argumentem x/2. Wynika z tego, że sumaryczna liczba wywołań funkcji licz jest równa długości liczby x w zapisie binarnym. Zatem najmniejszą liczbą, która daje dokładnie k wywołań funkcji licz jest liczba, która w zapisie binarnym ma na pierwszej pozycji cyfrę 1 a następnie k-1 cyfr 0, zatem liczba ta jest równa 2k-1. W związku z tym, że zadanie jest punktowane dwoma punktami, być może podobna odpowiedź 2k będzie punktowana jednym punktem. Może być też jednak tak, że ta odpowiedź miała utrudnić wybranie właściwej i jedyne punkty jakie można będzie uzyskać to dwa za poprawną odpowiedź. Jak będzie zobaczymy za kilka tygodni.

Zadanie 2.3 (2 punkty)

W tym zadaniu trzeba było podać najmniejszą liczbę całkowitą większą od 100, dla której wynikiem wywołania funkcji licz(x) będzie 0.Z opowieści znajomych nauczycieli wynika, że w niektórych szkołach każdy wychodzący z egzaminu maturzysta podawał inną znalezioną najmniejszą liczbę.

Z analizy algorytmu wynika, że każdy bit 1 w zapisie bitowym argumentu x zwiększa wynik o 1, zaś każdy bit 0 zmniejsza wynik o 1. Aby wynik był równy 0 liczba x w zapisie bitowym musi mieć parzystą liczbę bitów pomijając wiodące 0. W związku z tym, że liczba ma być większa od 100 i być możliwie najmniejsza to powinna mieć osiem bitów. Najmniejszą taką liczbą jest 10000111|2, czyli 135.

Za zadanie z jednym wynikiem ponownie można otrzymać dwa punkty, zatem należy spodziewać się, że za niektóre błędy będzie można otrzymać 1 punkt. W poleceniu były podane trzy warunki:

  • najmniejsza możliwa
  • większa od 100
  • wynik licz(x) jest równy 0

Pominięcie ostatniego z warunków (wynik 101) wydaje się dyskwalifikować rozwiązanie (nie ma żadnego związku z podaną na wstępie zadania funkcją). Pominięcie drugiego (wynik 2) powoduje szukanie totalnie banalnego rozwiązania. Jedynym pominiętym warunkiem, który nie upraszcza zanadto zadania wydaje się zatem warunek pierwszy. Po jego pominięciu (np. wyniki 139, 170) być może można liczyć na otrzymanie 1 punktu.

Mogę też sobie wyobrazić próbę podania wyniku 102 (w ośmiobitowym zapisie binarnym 01100110|2), jednak w rozumieniu tego algorytmu ta liczba jest jedynie siedmiobitowa i i raczej nie ma możliwości aby w takim przypadku otrzymać za rozwiązanie jakikolwiek punkt.

 

Matura 2017 (nowa) - zadanie 3 (Test)

Zadanie 3.1 (1 punkt)

W tym roku na maturze czekały dwa zadania z analizy zapytania w języku SQL. W pierwszym z nich trzeba było wybrać te zapytania, których wyniki będą zawsze uporządkowane niemalejąco wg pola nazwa.

W teorii baz danych jest jasno napisane, że dane w tabeli nie mają kolejności. Jedynym sposobem osiągnięcia zadanej kolejności jest użycie klauzuli ORDER BY z odpowiednim podaniem porządku sortowania. W związku z tym, że w pytaniu chodziło o bezwarunkowe uporządkowanie wg wartości w kolumnie nazwa, to w zapytaniu słowo nazwa musi wystąpić bezpośrednio po klauzuli ORDER BY.

Poprawne odpowiedzi dadzą więc zapytania 2 i 4, zaś zapytania 1 i 3 mogą dać odpowiedzi błędne. W zapytani 1 wyniki będą posortowane przede wszystkim wg pola wartość, zaś w zapytaniu 3 kolejność odpowiedzi wg teorii baz danych jest przypadkowa (mimo iż niektóre implementacje mogą dane sortować wg pola nazwa).

Podsumowując poprawną odpowiedzią jest FPFP.

Zadanie 3.2 (1 punkt)

W kolejnym zadaniu mamy zapytanie i kilka informacji o możliwej (bądź niemożliwej) odpowiedzi.

Pierwsze zdanie jest fałszywe. Żaden numer PESEL nie pojawi się w wyniku wielokrotnie ponieważ wyniki są grupowane wg tego pola (GROUP BY pesel). Drugie zdanie jest prawdziwe ponieważ z odpowiedzi są wykluczone numery PESEL znajdujące się w w tabeli dokumenty zastrzeżone (WHERE pesel NOT IN (SELECT pesel FROM dokumenty_zastrzezone)). Trzecie zdanie jest prawdziwe ponieważ otrzymamy wynik o dwóch kolumnach (SELECT pesel, COUNT(*)). Zdanie czwarte jest fałszywe, ponieważ w wyniku nie pojawi się żaden wiersz o wartości w drugiej kolumnie równej 1 (HAVING COUNT(*) > 1).

Podsumowując poprawną odpowiedzią jest FPPF.

Zadanie 3.3 (1 punkt)

To zadnie możne być trochę dyskusyjne. W treści zadania jest kilka nie do końca wyjaśnionych kwestii. Ale o tym za chwilę, przy kolejnych zdaniach. Słyszałem kiedyś koncepcję, że każde zdanie ze słowem "może" będzie w teście na maturze z informatyki zdaniem prawdziwym. Rzeczywiście tak jest na ogół. To zadanie jednak przeczy tej teorii.

Pierwsze zdanie jest prawdziwe i chyba nie ma co nad nim dyskutować. W drugim zdaniu kluczowym słowem jest "szybko". Dysponując odpowiednim komputerem wszystko można zrobić szybko. Jednak wygenerowanie podpisu cyfrowego na podstawie klucza publicznego zadaniem do szybkiego wykonania jednak nie jest. Podobnie fałszywe jest kolejne zdanie i z tego samego powodu. Kolejną problematyczną kwestią jest skuteczność rozsyłania listów elektronicznych zawierających podmieniony nagłówek "Od:". Spora część tak spreparowanych maili zostanie usunięta przez serwery pocztowe. Rozsyłać listy elektroniczne z podmienionym nagłówkiem jednak można i jest szansa, że część z nich dotrze do adresatów.

Podsumowując poprawną odpowiedzią jest PFFP.

Matura 2017 (nowa) - zadanie 4 (Słodzik)

Zadanie 4.1 (1 punkt)

Zadanie trochę nietypowe jak na maturalne zadanie do wykonania w arkuszu kalkulacyjnym (w końcu 4.3 ma w poleceniu utwórz wykres). Mamy dwie tabele (faktycznie dwa pliki tekstowe, ale to żadna różnica). No ale tak to jest jak w Excelu ląduje coraz więcej funkcji przetwarzających dane jak w bazie danych (tabele przestawne, sumy pośrednie).

Tak więc w zadaniu 4.1 tworzymy zapytanie, w którym grupujemy wiersze po numerach nip w jednej kolumnie i sumujemy kilogramy w drugiej kolumnie. Dochodzi do tego posortowanie wyników po drugiej z nich i wybranie trzech największych wyników. Ostatecznie otrzymujemy:

zadanie 41

nip zakupiony cukier
254-14-00-156 27505
847-48-41-699 26955
392-78-93-552 26451

W związku z tym, że za zadanie jest 1 punkt, to raczej nie ma możliwości otrzymania czegokolwiek za inny niż powyższy wynik.

Zadanie 4.2 (2 punkty)

W tym zadaniu należało podać łączną cenę bez rabatów sprzedaży cukru przez 10 lat działalności. Można było rozwiązać na dwa sposoby:

  1. policzyć wartość każdej transakcji (łącząc każdy wiersz tabeli cukier z jednym z wierszy tabeli cennik) i następnie zsumować wyniki
  2. zsumować sprzedaż cukru w każdym roku, pomnożyć uzyskane wyniki przez ceny z tabeli cennik i zsumować wynik

Pierwszy sposób łatwiejszy do wykonania w bazie danych, drugi prostszy w arkuszu (szybszy w wykonaniu dla tych co zdecydowali się na rozwiązanie zadania w arkuszu). Niezależnie od wyboru metody uzyskuje się wynik 643 267,07 zł. Za zadanie można uzyskać 2 punkty, ale wynikiem jest jedna liczba. Nie wiem jaki błąd można zrobić aby uzyskać częściowy 1 punkt. Chyba nie będzie możliwości takiej oceny.

Zadanie 4.3 (3 punkty)

W tym zadaniu trzeba stworzyć tabelkę agregującą ilości sprzedanego cukru w poszczególnych latach i na jej podstawie zrobić wykres. Jeżeli w poprzednim zadaniu najpierw zsumowaliśmy sprzedaż w poszczególnych miesiącach a potem liczyliśmy jej wartość to tabelkę już mamy :-) Jeżeli nie to robimy ją teraz. Dla korzystających z baz danych przyda się funkcja year języka SQL. Niezależnie od wyboru metody powinniśmy uzyskać wynik:

rok wielkość sprzedaży
2005 27016
2006 27226
2007 31720
2008 36523
2009 30764
2010 32521
2011 23778
2012 26976
2013 28419
2014 35284

Chwilę później na podstawie powyższej tabeli tworzymy wykres (to już raczej w arkuszu kalkulacyjnym):

Za całe zadanie można mieć trzy punkty. Najprawdopodobniej za tabelkę (dane) 1 punk, zaś za sam wykres 2 punkty (w tym za: typ wykresu, odpowiednie wyskalowanie osi pionowej, dobór danych oraz opis osi/wykresu)

Zadanie 4.4 (3 punkty)

W tym zadaniu dla każdego kupującego trzeba była oddzielnie dla każdej transakcji policzyć ile zakupił łącznie z bieżącą transakcją cukru i odpowiednio policzyć rabat. Następnie zsumować wszystkie rabaty i podać jedną liczbę. Poprawnym wynikiem jest 38 126,35 zł. Niby jedna liczba i jeden poprawny wynik, ale ile możliwości niewielkich pomyłek (i zarazem możliwości przyznania niepełnych punktów):

  • nieuwzględnienie bieżącej transakcji do uwzględniania rabatu
  • policzenie rabatu jako rabatu jednostkowego (bez przemnożenia przez wielkość bieżącej sprzedaży)
  • pomyłka w warunkach ">" zamiast "≥"

Za każdy pojedynczy (z powyższych) błąd można spodziewać się pewnych punktów, ale kilka z nich razem już raczej będą dyskwalifikowały wynik.

Zadanie 4.5 (4 punkty)

Zadanie symulacyjne. Jednak nie powiązane z pozostałymi zadaniami z serii. Przed przystąpieniem do symulacji warto policzyć obrót w każdym miesiącu, wtedy nasza symulacja zamiast kilku tysięcy wierszy będzie miała ich jedynie 120. Jak już mamy przygotowaną tabelkę ze 120 miesiącami z wielkością sprzedaży dostawiamy sobie kolejne kolumny:

  • magazyn na początku miesiąca
  • magazyn po uwzględnieniu bieżącej sprzedaży
  • brak w magazynie do 5 ton
  • zaokrąglenie poprzedniej wartości do pełnych ton w górę (czyli też wielkość dostawy)

Następnie obliczamy ile było dostaw nie mniejszych niż 4000 kg. Poprawnym wynikiem jest 14. Ponownie można popełnić błędy w kilku miejscach:

  • pomyłka w warunkach ">" zamiast "≥"
  • dokupienie cukru gdy nie potrzeba (sierpień 2010) - jak ktoś liczył ile razy dokupiono mniej niż 4t i nie uwzględnił braku zakupu jak kupienia mniej niż 4t
  • niezaokrąglanie zakupu do pełnych ton
  • ...

Tak jak poprzednio punkty będą pewnie przyznane gdy popełni się jeden błąd z powyższych błędów, ale nie liczyłbym na nie przy popełnieniu kilku błędów na raz.

 

Matura 2017 (nowa) - zadanie 5 (Fanka)

Zadanie bazodanowe i tak w większości rozwiązywane. Dane wczytujemy do kilku tabel. Długa treść ułatwia zapomnienie prostego zdania na początku: w plikach zawarte są informacje dotyczące meczy drużyny Galop z Kucykowa. Tak więc nie ma co szukać tej drużyny w tabeli druzyny.txt  :-)

Zadanie 5.1 (3 punkty)

Zadanie składa się z dwóch części. W pierwszej tworzymy zapytanie z dwóch tabel (Drużyny i Wyniki). Grupujemy wyniki wg rodzaju meczu i nazwy miasta. Ograniczamy się do wyników z Kucykowa. Liczymy ile wierszy zostało tak zgrupowanych i otrzymujemy:

zadanie 51a

Rodzaj Liczba
L 113
P 25
T 6

W drugiej części zadania używamy tych samych tabel. Grupujemy wyniki wg roku (funkcja year) i nazwy miasta. Ponownie ograniczamy się do Kucykowa. Liczymy ile wierszy zgrupowano za każdym razem i wybieramy z tych obliczeń największą liczbę. Wynikiem jest 21 meczów w 2007 roku.

 

Rozdzielenie punktów może być różne, ale skłaniałbym się do podziału: 1 punkt za liczby meczów, 1 punkt za rok z największą liczbą meczów i 1 punkt za tą liczbę.

Zadanie 5.2 (2 punkty)

Wbrew pozorom zadanie nie jest łatwe. Najpierw należy policzyć bilans bramek dla każdej z drużyn a następnie wybrać te, z którymi Galop straciła tyle samo bramek co strzeliła. W wyniku otrzymujemy dwie drużyny: Nocne Pumy i Zwinne Mewy. Dwa punkty i dwie drużyny sugerują po jednym punkcie za każdą z nich, ale jakoś trudno mi sobie wyobrazić błędne rozwiązanie znajdujące tylko jedną z tych drużyn.

Zadanie 5.3 (3 punkty)

Trzy punkty i proste zapytanie zrobione z użyciem jednej tabeli. Prostsze są trzy niezależne dla każdego typu wyniku. Ostatecznie otrzymujemy 579 wygranych, 170 zremisowanych i 452 przegranych.

Naturalne wydaje się punktowanie po 1 punkcie za każdą z tych liczb. Biorąc pod uwagę, że najszybciej te wyniki można uzyskać tworząc trzy niezależne zapytania, to istnieje pewne prawdopodobieństwo pomyłki w jednej z nich.

Łatwym miejscem na popełnienie błędu jest też pominięcie jednej z części polecenia (mecze wyjazdowe) i pewnie też będzie można uzyskać za nieuwzględnienie tego warunku jednakowo we wszystkich trzech liczbach (1185, 352, 910), raczej za 1 punkt.

Zadanie 5.4 (3 punkty)

Ponownie zapytanie z użyciem danych z jednej tabeli. Wybieramy z tabeli Wyniki wszystkich sędziów, którzy sędziowali przynajmniej jeden mecz pucharowy. Jest ich 132. Dokładamy do tego wiedzę z tabeli Sędziowie (154 wiersze) i w wyniku otrzymujemy 22 sędziów.

Podobnie jak w poprzednim zadaniu można spodziewać się pominięcia warunku dotyczącym pucharowego meczu i otrzymać 150 sędziów w meczach Galopu Kucykowo (czyli 4 niesędziujących meczów Galopu). Innym błędem jest policzenie 132 sędziujących mecze pucharowe Galopu Kucykowo w stosunku do 150 sędziujących jakiekolwiek mecze Galopu Kucykowo (czyli 18 sędziujących mecze Galopu Kucykowo, ale niesędziujących ich meczów pucharowych).