Zadanie 4. Pary W pliku pary.txt znajduje się 100 wierszy. Każdy wiersz zawiera parę danych składającą się z liczby całkowitej z przedziału od 3 do 100 i słowa (ciągu znaków) złożonego z małych liter alfabetu angielskiego o długości od 1 do 50 znaków. Liczba i słowo są oddzielone znakiem spacji. Napisz program(-my), dający(-e) odpowiedzi do poniższych zadań. Uzyskane odpowiedzi zapisz w pliku wyniki4.txt, poprzedzając każdą z nich numerem odpowiedniego zadania. Uwaga: plik przyklad.txt zawiera przykładowe dane spełniające warunki zadania. Odpowiedzi dla danych z pliku przyklad.txt są podane pod treściami zadań oraz w pliku odp_przyklad.txt.
Najpierw wczytam dane z pliku pary.txt do programu oraz otworzę plik do którego będziemy zapisywać odpowiedzi (wyniki4.txt).
Dla prostoty, cały program napiszę w jednym pliku.
Plik wyniki.txt zamieszczam na samym końcu tego artykułu.

# wczytywanie pliku
pairs_file = open("pary.txt", "r")
pairs = []
for _ in range(100):
    n, word = pairs_file.readline().split()
    pairs.append([int(n), word])
pairs_file.close()

# otwórz plik z odpowiedziami
odp = open("wyniki4.txt", "w")

Zadanie 4.1. (0-3) Mocna hipoteza Goldbacha mówi, że każda parzysta liczba całkowita większa o 4 jest sumą dwóch nieparzystych liczb pierwszych, np. liczba 20 jest równa sumie 3 + 17 lub sumie 7 + 13. Każdą liczbę parzystą z pliku pary.txt przedstaw w postaci sumy dwóch liczb pierwszych. Wypisz tę liczbę oraz dwa składniki sumy w kolejności niemalejącej. Jeżeli istnieje więcej rozwiązań (tak jak dla liczby 20) należy wypisać składniki sumy o największej różnicy. Wyniki podaj w oddzielnych wierszach, w kolejności zgodnej z kolejnością danych w pliku pary.txt. Liczby w każdym wierszu rozdziel znakiem spacji, np. dla liczby 20 należy wypisać 20 3 17.

# funkcja sprawdzająca czy liczba jest liczbą pierwszą
def czy_pierwsza(n):
    if n == 2:
        return True
    if n % 2 == 0 or n <= 1:
        return False

    pierw = int(n**0.5) + 1
    for dzielnik in range(3, pierw, 2):
        if n % dzielnik == 0:
            return False
    return True

# zadanie 4.1.
odp.write("Zadanie 4.1.\n")
for [n, _] in pairs:
    if n % 2 == 0 and n > 4:
        for i in range(3, n, 2):
            if czy_pierwsza(i) and czy_pierwsza(n-i):
                odp.write(f"{n} {i} {n-i}\n")
                break

Zadanie 4.2. (0-4) Dla każdego słowa z pliku pary.txt znajdź długość najdłuższego spójnego fragmentu tego słowa złożonego z identycznych liter. Wypisz znalezione fragmenty słów i ich długości oddzielone spacją, po jednej parze w każdym wierszu. Jeżeli istnieją dwa fragmenty o takiej samej największej długości, podaj pierwszy z nich. Wyniki podaj w kolejności zgodnej z kolejnością danych w pliku pary.txt. Przykład: dla słowa zxyzzzz wynikiem jest: zzzz 4, natomiast dla słowa kkkabbb wynikiem jest: kkk 3. Dla danych z pliku przyklad.txt odpowiedzi podano w pliku odp_przyklad.txt.

# zadanie 4.2.
odp.write("\nZadanie 4.2.\n")
for [_, word] in pairs:
    max_ = 1
    max_letter = word[0]
    cur_max = 1
    for i in range(len(word)-1):
        if word[i] == word[i+1]:
            cur_max += 1
        else:
            cur_max = 1
        if cur_max > max_:
            max_ = cur_max
            max_letter = word[i]
    odp.write(f"{max_ * max_letter} {max_}\n")

Zadanie 4.3. (0-4) Para (liczba1, słowo1) jest mniejsza od pary (liczba2, słowo2), gdy: - liczba1 < liczba2, albo - liczba1 = liczba2 oraz słowo1 jest leksykograficznie (w porządku alfabetycznym) mniejsze od słowo2. Przykład: para (1, bbb) jest mniejsza od pary (2, aaa), natomiast para (3, aaa) jest mniejsza od pary (3, ab). Rozważ wszystkie pary (liczba, słowo) zapisane w wierszach pliku pary.txt, dla których liczba jest równa długości słowa, i wypisz spośród nich taką parę, która jest mniejsza od wszystkich pozostałych. W pliku pary.txt jest jedna taka para. Dla danych z pliku przyklad.txt odpowiedzią jest: 6 abbbbc

# zadanie 4.3.
odp.write("\nZadanie 4.3.\n")
filtered = list(filter(lambda pair: pair[0] == len(pair[1]), pairs))
min_pair = filtered[0]
for i in range(len(filtered)-1):
    if filtered[i][0] < filtered[i+1][0] or (filtered[i][0] == filtered[i+1][0] and filtered[i][1] < filtered[i+1][1]):
        min_pair = filtered[i]
odp.write(f"{min_pair[0]} {min_pair[1]}\n")

odp.close()

Zawartość pliku wyniki4.txt:

Zadanie 4.1.
68 7 61
24 5 19
48 5 43
12 5 7
42 5 37
66 5 61
78 5 73
88 5 83
76 3 73
64 3 61
24 5 19
22 3 19
64 3 61
18 5 13
36 5 31
42 5 37
56 3 53
30 7 23
44 3 41
28 5 23
94 5 89
28 5 23
52 5 47
28 5 23
6 3 3
36 5 31
34 3 31
58 5 53

Zadanie 4.2.
d 1
tt 2
a 1
lllllll 7
ooooo 5
wwwwww 6
aaaaaaaaaaa 11
jj 2
aaaaaaaaaaaa 12
ttt 3
qqq 3
uu 2
s 1
pppp 4
sssssssssssss 13
ww 2
mm 2
ddddd 5
ss 2
ll 2
xxx 3
ttttt 5
hhhhhhhhh 9
ggggggg 7
pppp 4
w 1
kkkkkkkkk 9
v 1
x 1
z 1
ttttttt 7
c 1
tttttttttttt 12
yyyyyyyyyyyy 12
ccc 3
j 1
aaaaa 5
a 1
r 1
gg 2
zzzzzzzz 8
jj 2
oooooooooooooooo 16
ppppp 5
dddddd 6
pppp 4
x 1
pppp 4
d 1
sssss 5
aaaaaaa 7
pppp 4
kkkkkkkk 8
wwwwww 6
xxxx 4
s 1
gggg 4
bb 2
z 1
o 1
mmmmm 5
aaaaaaa 7
l 1
llll 4
ggggg 5
aaaaa 5
jjjjjjjjjj 10
a 1
jj 2
kkkkk 5
d 1
kkkkk 5
eee 3
tttttttttt 10
bbb 3
uuuuuuuuuu 10
dddd 4
ggggggggg 9
lll 3
ttttttttttttttttttttttttttttttttt 33
i 1
fffff 5
dd 2
bb 2
a 1
h 1
hh 2
aaaa 4
dddddddd 8
ee 2
d 1
rrrrrrrrrrrrrr 14
jjjjjjj 7
n 1
aaaaaaa 7
s 1
a 1
uuuu 4
jj 2
d 1

Zadanie 4.3.
3 ast