IT Egzaminai/2024
1 užduotis. Krepšinis
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
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
IVESTIS = 'U2.txt'
REZULTATAI = 'U2rez.txt'
def skaityti_duomenis(failo_pavadinimas):
with open(failo_pavadinimas, "r") as f:
pirmoji_eilute = f.readline().strip().split()
dienu_skaicius = int(pirmoji_eilute[0])
draugu_skaicius = int(pirmoji_eilute[1])
laisvi_laikai = {}
draugu_laikai = {}
for _ in range(dienu_skaicius):
duomenys = f.readline().strip().split()
diena = duomenys[0]
laisvu_valandu_skaicius = int(duomenys[1])
laisvos_valandos = duomenys[2 : 2 + laisvu_valandu_skaicius]
laisvi_laikai[diena] = laisvos_valandos
for _ in range(draugu_skaicius):
duomenys = f.readline().strip().split()
vardas = duomenys[0]
tinkamu_laiku_skaicius = int(duomenys[1])
draugo_laikai = [
(duomenys[i], duomenys[i + 1])
for i in range(2, 2 + tinkamu_laiku_skaicius * 2, 2)
]
draugu_laikai[vardas] = draugo_laikai
return laisvi_laikai, draugu_laikai
def surasti_tinkamus_laikus(laisvi_laikai, draugu_laikai):
laiku_skaicius = {}
for draugas, laikai in draugu_laikai.items():
for diena, valanda in laikai:
if diena in laisvi_laikai and valanda in laisvi_laikai[diena]:
if (diena, valanda) not in laiku_skaicius:
laiku_skaicius[(diena, valanda)] = []
laiku_skaicius[(diena, valanda)].append(draugas)
tinkami_laikai = {k: v for k, v in laiku_skaicius.items() if len(v) >= 4}
return tinkami_laikai
def rikiuoti_rezultatus(tinkami_laikai):
rezultatai = sorted(tinkami_laikai.items(), key=lambda x: len(x[1]), reverse=True)
return rezultatai
def irasyti_rezultatus(failo_pavadinimas, rezultatai):
with open(failo_pavadinimas, "w") as f:
for (diena, valanda), draugai in rezultatai:
draugu_skaicius = len(draugai)
f.write(f"{diena.ljust(3)} {valanda} {draugu_skaicius}\n")
for draugas in sorted(draugai):
f.write(f"{draugas.ljust(12)}\n")
def main():
laisvi_laikai, draugu_laikai = skaityti_duomenis(IVESTIS)
tinkami_laikai = surasti_tinkamus_laikus(laisvi_laikai, draugu_laikai)
rezultatai = rikiuoti_rezultatus(tinkami_laikai)
irasyti_rezultatus(REZULTATAI, rezultatai)
if __name__ == "__main__":
main()