IT Egzaminai/2024

Iš Pitonas.

1 užduotis. Krepšinis

Maksimalus vertinimas – 25 taškai

Mokykla Vasario 16-osios proga surengė mokinių „3 prieš 3“ krepšinio turnyrą. Pagal sutartas taisykles pataikyti metimai buvo vertinami taškais: baudos metimas – 1 taškas, dvitaškis – 2 taškai ir tritaškis – 3 taškai. Nepataikytas metimas vertinamas 0 taškų. Kiekvienų rungtynių metu buvo fiksuojami žaidėjų pataikytų ir mestų metimų duomenys.

Parašykite programą, kuri pateiktų turnyro metu didžiausią rungtynių skaičių sužaidusių žaidėjų sąrašą. Šiame sąraše turi būti nurodytas turnyro metu žaidėjo per rungtynes surinktų taškų vidurkis ir pataikytų bei mestų metimų santykis procentais.

Pradiniai duomenys

Duomenys pateikiami tekstiniame faile U1.txt.

  • Pirmoje eilutėje pateiktas įrašų apie žaidėjų duomenis skaičius n(15 ≤ n ≤ 100)
  • Tolesnėse n eilučių pateikti krepšinio turnyre dalyvavusių žaidėjų kiekvienų rungtynių duomenys: unikalus žaidėjo numeris; pataikytų baudų skaičius; mestų baudų skaičius; pataikytų dvitaškių skaičius; mestų dvitaškių skaičius; pataikytų tritaškių skaičius; mestų tritaškių skaičius. Duomenys atskirti vienu tarpo simboliu.

Rezultatai

Rezultatus pateikite tekstiniame faile U1rez.txt.

  • Pirmoje eilutėje pateiktas didžiausias turnyro metu žaidėjo sužaistų rungtynių skaičius.
  • Nuo antros eilutės pateikiamas didžiausią rungtynių skaičių sužaidusių žaidėjų sąrašas. Šiame sąraše turi būti nurodyti kiekvieno žaidėjo duomenys: unikalus žaidėjo numeris; turnyro metu žaidėjo per rungtynes surinktų taškų vidurkis, suapvalintas iki dešimtųjų; turnyro metu pataikytų ir mestų metimų santykis procentais, suapvalintas iki artimiausio sveikojo skaičiaus. Duomenys atskirti vienu tarpo simboliu, procento ženklas nuo skaičiaus taip pat atskirtas vienu tarpo simboliu. Jeigu yra keli žaidėjai, sužaidę po vienodą didžiausią rungtynių skaičių, tuomet kiekvieno žaidėjo duomenys pateikiami atskiroje eilutėje. Sąrašas pagal žaidėjo unikalų numerį pateikiamas tokia eilės tvarka, kokia jis buvo pateiktas pradinių duomenų faile.

Nurodymai

  • Sukurkite funkciją, kuri apskaičiuoja turnyro metu žaidėjo sužaistų rungtynių skaičių, per rungtynes surinktų taškų vidurkį ir pataikytų bei mestų metimų santykį procentais.

Duomenų ir rezultatų pavyzdžiai

Duomenų failo pavyzdys Paaiškinimai
18
23 3 3 3 5 0 0
13 1 5 2 4 2 4
54 2 3 3 3 3 5
54 4 5 3 4 2 5
25 1 2 2 3 2 5
67 1 3 4 4 2 3
22 1 4 1 3 1 5
25 2 5 3 5 1 5
25 3 3 1 3 1 6
25 3 3 1 3 3 5
54 2 2 2 4 2 2
67 3 5 5 5 2 2
23 2 3 3 5 3 3
88 2 2 1 4 1 4
54 4 4 1 5 0 3
23 2 2 3 5 0 5
23 2 3 2 4 1 4
13 2 3 3 4 1 2
● Įrašų apie žaidėjų duomenis skaičius.
● Žaidėjų kiekvienų rungtynių duomenys:
   unikalus žaidėjo numeris;
   pataikytų baudų skaičius;
   mestų baudų skaičius;
   pataikytų dvitaškių skaičius;
   mestų dvitaškių skaičius;
   pataikytų tritaškių skaičius;
   mestų tritaškių skaičius.
