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()