Wpis z serii „Matura z Informatyki w języku python”. W tym materiale pokażemy rozwiązania do zadań z matury z roku 2021. Przeanalizujemy treść zadania 4 oraz rozwiązania krok po kroku.
Wstęp do zadań z matury z Informatyki 2021 w języku Python
Zadania z matury z Informatyki z 2021 roku można znaleźć pod tym linkiem. Będzie to część 2 matury, która skupia się na części programistycznej.
Zadanie 4 – Neon cyfrowy
Pewna firma przygotowuje wyświetlanie napisów złożonych z wielkich liter alfabetu
angielskiego. Na początku napis jest pusty (nie zawiera liter). W pliku instrukcje.txt
podanych jest 2000 instrukcji, które wykonuje automat do generowania napisu. Każda
z instrukcji składa się z polecenia, spacji oraz pojedynczego znaku. Polecenia są czterech
rodzajów:
DOPISZ litera – oznacza, że na końcu napisu trzeba dopisać pojedynczą literę;
ZMIEN litera – oznacza, że ostatnią literę aktualnego napisu należy zmienić na podaną literę (możesz założyć, że napis jest niepusty);
USUN 1 – oznacza, że należy usunąć ostatnią literę aktualnego napisu (możesz założyć, że napis jest niepusty);
PRZESUN litera – oznacza, że pierwsze od lewej wystąpienie podanej litery w napisie należy zamienić na następną literę w alfabecie (jeśli litera to A, to należy zamienić na B, jeśli B, to na C itd.) Literę Z należy zamienić na A. Jeśli litera nie występuje w napisie, nie należy nic robić.
Przykład:
Dany jest następujący ciąg instrukcji:
DOPISZ A
DOPISZ B
DOPISZ C
USUN 1
DOPISZ D
ZMIEN B
DOPISZ E
PRZESUN B
Po wykonaniu pierwszych trzech instrukcji napis będzie miał postać ABC, potem AB, ABD,
ABB, ABBE, wreszcie ostatnia instrukcja zamieni pierwsze B na C, więc ostatecznie powstały
napis to ACBE.
Napisz program (lub kilka programów), który(-e) znajdzie(-dą) odpowiedzi na poniższe
pytania. Każdą odpowiedź zapisz w pliku wyniki4.txt i poprzedź ją numerem
oznaczającym zadanie.
Do dyspozycji masz również plik przyklad.txt, w którym znajduje się tylko 20 instrukcji –
odpowiedzi dla tego pliku podane są w treściach zadań, możesz więc sprawdzać na nim
działanie swojego programu. Pamiętaj, że Twój program musi ostatecznie działać dla 2000
instrukcji.
Zadanie 4.1
Oblicz całkowitą długość napisu po wykonaniu wszystkich instrukcji z pliku
instrukcje.txt.
Dla pliku przyklad.txt długością napisu jest liczba 10
Rozwiązania
Z opisu zadania widzimy, że jedyne dwie instrukcje, które powodują zmianę długości napisu to instrukcja DOPISZ oraz USUŃ. Pozostałem dwie jedynie edytują już istniejący wpis. Stąd wystarczy, że policzymy jedynie ilość występowania tych dwóch instrukcji.
def zadanie_4_1(wejscie): wynik = 0 for item in wejscie: krok = item.split()[0] if krok == 'DOPISZ': wynik+=1 if krok == 'USUN': wynik-=1 if krok == 'ZMIEN': pass if krok == 'PRZESUN': pass return wynik
Dla potwierdzenia wykonajmy tę funkcję dla przykładu podanego w zadaniu:
instrukcje_przyklad = [] with open('DANE_2105/przyklad.txt') as f: for wiersz in f: wiersz= wiersz.strip() instrukcje_przyklad.append(wiersz) zadanie_4_1(instrukcje_przyklad)
Jak widać udało nam się potwierdzić działanie naszego rozwiązania na przykładzie. Teraz wczytując plik tekstowy załączony do egzaminu, możemy znaleźć ostateczną odpowiedź.
instrukcje = [] with open('DANE_2105/instrukcje.txt') as f: for wiersz in f: wiersz= wiersz.strip() instrukcje.append(wiersz) zadanie_4_1(instrukcje)
Zadanie 4.2
Znajdź najdłuższy ciąg występujących kolejno po sobie instrukcji tego samego rodzaju. Jako
odpowiedź podaj rodzaj instrukcji oraz długość tego ciągu. Istnieje tylko jeden taki ciąg.
Dla pliku przyklad.txt odpowiedzią jest: rodzaj instrukcji – DOPISZ, długość ciągu – 5.
Rozwiązanie
Szukając najdłuższego ciągu występujących kolejno instrukcji musimy pamiętać ostatni najdłuższy oraz liczyć ostatnio występujący stąd rozwiązanie może wyglądać następująco:
def zadanie_4_2(wejscie): best = ['Start',0] poprzedni = 'Start' dlugosc = 0 for idx,item in enumerate(wejscie): krok = item.split()[0] if krok == poprzedni: dlugosc+=1 else: if dlugosc > best[1]: best[0]=wejscie[idx-1].split()[0] best[1]=dlugosc poprzedni = krok dlugosc = 1 return best
przechodzimy przez kolejne kroki instrukcji, jeśli krok jest taki sam jak poprzedni zwiększami licznik o 1, jeśli nie to znaczy, że skończył się ciąg instrukcji, więc sprawdzamy czy nowa długość jest większa od najlepszej do tej pory i jeśli tak to zapisujemy to w naszej liście best. Jako, że sprawdzamy już kolejną instrukcje która złamała ciąg dodać należy wartość z poprzedniego indexu stąd wejscie[idx -1]. Po czym resetujemy poprzedni krok oraz długość dla nowego ciągu.
Zostaje nam sprawdzenie na przykładzie i rzeczywiście dostajemy wartość [DOPISZ, 5]
zadanie_4_2(instrukcje_przyklad) zadanie_4_2(instrukcje) Dostajemy kolejno wynik: [DOPISZ, 5] oraz [ZMIEN, 7]
Zadanie 4.3
Oblicz, która litera jest najczęściej dopisywana (najczęściej występuje w instrukcji DOPISZ).
Podaj tę literę oraz ile razy jest dopisywana. Istnieje tylko jedna taka litera.
Dla pliku przyklad.txt odpowiedzią jest litera U, dopisywana 3 razy.
Rozwiązanie
Będziemy tutaj korzystać tylko z analizy kroku DOPISZ. Jeśli wiemy, że będziemy zliczać konkretne obiekty ale nie wiemy ile ich będzie, wtedy często warto skorzystać z właściwości słownika. Stworzymy sobie słownik litery, do którego będziemy dodawać kolejno występujące litery, a jeśli jakaś już w nim istnieje to zwiększać jej wartość o 1. Na końcu zostanie nam jedynie wyfiltrowanie najwyższej wartości.
def zadanie_4_3(wejscie): litery = {} for item in wejscie: krok = item.split() if krok[0] == 'DOPISZ': if krok[1] in litery.keys() : litery[krok[1]]=litery[krok[1]]+1 else: litery[krok[1]]=1 wynik = max(litery, key=litery.get) return wynik,litery[wynik]
Zostaje nam sprawdzenie wyniku przez wywołanie kolejno funkcji dla przykładu i części głównej.
zadanie_4_3(instrukcje_przyklad) zadanie_4_3(instrukcje) otrzymujemy kolejno wartości: ('U', 3) dla przykłady oraz ('Z' , 37) dla części głównej
Zadanie 4.4
Podaj napis, który powstanie po wykonaniu wszystkich instrukcji z pliku instrukcje.txt.
Dla pliku przyklad.txt wynikiem jest napis ALANTURING.
Rozwiązanie
Ostatnie zadanie, bierze pod uwagę wykonanie wszystkich kroków z instrukcji i otrzymanie ostatecznej wiadomości. Analizując czynności jakie należy wykonać widzimy, że każde z nich w łatwy sposób może być zaimplementowane korzystając z właściwości listy. Gdzie DOPISZ będzie równe czynności append(), USUN równe czynności na przykład pop(), ZMIEN będzie równe po prostu zmianie wartości dla indexu -1, a PRZESUN znalezieniem litery korzystając z funkcji index(), oraz podmienienie tej litery na nową. Zwrócimy listę jako tekst korzystając z funkcji join.
Aby znaleźć kolejną literę alfabetu dla instrukcji ZMIEN, również skorzystamy z funkcji index po czym weźmiemy wartość z kolejnego indexu ze stringu alfabet. Dodatkowo zabezpieczymy się na wypadek gdyby zamienić trzeba było Z.
def zadanie_4_4(wejscie): slowo = [] alfabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for item in wejscie: krok = item.split() if krok[0] == 'DOPISZ': slowo.append(krok[1]) if krok[0] == 'USUN': slowo.pop() if krok[0] == 'ZMIEN': slowo[-1]=krok[1] if krok[0] == 'PRZESUN': idx = slowo.index(krok[1]) if krok[1]=='Z': slowo[idx]='A' else: slowo[idx] = alfabet[alfabet.index(slowo[idx])+1] return ''.join(slowo)
Ostatecznie otrzymamy w wyniku dla przykłady oraz części głównej:
zadanie_4_4(instrukcje_przyklad) zadanie_4_4(instrukcje) w wyniku odpowiednio: 'ALANTURING' oraz 'POZNIEJMOWIONOZECZLOWIEKTENNADSZEDLODPOLNOCYODBRAMYPOWROZNICZEJSZEDLPIESZOAOBJUCZONEGOKONIAPROWADZILZAUZDEBYLOPOZNEPOPOLUDNIEIKRAMYPOWROZNIKOWIRYMARZYBYLYJUZZAMKNIETEAULICZKAPUSTABYLOCIEPLOACZLOWIEKTENMIALNASOBIECZARNYPLASZCZNARZUCONYNARAMIONAZWRACALUWAGEZATRZYMALSIEPRZEDGOSPODASTARYNARAKORTPOSTALCHWILEPOSLUCHALGWARUGLOSOWGOSPODAJAKZWYKLEOTEJPORZEBYLAPELNALUDZINIEZNAJOMYNIEWSZEDLDOSTAREGONARAKORTUPOCIAGNALKONIADALEJWDOLULICZKITAMBYLADRUGAKARCZMAMNIEJSZANAZYWALASIEPODLISEMTUBYLOPUSTOKARCZMANIEMIALANAJLEPSZEJSLAWY'
Polecam sprawdzić swój wynik porównując swój wynik ze stringiem załączonym.
Podsumowanie
Wyniki każdego z zadań na maturze należy podać w postaci pliku wynik4.txt który ostatecznie powinien wyglądać tak:
1 517 2 'ZMIEN', 7 3 'Z', 37 4 'POZNIEJMOWIONOZECZLOWIEKTENNADSZEDLODPOLNOCYODBRAMYPOWROZNICZEJSZEDLPIESZOAOBJUCZONEGOKONIAPROWADZILZAUZDEBYLOPOZNEPOPOLUDNIEIKRAMYPOWROZNIKOWIRYMARZYBYLYJUZZAMKNIETEAULICZKAPUSTABYLOCIEPLOACZLOWIEKTENMIALNASOBIECZARNYPLASZCZNARZUCONYNARAMIONAZWRACALUWAGEZATRZYMALSIEPRZEDGOSPODASTARYNARAKORTPOSTALCHWILEPOSLUCHALGWARUGLOSOWGOSPODAJAKZWYKLEOTEJPORZEBYLAPELNALUDZINIEZNAJOMYNIEWSZEDLDOSTAREGONARAKORTUPOCIAGNALKONIADALEJWDOLULICZKITAMBYLADRUGAKARCZMAMNIEJSZANAZYWALASIEPODLISEMTUBYLOPUSTOKARCZMANIEMIALANAJLEPSZEJSLAWY'
Kolejen zadanie 5 znajdziecie tutaj