Arkusz pokazowy 2023: Zadanie 1 – Szachy
Arkusz i pliki wymieniane w tym zadaniu można pobrać ze strony CKE.
Bezpośredni link do plików znajduje się tutaj.
Zadanie
Uwaga: do rozwiązania zadań 1.1.–1.3. nie jest potrzebna znajomość reguł gry w szachy. W pliku szachy.txt znajduje się zapis partii szachów, jaką w 2020 roku rozegrali polski arcymistrz Jan Krzysztof Duda oraz mistrz świata Magnus Carlssen. Zapis partii składa się z opisów 125 plansz przedstawiających stany gry (położenie bierek na szachownicy) po kolejnych posunięciach każdego z graczy. Opis każdej planszy składa się z:
- 8 wierszy tekstu po 8 znaków w każdym wierszu
- kolejne znaki w wierszach oznaczają:
- znak ‘.’ – puste pole
- wielkie litery – białe bierki (czyli białe figury i pionki)
- małe litery – czarne bierki
- oznaczenia bierek to:
K/k – król, W/w – wieża, S/s – skoczek, | H/h – hetman, G/g – goniec, P/p – pionek. |
Dla zachowania czytelności, po każdym opisie następuje pojedynczy pusty wiersz. W dalszej
części, zamiast „opis planszy”, będziemy pisać krótko „plansza”.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | wsghkgsw pppppppp ........ ........ ....P... ........ PPPP.PPP WSGHKGSW wsghkgsw pp.ppppp ..p..... ........ ....P... ........ PPPP.PPP WSGHKGSW |
Dwie podane wyżej przykładowe plansze odpowiadają następującym stanom gry:
Napisz program(-y), który(-e) znajdzie(-dą) odpowiedzi do poniższych zadań. Do Twojej dyspozycji jest plik szachy_przyklad.txt, który zawiera 9 plansz zapisanych w podanym wyżej formacie. Odpowiedzi dla pliku szachy_przyklad.txt podano w treści poszczególnych zadań. Pamiętaj, że Twój(-e) program(-y) musi(-szą) działać dla 125 plansz.
Zadanie 1.1 (0-3)
Podaj, na ilu planszach znajduje się przynajmniej jedna pusta kolumna, czyli taka, na polach, której nie stoi żadna bierka. Podaj także największą liczbę pustych kolumn na jednej z tych plansz.
Odpowiedź dla pliku szachy_przyklad.txt: 7 5
(7 plansz z pustymi kolumnami, największa liczba pustych kolumn na planszy – 5).
Do oceny oddajesz:
- plik zadanie1_1.txt zawierający odpowiedź do zadania (dwie liczby oddzielone spacją – liczba plansz z pustymi kolumnami oraz największa liczba pustych kolumn na planszy)
- plik(-i) z komputerową realizacją zadania (kodem programu) o nazwie (nazwach)
………………………………….
Rozwiązanie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #Wczytujemy plik plik = open('szachy.txt', 'r') lista = plik.readlines() plik.close() #Usuwanie znaków niedrukowanych z listy lista_new = [i.rstrip('\n') for i in lista] #Funkcja sprawdzająca liczbę pustych kolumn na jednej planszy def pusteKolumny(lista): count = 0 for i in range(8): #Chodzenie po wierszach pusta = True for j in range(8): #Chodzenie po kolumnach if lista[j][i] != ".": pusta = False break if pusta == True: count += 1 return count #Tworzenie listy, której każdy element to plansza (8 list) plansze = [] tmp = [] k = 1 for i in lista_new: if i != "": tmp.append(i) k += 1 if k == 9: plansze.append(tmp) tmp = [] k = 1 #Wyznaczanie liczby plansz z pustymi kolumnami (total) #oraz największej liczby pustych kolumn na planszy (max) max = 0 total = 0 for i in plansze: if pusteKolumny(i) != 0: total += 1 if pusteKolumny(i) > max: max = pusteKolumny(i) wynik = str(total) + " " + str(max) #Zapisywanie odpowiedzi do pliku plik = open('zadanie1_1.txt', 'w') plik.write(str(wynik)) plik.close() |
Zadanie 1.2 (0-3)
Rozstrzygnij, ile razy w trakcie gry (inaczej: na ilu planszach zapisanych w pliku szachy.txt) nastąpiła sytuacja, w której jest równowaga – jest tyle samo i takich samych czarnych bierek, ile białych. Podaj liczbę takich plansz, a także najmniejszą liczbę bierek (łącznie białych i czarnych) na planszy w stanie równowagi.
Przykład:
1 2 3 4 5 6 7 8 9 | A: .k...... ........ ........ ....s... ....S... ........ ........ .......K |
1 2 3 4 5 6 7 8 9 | B: .p...... ........ ........ ....s... ....S... ........ ........ .......K |
Plansza A jest w równowadze, a plansza B nie jest w równowadze (czarne i białe nie mają takich samych bierek).
Odpowiedź dla pliku szachy_przyklad.txt: 6 4
(6 plansz w równowadze, 4 – najmniejsza liczba bierek na planszy w stanie równowagi)
Do oceny oddajesz:
- plik zadanie1_2.txt zawierający odpowiedź do zadania (dwie liczby oddzielone spacją – liczba plansz w stanie równowagi oraz najmniejsza liczba bierek na planszy w stanie równowagi)
- plik(-i) z komputerową realizacją zadania (kodem programu) o nazwie (nazwach)
………………………………….
Rozwiązanie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #Wczytujemy plik plik = open('szachy.txt', 'r') lista = plik.readlines() plik.close() lista_new = [i.rstrip('\n') for i in lista] #Tworzenie listy, gdzie każdy element to plansza plansze = [] tmp = [] k = 1 for i in lista_new: if i != "": tmp.append(i) k += 1 if k == 9: plansze.append(''.join(tmp)) #Zapisanie planszy do listy jako pojedynczy string tmp = [] k = 1 bierki = ['k', 'h', 'w', 'g', 's', 'p'] count = 0 min = 16 #Minimalna liczba bierek w pesymistycznym układzie for i in plansze: rownowaga = True for b in bierki: #Porównywanie liczebności bierek czarnych i białych if i.count(b) != i.count(b.upper()): rownowaga = False break if rownowaga == True: #Liczenie plansz w równowadze count += 1 licznik_rownowagi = 0 #Jeśli plansza jest w równowadze, to liczymy w niej bierki #i ustalamy minimum 'na teraz' for j in i: if j != '.': licznik_rownowagi += 1 if licznik_rownowagi < min: min = licznik_rownowagi #Zapisywanie odpowiedzi do pliku wynik = str(count) + ' ' + str(licznik_rownowagi) plik = open('zadanie1_2.txt', 'w') plik.write(str(wynik)) plik.close() |
Zadanie 1.3 (0-4)
Wieża szachuje króla przeciwnego gracza, jeśli znajduje się w tym samym wierszu lub w tej samej kolumnie co król i pomiędzy nimi nie ma żadnej innej bierki.
Oblicz i podaj, na ilu planszach biała wieża szachuje czarnego króla oraz na ilu planszach
czarna wieża szachuje białego króla.
Odpowiedź dla pliku szachy_przyklad.txt: 2 0
(2 razy biała wieża szachuje czarnego króla, 0 razy czarna wieża szachuje białego króla).
Do oceny oddajesz:
- plik zadanie1_3.txt zawierający odpowiedź do zadania (dwie liczby oddzielone spacją – liczba plansz, na których biała wieża szachuje czarnego króla, i liczba plansz, na których czarna wieża szachuje białego króla)
- plik(-i) z komputerową realizacją zadania (kodem programu) o nazwie (nazwach)
………………………………….
Rozwiązanie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #Wczytujemy plik plik = open('szachy.txt', 'r') lista = plik.readlines() plik.close() lista_new = [i.rstrip('\n') for i in lista] #Sprawdzanie czy czarne szachują #w kolumnie lub wierszu (lista) def czy_czarny_szach(lista): if 'w' in lista: a = lista.index('w') b = lista.index('K') test = lista[min(a, b) + 1 : max(a, b)] if set(test) == {'.'} or len(test) == 0: return True else: return False return False #Sprawdzanie czy białe szachują #w kolumnie lub wierszu (lista) def czy_bialy_szach(lista): if 'W' in lista: a = lista.index('W') b = lista.index('k') test = lista[min(a, b) + 1: max(a, b)] if set(test) == {'.'} or len(test) == 0: return True else: return False return False #Podział listy z pliku na osobne plansze plansze = [] tmp = [] k = 1 for i in lista_new: if i != "": tmp.append(i) k += 1 if k == 9: plansze.append(''.join(tmp)) #Zapisanie planszy do listy jako pojedynczy string tmp = [] k = 1 #Liczenie czarnych szachów na podstawie pozycji króla czarne_szachy = 0 for i in plansze: bialy_krol = i.index('K') bialy_krol_pozycja = (bialy_krol % 8, bialy_krol // 8) kolumna = [] wiersz = [] for j in range(8): kolumna.append(i[bialy_krol_pozycja[0] + 8 * j]) wiersz.append(i[8 * bialy_krol_pozycja[1] + j]) if czy_czarny_szach(kolumna) == True or czy_czarny_szach(wiersz) == True: czarne_szachy += 1 #Liczenie bialych szachów na podstawie pozycji króla biale_szachy = 0 for i in plansze: czarny_krol = i.index('k') czarny_krol_pozycja = (czarny_krol % 8, czarny_krol // 8) kolumna = [] wiersz = [] for j in range(8): kolumna.append(i[czarny_krol_pozycja[0] + 8 * j]) wiersz.append(i[8 * czarny_krol_pozycja[1] + j]) if czy_bialy_szach(kolumna) == True or czy_bialy_szach(wiersz) == True: biale_szachy += 1 #Zapisywanie wyników do pliku wynik = str(biale_szachy) + ' ' + str(czarne_szachy) plik = open('zadanie1_3.txt', 'w') plik.write(str(wynik)) plik.close() |