Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''
- Tomas ir jo klasės draugai mokykloje per pertraukas mėgsta žaisti žaidima Popierius, Akmuo, Žirklės.
- Kai įsitraukia daug dalyvių, mokiniai nespeja baigti žaidimo per pertrauką.
- Todel Tomas sugavojo sukurti programą, kuris suskaičiuotų, kas, žaidžiant žaidimą poromis, surinktų daugiausiai pergalių.
- Žaidimo pradžioje nusprendžiama, kiek etapų bus žaidime, nurodomas mokinio vardas ir surašomi kiekvieno mokinio pasirinkimai kiekviename etape, pažymint vieną iš trijų pasirinkimo žymių: P (popierius), A (akmuo) ir Z (žirklės).
- Žaidimo taisyklės: popierius laimi prieš akmeni, akmuo laimi prieš žirklės, žirklės laimi prieš popierių.
- Parašykite programą, kuri pateiktų žaidimo dalyvių sąrašą su apskaičiuotu kiekvieno mokinio visų pergaliu ir pralaimėjimų santykiu bei lygiosiomis sužaistų žaidimų skaičiumi.
- Kiekvieno mokinio duomenys turi būti lyginami su kitų mokinių duomenimus.
- Pradiniai duomenys
- Duomenys pateikti tekstiniame faile U2.txt
- Pirmoje eilutėje užrašytas mokinių skaičius m (2 ≤ m ≤ 30) ir žaidimo etapų skaičius e (5 ≤ e ≤ 10).
- Tolesnėse eilutėse užrašyti mokinių keikvieno žaidimo duomenys:
- mokinio vardas (13 simbolių).
- pasirinkimo kiekviename žaidimo etape žymė (P, A, Z; vienas simbolis)
- duomenys atskirti vienu tarpo simboliu.
- Kiekvienas žaidimo dalyvis bent vieną kartą kuriame nors etape pralaimėjo.
- Rezultatai
- Rezultatus pateiksite tekstiniame faile U2rez.txt
- Spausdinamas žaidime dalyvavusių mokinių rezultatų sąrašas:
- mokinio vardas.
- visų pergaliu ir pralaimėjimų santykis, suapvalintas iki šimtųjų.
- lygiosiomis sužaistų žaidimų skaičius.
- duomenys atskirti vienu tarpo simboliu.
- sąrašas surikiuotas pagal visų pergalių ir pralaimėjimų santikį mažėjančiai.
- Jeigu yra keli mokiniai, kuriu pergaliu ir pralaimėjimų santykis yra vienodas, jie sąraše turi būti pateikiami tokia eilės tvarka, kokia jie buvo nurodydyti pradinių duomenų faile.
- Nurodymai
- Programoje naudokite žodyno duomenų struktūrą arba struktūra sudarykite, naudodami klases, mokinių duomenims saugoti.
- Sukurkite ir parašykite funkciją, kuri apskaičiuotų tam tikro mokinio pergaliu, pralaimėjimų ir lygiųjų skaičių, kai pateikiami dviejų mokinių (poros) duomenys.
- Duomenų ir rezultatų pavyzdžiai
- Duomenų failų pavyzdys:
- 6 7
- Povilas P P Z P Z A A
- Vytautas Z A P A A A Z
- Aurelija P Z A A Z Z Z
- Diana A A A A A A A
- Renata A Z P P P A Z
- Tomas Z Z P A Z A Z
- Rezultatų failo pavyzdys:
- Povilas 1.89 9
- Diana 1.56 12
- Vytautas 1.22 15
- Renata 1.20 13
- Tomas 0.64 17
- Aurelija 0.28 12
- '''
- def readData() -> tuple:
- f = open('U2.txt')
- m, e = map(int, f.readline().split())
- data = list()
- for i in range(m):
- data.append(f.readline().strip().split())
- f.close()
- return e, data
- def processData(e:int, data:list) -> dict:
- results = dict()
- for i in data:
- key = i[0]
- results[key] = [0, 0, 0] # win, lose, draw
- for j in data:
- if i[0] != j[0]: # not same person / don't play against yourself
- for k in range(e):
- itter = k + 1
- if i[itter] == "P" and j[itter] == "A": # P > A = win
- results[key][0] += 1
- elif i[itter] == "A" and j[itter] == "Z": # A > Z = win
- results[key][0] += 1
- elif i[itter] == "Z" and j[itter] == "P": # Z > P = win
- results[key][0] += 1
- elif i[itter] == j[itter]: # draw
- results[key][2] += 1
- else:
- results[key][1] += 1 # lose
- return results
- def writeData(results):
- f = open('U2rez.txt', 'w')
- results = dict(sorted(results.items(), key=lambda x: x[1][0] / x[1][1], reverse=True)) # Sort by win/lose ratio percentage
- stringbuilder = []
- for i in results:
- stringbuilder.append(f'{i.ljust(13)} {results[i][0] / results[i][1]:.2f} {results[i][2]}')
- # pad to 13 chars with .ljsut(), so its 'Povilas ', not 'Povilas'
- # note: :.2f rounds the result of division to 2 decimal places
- f.write("\n".join(stringbuilder))
- f.close()
- writeData(processData(*readData()))
- # note: need * to unpack tuple into arguments for processData() from readData() (since it returns a tuple like (e, data))
- # otherwise it complains you've given the function 1 argument (the tuple) instead of 2 (e, data)
- # -> TypeError: processData() missing 1 required positional argument: 'data'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement