Воробьев Егор Александрович, 419/2 (КФ) OneDArcade 17926
Абдикашева Вилена Ринатовна, 411 группа OneDArcade 17942
f1import asynciof1import asyncio
22
3class Monster:3class Monster:
44
5    def __init__(self, name, position, delay, power):5    def __init__(self, name, position, delay, power):
6        self.name = name6        self.name = name
7        self.position = position7        self.position = position
8        self.delay = delay8        self.delay = delay
9        self.power = power9        self.power = power
10        self.alive = True10        self.alive = True
11        self.episode_count = 011        self.episode_count = 0
1212
13    async def run(self, start_event, end_event):13    async def run(self, start_event, end_event):
nn14        try:
14        while True:15            while True:
15            await start_event.wait()16                await start_event.wait()
16            self.episode_count += 117                self.episode_count += 1
17            if self.alive and self.delay > 0 and (self.episode_count % s18                if self.alive and self.delay > 0 and (self.episode_count
>elf.delay == 0):> % self.delay == 0):
18                self.position += 119                    self.position += 1
19            await end_event.wait()20                await end_event.wait()
21        except asyncio.CancelledError:
22            pass
2023
21async def game(monsters, start_event, end_event, epochs):24async def game(monsters, start_event, end_event, epochs):
22    for _ in range(epochs):25    for _ in range(epochs):
23        await start_event.wait()26        await start_event.wait()
24        await end_event.wait()27        await end_event.wait()
25        positions = {}28        positions = {}
26        for i, m in enumerate(monsters):29        for i, m in enumerate(monsters):
27            if m.alive:30            if m.alive:
28                positions.setdefault(m.position, []).append((i, m))31                positions.setdefault(m.position, []).append((i, m))
29        pair = None32        pair = None
30        for pos in sorted(positions.keys()):33        for pos in sorted(positions.keys()):
31            if len(positions[pos]) > 1:34            if len(positions[pos]) > 1:
n32                _, m1 = positions[pos][0]n35                i1, m1 = positions[pos][0]
33                _, m2 = positions[pos][1]36                i2, m2 = positions[pos][1]
34                pair = (m1, m2)37                pair = (m1, m2)
35                break38                break
36        if pair is not None:39        if pair is not None:
37            m1, m2 = pair40            m1, m2 = pair
38            if m1.power == m2.power:41            if m1.power == m2.power:
39                m1.alive = False42                m1.alive = False
40                m2.alive = False43                m2.alive = False
41            elif m1.power > m2.power:44            elif m1.power > m2.power:
42                m1.power -= m2.power45                m1.power -= m2.power
43                m2.alive = False46                m2.alive = False
44            else:47            else:
45                m2.power -= m1.power48                m2.power -= m1.power
46                m1.alive = False49                m1.alive = False
n47        is_alive = [m for m in monsters if m.alive]n50        living = [m for m in monsters if m.alive]
48        if not is_alive:51        if not living:
49            return 'All dead'52            return 'All dead'
n50        if len(is_alive) == 1:n53        if len(living) == 1:
51            return is_alive[0].name54            return living[0].name
52    is_alive = [m for m in monsters if m.alive]55    living = [m for m in monsters if m.alive]
53    if len(is_alive) == len(monsters):56    if len(living) == len(monsters):
54        return 'All flee'57        return 'All flee'
55    else:58    else:
t56        return ', '.join((m.name for m in is_alive))t59        return ', '.join((m.name for m in living))
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op