Advertisement
xTheEc0

IT VBE 2023 Pakartotinis Uzduotis 2 Python

Jul 8th, 2023
829
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.76 KB | None | 0 0
  1. '''
  2. Tomas ir jo klasės draugai mokykloje per pertraukas mėgsta žaisti žaidima Popierius, Akmuo, Žirklės.
  3. Kai įsitraukia daug dalyvių, mokiniai nespeja baigti žaidimo per pertrauką.
  4. Todel Tomas sugavojo sukurti programą, kuris suskaičiuotų, kas, žaidžiant žaidimą poromis, surinktų daugiausiai pergalių.
  5. Ž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).
  6. Žaidimo taisyklės: popierius laimi prieš akmeni, akmuo laimi prieš žirklės, žirklės laimi prieš popierių.
  7.  
  8. 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.
  9. Kiekvieno mokinio duomenys turi būti lyginami su kitų mokinių duomenimus.
  10.  
  11. Pradiniai duomenys
  12.    Duomenys pateikti tekstiniame faile U2.txt
  13.    Pirmoje eilutėje užrašytas mokinių skaičius m (2 ≤ m ≤ 30) ir žaidimo etapų skaičius e (5 ≤ e ≤ 10).
  14.    Tolesnėse eilutėse užrašyti mokinių keikvieno žaidimo duomenys:
  15.        mokinio vardas (13 simbolių).
  16.        pasirinkimo kiekviename žaidimo etape žymė (P, A, Z; vienas simbolis)
  17.        duomenys atskirti vienu tarpo simboliu.
  18.        Kiekvienas žaidimo dalyvis bent vieną kartą kuriame nors etape pralaimėjo.
  19.  
  20. Rezultatai
  21.    Rezultatus pateiksite tekstiniame faile U2rez.txt
  22.    Spausdinamas žaidime dalyvavusių mokinių rezultatų sąrašas:
  23.        mokinio vardas.
  24.        visų pergaliu ir pralaimėjimų santykis, suapvalintas iki šimtųjų.
  25.        lygiosiomis sužaistų žaidimų skaičius.
  26.        duomenys atskirti vienu tarpo simboliu.
  27.        sąrašas surikiuotas pagal visų pergalių ir pralaimėjimų santikį mažėjančiai.
  28.        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.
  29.  
  30. Nurodymai
  31.    Programoje naudokite žodyno duomenų struktūrą arba struktūra sudarykite, naudodami klases, mokinių duomenims saugoti.
  32.    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.
  33.  
  34. Duomenų ir rezultatų pavyzdžiai
  35. Duomenų failų pavyzdys:
  36. 6 7
  37. Povilas        P P Z P Z A A
  38. Vytautas       Z A P A A A Z
  39. Aurelija       P Z A A Z Z Z
  40. Diana          A A A A A A A
  41. Renata         A Z P P P A Z
  42. Tomas          Z Z P A Z A Z
  43.  
  44. Rezultatų failo pavyzdys:
  45. Povilas     1.89 9
  46. Diana       1.56 12
  47. Vytautas    1.22 15
  48. Renata      1.20 13
  49. Tomas       0.64 17
  50. Aurelija    0.28 12
  51. '''
  52.  
  53. def readData() -> tuple:
  54.     f = open('U2.txt')
  55.     m, e = map(int, f.readline().split())
  56.     data = list()
  57.     for i in range(m):
  58.         data.append(f.readline().strip().split())
  59.     f.close()
  60.    
  61.     return e, data
  62.  
  63.  
  64. def processData(e:int, data:list) -> dict:
  65.     results = dict()
  66.     for i in data:
  67.         key = i[0]
  68.         results[key] = [0, 0, 0] # win, lose, draw
  69.         for j in data:
  70.             if i[0] != j[0]: # not same person / don't play against yourself
  71.                 for k in range(e):
  72.                     itter = k + 1
  73.                     if i[itter] == "P" and j[itter] == "A": # P > A = win
  74.                         results[key][0] += 1
  75.                     elif i[itter] == "A" and j[itter] == "Z": # A > Z = win
  76.                         results[key][0] += 1
  77.                     elif i[itter] == "Z" and j[itter] == "P": # Z > P = win
  78.                         results[key][0] += 1
  79.                     elif i[itter] == j[itter]: # draw
  80.                         results[key][2] += 1
  81.                     else:
  82.                         results[key][1] += 1 # lose
  83.     return results
  84.  
  85.  
  86. def writeData(results):
  87.     f = open('U2rez.txt', 'w')
  88.     results = dict(sorted(results.items(), key=lambda x: x[1][0] / x[1][1], reverse=True)) # Sort by win/lose ratio percentage
  89.     stringbuilder = []
  90.     for i in results:
  91.         stringbuilder.append(f'{i.ljust(13)} {results[i][0] / results[i][1]:.2f} {results[i][2]}')
  92.         # pad to 13 chars with .ljsut(), so its 'Povilas      ', not 'Povilas'
  93.         # note: :.2f rounds the result of division to 2 decimal places
  94.     f.write("\n".join(stringbuilder))
  95.     f.close()
  96.  
  97.  
  98. writeData(processData(*readData()))
  99. # note: need * to unpack tuple into arguments for processData() from readData() (since it returns a tuple like (e, data))
  100. # otherwise it complains you've given the function 1 argument (the tuple) instead of 2 (e, data)
  101. # -> TypeError: processData() missing 1 required positional argument: 'data'
Tags: python LT IT VBE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement