-
Notifications
You must be signed in to change notification settings - Fork 13
/
u2.py
61 lines (48 loc) · 2.05 KB
/
u2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from collections import defaultdict
from itertools import islice
from pathlib import Path
from typing import List, Iterator, Dict, NamedTuple, Any
# Struktūros duomenų tipas Vytauto duomenims saugoti
class Exercise(NamedTuple):
name: str
reps: int
def read(lines: Iterator[str]) -> Iterator[Exercise]:
# Skaičius `n`, nurodantis kiek iš viso pratimų Vytautas užsirašė.
n = int(next(lines))
# Įsitikiname, kad `n` atitinka užduotyje nurodytą intervalą.
assert 1 <= n <= 100
# Skaitome kuprinių svorius `n` kartų.
for name, reps in map(str.split, islice(lines, n)):
# Duomenis saugome struktūros tipo pavidalu.
yield Exercise(name, int(reps))
def aggregate(data: Iterator[Exercise]) -> Dict[str, int]:
"""Skaičiuojame, kiek iš viso kartų buvo atliktas kiekvienas pratimas."""
# Kuriame žodyną, kurio kiekvieno naujo elemento reikšmė bus 0.
agg: Dict[str, int] = defaultdict(int)
for name, reps in data:
# Sumuojame kiekvieno pratimo atlikimų skaičių.
agg[name] += reps
return agg
def sort(items: List[Any]) -> None:
"""Paprasčiausias `Bubble Sort`_ rūšiavimo algoritmas, rūšiuojantis
atvirkštine tvarka.
.. _Bubble Sort: http://en.wikipedia.org/wiki/Bubble_sort
"""
# Iteruojame per visus elements.
for i in range(len(items)):
for j in range(len(items) - i - 1):
if items[j] < items[j + 1]:
# Sukeičiame rūšiavimo tvarkos neatitinkančius elementus.
items[j], items[j + 1] = items[j + 1], items[j]
def main(path: Path) -> None:
# Skaitome duomenų failą ir apskaičiuojame rezultatus.
with open(path / 'U2.txt') as f:
agg = aggregate(read(f))
# Paruošiame rezultatų masyvą rūšiavimui.
result = [(reps, name) for name, reps in agg.items()]
# Rūšiuojame rezultatus.
sort(result)
# Rašome rezultatus į išvesties failą.
with open(path / 'U2rez.txt', 'w') as f:
for reps, name in result:
print('%-20s' % name, reps, file=f)