Rezultatų failo pavyzdys Paaiškinimai
4
23 10.8 57 %
54 12.8 62 %
25 11.0 48 %
● Didžiausias turnyro metu žaidėjo sužaistų
rungtynių skaičius.
● Kiekvieno žaidėjo duomenys: unikalus žaidėjo
numeris; turnyro metu žaidėjo per rungtynes
surinktų taškų vidurkis; turnyro metu pataikytų
ir mestų metimų santykis procentais (pateikiant
procento ženklą).

Pastaba. Sąrašas pagal žaidėjo unikalų numerį
pateiktas tokia eilės tvarka, kokia jis nurodytas
pradinių duomenų faile.

1 užduotis. Sprendimas

IVESTIS = 'U1.txt'
REZULTATAI = 'U1rez.txt'

def skaityti_duomenis(failo_pavadinimas):
    with open(failo_pavadinimas, "r") as f:
        n = int(f.readline().strip())
        zaidejai = {}

        for _ in range(n):
            duomenys = f.readline().strip().split()
            zaidejo_numeris = duomenys[0]
            baudos_pataikytos = int(duomenys[1])
            baudos_mestos = int(duomenys[2])
            dvitasiai_pataikyti = int(duomenys[3])
            dvitasiai_mesti = int(duomenys[4])
            tritasiai_pataikyti = int(duomenys[5])
            tritasiai_mesti = int(duomenys[6])

            if zaidejo_numeris not in zaidejai:
                zaidejai[zaidejo_numeris] = {
                    "rungtynes": 0,
                    "taskai": 0,
                    "pataikyti": 0,
                    "mesti": 0,
                }

            zaidejai[zaidejo_numeris]["rungtynes"] += 1
            zaidejai[zaidejo_numeris]["taskai"] += (
                baudos_pataikytos * 1 + dvitasiai_pataikyti * 2 + tritasiai_pataikyti * 3
            )
            zaidejai[zaidejo_numeris]["pataikyti"] += (
                baudos_pataikytos + dvitasiai_pataikyti + tritasiai_pataikyti
            )
            zaidejai[zaidejo_numeris]["mesti"] += (
                baudos_mestos + dvitasiai_mesti + tritasiai_mesti
            )

        return zaidejai


def skaiciuoti_rezultatus(zaidejai):
    max_rungtynes = max(zaidejas["rungtynes"] for zaidejas in zaidejai.values())
    rezultatai = []

    for numeris, duomenys in zaidejai.items():
        if duomenys["rungtynes"] == max_rungtynes:
            vidurkis = duomenys["taskai"] / duomenys["rungtynes"]
            santykis = (
                (duomenys["pataikyti"] / duomenys["mesti"]) * 100
                if duomenys["mesti"] > 0
                else 0
            )
            rezultatai.append((numeris, round(vidurkis, 1), round(santykis)))

    return max_rungtynes, rezultatai


def irasyti_rezultatus(failo_pavadinimas, max_rungtynes, rezultatai):
    with open(failo_pavadinimas, "w") as f:
        f.write(f"{max_rungtynes}\n")
        for numeris, vidurkis, santykis in rezultatai:
            f.write(f"{numeris} {vidurkis} {santykis} %\n")


def main():
    zaidejai = skaityti_duomenis(IVESTIS)
    max_rungtynes, rezultatai = skaiciuoti_rezultatus(zaidejai)
    irasyti_rezultatus(REZULTATAI, max_rungtynes, rezultatai)


if __name__ == "__main__":
    main()

2 užduotis. Gimtadienis

Maksimalus vertinimas – 25 taškai

Saulius savo gimtadienio proga nori pakviesti draugus į galvosūkių kambarį. Jis sužinojo, kuriomis dienomis ir kuriomis valandomis reikiamą savaitę galvosūkių kambarys yra laisvas, tačiau nežino, kada jo draugai galės dalyvauti. Siekdamas išsiaiškinti, kada galėtų dalyvauti kuo daugiau draugų, Saulius jiems nusiuntė galimo laiko pasirinkimų sąrašą, o kiekvienas draugas jam atsiuntė, kada galėtų dalyvauti. Kambarį galima rezervuoti tik su sąlyga, jog dalyvaus ne mažiau kaip keturi Sauliaus draugai.

Parašykite programą, kuri atrinktų bent keturiems Sauliaus draugams tinkamą laiką, pateiktų skaičių, keliems draugams tas laikas tinkamas, ir parašytų galinčių dalyvauti draugų vardus.

Pradiniai duomenys

Duomenys pateikiami tekstiniame faile U2.txt.

  • Pirmoje eilutėje pateiktas dienų skaičius d(1 ≤ d ≤ 7), kuomet galvosūkių kambaryje yra galimybė pasirinkti laisvą laiką, ir draugų, kurie atsiuntė tinkamą laiką, skaičius dr(4 ≤ dr ≤ 20).
  • Tolesnėse eilutėse pateikti:
    • duomenys, kada galvosūkių kambarys yra laisvas: dienos numeris (I, II, III, IV, V, VI, VII – 3 simboliai); tą dieną laisvų valandų skaičius; laisvos valandos;
    • draugams tinkamo laiko duomenys: draugo vardas (12 simbolių), užrašytas lotynų abėcėlės raidėmis; skaičius, kiek galimų laiko variantų jam tinka; draugui tinkamas laikas, nurodomas duomenų poromis – dienos numeris ir valanda.
Duomenys atskirti vienu tarpo simboliu. Dienos numeris jam skirtose trijose pozicijose pradedamas rašyti nuo pirmos pozicijos. Buvo bent vienas laikas (diena ir valanda), kurį pasirinko ne mažiau kaip keturi draugai.

Rezultatai

Rezultatus pateikite tekstiniame faile U2rez.txt.

  • Rezultatus pateikite pagal tą patį laiką pasirinkusių draugų skaičių mažėjančiai. Jeigu yra keli laiko variantai, tinkami vienodam draugų skaičiui, pateikimo tvarka nesvarbi.
  • Rezultatus apie kiekvieną draugams tinkamą laiką pateikite taip:
    • dienos numerį, valandą ir draugų, kuriems tinkamas tas laikas, skaičių pateikite vienoje eilutėje; duomenis eilutėje atskirkite vienu tarpo simboliu;
    • tolesnėse eilutėse pateikite abėcėliškai surikiuotą draugų, kuriems tinka šis laikas, sąrašą; kiekvieno draugo vardą pateikite atskiroje eilutėje.

Nurodymai

  • Programoje naudokite struktūros duomenų tipo masyvus galvosūkių kambario laisvam laikui ir draugų atsiųsto tinkamo laiko duomenims saugoti.
  • Sukurkite funkciją, kuri surikiuoja duomenis pagal tą patį laiką pasirinkusių draugų skaičių mažėjančiai.

Duomenų ir rezultatų pavyzdžiai

Duomenų failo pavyzdys Paaiškinimai
4 10
I   3 10 15 17
III 4 9 11 17 19
IV  1 14
VI  3 12 18 19
Vidas        2 I   15 VI  18
Vaida        3 III 9 III 11 IV  14
Rasa         2 I   15 VI  18
Skirmantas   1 I   15
Vlada        3 I   10 I   15 VI   18
Rokas        4 I   10 III 9 III 11 IV  14
Jonas        4 I   15 I   17 III 11 VI  12
Evelina      3 III 9 III 11 III 17
Reda         1 III 11
Meda         4 I   10 III 11 III 17 VI  12
● Dienų skaičius, kuomet galvosūkių kambaryje yra galimybė
pasirinkti laisvą laiką, ir draugų, kurie atsiuntė tinkamą
laiką, skaičius.
● Galvosūkių kambario duomenys: dienos numeris; tą dieną
laisvų valandų skaičius; laisvos valandos.
● Draugams tinkamo laiko duomenys: draugo vardas; skaičius,
kiek galimų laiko variantų jam tinka; draugui tinkamas
laikas, nurodomas duomenų poromis – dienos numeris ir
valanda.
Rezultatų failo pavyzdys Paaiškinimai
III 11 6
Evelina
Jonas
Meda
Reda
Rokas
Vaida
I   15 5
Jonas
Rasa
Skirmantas
Vidas
Vlada
● Draugams tinkamo laiko duomenys: dienos numeris, valanda
ir draugų, kuriems tinkamas tas laikas, skaičius.
● Tolesnėse eilutėse pateiktas abėcėliškai surikiuotas
draugų, kuriems tinka šis laikas, sąrašas.

Pastaba. Rezultatai pateikti pagal tą patį laiką
pasirinkusių draugų skaičių mažėjančiai.

2 užduotis. Sprendimas

# Jau greitai bus išspręstas :)