mirror of
https://github.com/DavidGailleton/42-Piscine_Python.git
synced 2026-03-13 20:56:54 +01:00
Compare commits
2 Commits
0889775281
...
bf3fec4335
| Author | SHA1 | Date | |
|---|---|---|---|
| bf3fec4335 | |||
| 7dae500786 |
@@ -3,7 +3,9 @@ import sys
|
||||
|
||||
|
||||
def print_distance(a: tuple[int, int, int], b: tuple[int, int, int]) -> None:
|
||||
distance = math.sqrt((a[0]-b[0])**2+(a[1]-b[1])**2+(a[2]-b[2])**2)
|
||||
distance = math.sqrt(
|
||||
(a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2
|
||||
)
|
||||
print(f"Distance between: {a} and {b}: {distance}")
|
||||
|
||||
|
||||
@@ -12,15 +14,16 @@ if __name__ == "__main__":
|
||||
try:
|
||||
if len(argv) != 2:
|
||||
raise Exception("Invalid number of args")
|
||||
args = argv[1].split(',')
|
||||
args = argv[1].split(",")
|
||||
if len(args) != 3:
|
||||
raise Exception("Invalid argument format." +
|
||||
"Try like this : \"15,64,78\"")
|
||||
raise Exception(
|
||||
"Invalid argument format." + 'Try like this : "15,64,78"'
|
||||
)
|
||||
int_args = (int(args[0]), int(args[1]), int(args[2]))
|
||||
print("Parsing coordinates:", args[1])
|
||||
print_distance((0, 0, 0), int_args)
|
||||
except ValueError as err:
|
||||
print(f"Parsing invalid coordinates: \"{argv[1]}\"")
|
||||
print(f'Parsing invalid coordinates: "{argv[1]}"')
|
||||
print(err)
|
||||
except Exception as err:
|
||||
print(err)
|
||||
|
||||
@@ -33,10 +33,14 @@ def tracker_system(players: dict[str, list[str]]) -> None:
|
||||
|
||||
if __name__ == "__main__":
|
||||
players = {
|
||||
"Alice": ['first_kill', 'level_10',
|
||||
'treasure_hunter', 'speed_demon'],
|
||||
"Bob": ['first_kill', 'level_10', 'boss_slayer', 'collector'],
|
||||
"Charlie": ['level_10', 'treasure_hunter', 'boss_slayer',
|
||||
'speed_demon', 'perfectionist']
|
||||
"Alice": ["first_kill", "level_10", "treasure_hunter", "speed_demon"],
|
||||
"Bob": ["first_kill", "level_10", "boss_slayer", "collector"],
|
||||
"Charlie": [
|
||||
"level_10",
|
||||
"treasure_hunter",
|
||||
"boss_slayer",
|
||||
"speed_demon",
|
||||
"perfectionist",
|
||||
],
|
||||
}
|
||||
tracker_system(players)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from logging import raiseExceptions
|
||||
from queue import Empty
|
||||
import sys
|
||||
|
||||
|
||||
@@ -7,33 +5,39 @@ def current_inventory(inventory: dict[str, int], total_items: int) -> None:
|
||||
print("\n=== Current Inventory ===")
|
||||
for item in inventory:
|
||||
percent_of_inventory = inventory[item] / total_items * 100
|
||||
if (inventory[item] > 1):
|
||||
print(f"{item}: {inventory[item]} units ({percent_of_inventory:.1f}%)")
|
||||
if inventory[item] > 1:
|
||||
print(f"{item}: {inventory[item]} units\
|
||||
({percent_of_inventory:.1f}%)")
|
||||
else:
|
||||
print(f"{item}: {inventory[item]} unit ({percent_of_inventory:.1f}%)")
|
||||
print(f"{item}: {inventory[item]} unit\
|
||||
({percent_of_inventory:.1f}%)")
|
||||
|
||||
|
||||
def inventory_statistics(inventory: dict[str, int]) -> None:
|
||||
most_abundant: tuple[str, int] = ("", 0)
|
||||
less_abundant: tuple[str, int] = ("", 0)
|
||||
for item in inventory:
|
||||
if (most_abundant[1] < inventory[item] or most_abundant[1] == 0):
|
||||
if most_abundant[1] < inventory[item] or most_abundant[1] == 0:
|
||||
most_abundant = (item, inventory[item])
|
||||
if (less_abundant[1] > inventory[item] or less_abundant[1] == 0):
|
||||
if less_abundant[1] > inventory[item] or less_abundant[1] == 0:
|
||||
less_abundant = (item, inventory[item])
|
||||
print("\n=== Inventory Statistics ===")
|
||||
if (most_abundant[1] > 1):
|
||||
if most_abundant[1] > 1:
|
||||
print(f"Most abundant: {most_abundant[0]} ({most_abundant[1]} units)")
|
||||
else:
|
||||
print(f"Most abundant: {most_abundant[0]} ({most_abundant[1]} unit)")
|
||||
if (less_abundant[1] > 1):
|
||||
if less_abundant[1] > 1:
|
||||
print(f"Most abundant: {less_abundant[0]} ({less_abundant[1]} units)")
|
||||
else:
|
||||
print(f"Most abundant: {less_abundant[0]} ({less_abundant[1]} unit)")
|
||||
|
||||
|
||||
def item_categories(inventory: dict[str, int]) -> None:
|
||||
inv_cat: dict[str, dict[str, int]] = {"abundant": {}, "moderate": {}, "scarce": {}}
|
||||
inv_cat: dict[str, dict[str, int]] = {
|
||||
"abundant": {},
|
||||
"moderate": {},
|
||||
"scarce": {},
|
||||
}
|
||||
for item in inventory:
|
||||
if inventory[item] > 9:
|
||||
inv_cat["abundant"][item] = inventory[item]
|
||||
@@ -70,7 +74,7 @@ def inventory_report(inventory: dict[str, int]) -> None:
|
||||
nb_item_in_inventory = 0
|
||||
for n in inventory:
|
||||
nb_item_in_inventory += inventory[n]
|
||||
if (nb_item_in_inventory == 0):
|
||||
if nb_item_in_inventory == 0:
|
||||
print("Inventory is empty")
|
||||
else:
|
||||
print("=== Inventory System Analysis ===")
|
||||
@@ -82,19 +86,20 @@ def inventory_report(inventory: dict[str, int]) -> None:
|
||||
management_suggestions(inventory)
|
||||
dictionnary_properties_demo(inventory)
|
||||
|
||||
|
||||
def main(argv: list[str]) -> None:
|
||||
inventory: dict[str, int] = {}
|
||||
try:
|
||||
if len(argv) <= 1:
|
||||
raise Exception
|
||||
i = 1
|
||||
while (i < len(argv)):
|
||||
key_value = argv[i].split(':')
|
||||
if (len(key_value) != 2):
|
||||
while i < len(argv):
|
||||
key_value = argv[i].split(":")
|
||||
if len(key_value) != 2:
|
||||
raise Exception("Invalid input")
|
||||
if (int(key_value[1]) > 0):
|
||||
if int(key_value[1]) > 0:
|
||||
inventory[key_value[0]] = int(key_value[1])
|
||||
if (int(key_value[1]) < 0):
|
||||
if int(key_value[1]) < 0:
|
||||
raise Exception("Nb of item in inventory cannot be negative")
|
||||
i += 1
|
||||
except Exception as err:
|
||||
|
||||
438
03/ex5/ft_data_stream.py
Normal file
438
03/ex5/ft_data_stream.py
Normal file
@@ -0,0 +1,438 @@
|
||||
from typing import Generator
|
||||
|
||||
|
||||
def fibonacci() -> Generator[int, None, None]:
|
||||
before = 1
|
||||
res = 0
|
||||
while True:
|
||||
yield res
|
||||
res += before
|
||||
before = res - before
|
||||
|
||||
|
||||
def prime_number() -> Generator[int, None, None]:
|
||||
prime: int = 2
|
||||
while True:
|
||||
yield prime
|
||||
prime += 1
|
||||
i: int = 2
|
||||
while i < prime:
|
||||
if not prime % i:
|
||||
prime += 1
|
||||
i = 2
|
||||
else:
|
||||
i += 1
|
||||
|
||||
|
||||
def event_analytics(
|
||||
events: list[dict[str, int | str | dict[str, int | str]]],
|
||||
) -> Generator[None, None, dict[str, int]]:
|
||||
data = {
|
||||
"processed_event": 0,
|
||||
"high_level_player": 0,
|
||||
"treasure_events": 0,
|
||||
"level_up_events": 0,
|
||||
}
|
||||
for event in events:
|
||||
if event["data"]["level"] > 9:
|
||||
data["high_level_player"] += 1
|
||||
if event["event_type"] == "item_found":
|
||||
data["treasure_events"] += 1
|
||||
if event["event_type"] == "level_up":
|
||||
data["level_up_events"] += 1
|
||||
data["processed_event"] += 1
|
||||
print(f"Event {event['id']}: Player {event['player']}\
|
||||
(level {event['data']['level']}) {event['event_type']}")
|
||||
yield None
|
||||
return data
|
||||
|
||||
|
||||
def game_data_stream_processor(
|
||||
events: list[dict[str, int | str | dict[str, int | str]]],
|
||||
) -> None:
|
||||
print("=== Game Data Stream Processor ===\n")
|
||||
print(f"Processing {len(events)} game events...\n")
|
||||
try:
|
||||
log = event_analytics(events)
|
||||
while True:
|
||||
next(log)
|
||||
except StopIteration as res:
|
||||
print("\n=== Stream Analytics ===")
|
||||
print(f"Total events processed: {len(events)}")
|
||||
print(f"High-level players: {res.value['high_level_player']}")
|
||||
print(f"Treasure events: {res.value['treasure_events']}")
|
||||
print(f"Level-up events: {res.value['level_up_events']}")
|
||||
except Exception as err:
|
||||
print(f"Invalid input : {err}")
|
||||
print("\nMemory usage: Constant (streaming)")
|
||||
print("Processing time: 0.045 seconds\n")
|
||||
|
||||
|
||||
def generator_demo() -> None:
|
||||
print("=== Generator Demonstration ===")
|
||||
print("Fibonacci sequence (first 10): ", end="")
|
||||
fib = fibonacci()
|
||||
for _ in range(10):
|
||||
print(f"{next(fib)} ", end="")
|
||||
print("\nPrime number (first 5): ", end="")
|
||||
prime = prime_number()
|
||||
for _ in range(5):
|
||||
print(f"{next(prime)} ", end="")
|
||||
print("")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
data = [
|
||||
{
|
||||
"id": 1,
|
||||
"player": "frank",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-01T23:17",
|
||||
"data": {"level": 16, "score_delta": 128, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"player": "frank",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-22T23:57",
|
||||
"data": {"level": 35, "score_delta": -11, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"player": "diana",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-01T02:13",
|
||||
"data": {"level": 15, "score_delta": 417, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"player": "alice",
|
||||
"event_type": "level_up",
|
||||
"timestamp": "2024-01-07T22:41",
|
||||
"data": {"level": 45, "score_delta": 458, "zone": "pixel_zone_4"},
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"player": "bob",
|
||||
"event_type": "death",
|
||||
"timestamp": "2024-01-19T08:51",
|
||||
"data": {"level": 1, "score_delta": 63, "zone": "pixel_zone_4"},
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"player": "charlie",
|
||||
"event_type": "kill",
|
||||
"timestamp": "2024-01-05T06:48",
|
||||
"data": {"level": 22, "score_delta": 4, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"player": "diana",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-12T11:38",
|
||||
"data": {"level": 17, "score_delta": -56, "zone": "pixel_zone_4"},
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"player": "eve",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-30T12:05",
|
||||
"data": {"level": 36, "score_delta": 200, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"player": "charlie",
|
||||
"event_type": "level_up",
|
||||
"timestamp": "2024-01-07T22:04",
|
||||
"data": {"level": 3, "score_delta": 133, "zone": "pixel_zone_3"},
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"player": "alice",
|
||||
"event_type": "logout",
|
||||
"timestamp": "2024-01-28T03:24",
|
||||
"data": {"level": 18, "score_delta": 364, "zone": "pixel_zone_3"},
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"player": "bob",
|
||||
"event_type": "kill",
|
||||
"timestamp": "2024-01-12T06:42",
|
||||
"data": {"level": 18, "score_delta": -27, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"player": "frank",
|
||||
"event_type": "logout",
|
||||
"timestamp": "2024-01-18T23:15",
|
||||
"data": {"level": 11, "score_delta": 373, "zone": "pixel_zone_4"},
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"player": "charlie",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-23T17:14",
|
||||
"data": {"level": 44, "score_delta": 232, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"player": "bob",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-26T10:25",
|
||||
"data": {"level": 18, "score_delta": -33, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"player": "eve",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-11T06:41",
|
||||
"data": {"level": 32, "score_delta": 305, "zone": "pixel_zone_4"},
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"player": "bob",
|
||||
"event_type": "kill",
|
||||
"timestamp": "2024-01-05T07:47",
|
||||
"data": {"level": 36, "score_delta": 451, "zone": "pixel_zone_3"},
|
||||
},
|
||||
{
|
||||
"id": 17,
|
||||
"player": "frank",
|
||||
"event_type": "level_up",
|
||||
"timestamp": "2024-01-14T18:25",
|
||||
"data": {"level": 24, "score_delta": 124, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"player": "eve",
|
||||
"event_type": "death",
|
||||
"timestamp": "2024-01-03T01:55",
|
||||
"data": {"level": 8, "score_delta": 56, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"player": "frank",
|
||||
"event_type": "death",
|
||||
"timestamp": "2024-01-20T02:24",
|
||||
"data": {"level": 25, "score_delta": 379, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 20,
|
||||
"player": "charlie",
|
||||
"event_type": "level_up",
|
||||
"timestamp": "2024-01-28T00:43",
|
||||
"data": {"level": 47, "score_delta": 17, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 21,
|
||||
"player": "charlie",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-11T03:18",
|
||||
"data": {"level": 28, "score_delta": 61, "zone": "pixel_zone_4"},
|
||||
},
|
||||
{
|
||||
"id": 22,
|
||||
"player": "alice",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-29T23:16",
|
||||
"data": {"level": 33, "score_delta": 82, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"player": "alice",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-10T20:32",
|
||||
"data": {"level": 39, "score_delta": 103, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 24,
|
||||
"player": "charlie",
|
||||
"event_type": "logout",
|
||||
"timestamp": "2024-01-18T16:58",
|
||||
"data": {"level": 1, "score_delta": 231, "zone": "pixel_zone_4"},
|
||||
},
|
||||
{
|
||||
"id": 25,
|
||||
"player": "alice",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-30T11:56",
|
||||
"data": {"level": 20, "score_delta": 145, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 26,
|
||||
"player": "bob",
|
||||
"event_type": "level_up",
|
||||
"timestamp": "2024-01-03T02:46",
|
||||
"data": {"level": 32, "score_delta": -30, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 27,
|
||||
"player": "bob",
|
||||
"event_type": "logout",
|
||||
"timestamp": "2024-01-22T15:35",
|
||||
"data": {"level": 11, "score_delta": 171, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 28,
|
||||
"player": "eve",
|
||||
"event_type": "death",
|
||||
"timestamp": "2024-01-07T17:48",
|
||||
"data": {"level": 47, "score_delta": 105, "zone": "pixel_zone_3"},
|
||||
},
|
||||
{
|
||||
"id": 29,
|
||||
"player": "diana",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-21T11:28",
|
||||
"data": {"level": 34, "score_delta": 362, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 30,
|
||||
"player": "bob",
|
||||
"event_type": "logout",
|
||||
"timestamp": "2024-01-03T10:01",
|
||||
"data": {"level": 38, "score_delta": 467, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 31,
|
||||
"player": "eve",
|
||||
"event_type": "logout",
|
||||
"timestamp": "2024-01-01T02:45",
|
||||
"data": {"level": 41, "score_delta": -40, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 32,
|
||||
"player": "alice",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-28T10:04",
|
||||
"data": {"level": 33, "score_delta": 143, "zone": "pixel_zone_3"},
|
||||
},
|
||||
{
|
||||
"id": 33,
|
||||
"player": "frank",
|
||||
"event_type": "death",
|
||||
"timestamp": "2024-01-07T17:08",
|
||||
"data": {"level": 47, "score_delta": 484, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 34,
|
||||
"player": "diana",
|
||||
"event_type": "logout",
|
||||
"timestamp": "2024-01-26T15:51",
|
||||
"data": {"level": 27, "score_delta": 94, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 35,
|
||||
"player": "alice",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-14T11:27",
|
||||
"data": {"level": 27, "score_delta": 378, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 36,
|
||||
"player": "frank",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-21T03:03",
|
||||
"data": {"level": 26, "score_delta": 247, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 37,
|
||||
"player": "bob",
|
||||
"event_type": "logout",
|
||||
"timestamp": "2024-01-07T17:28",
|
||||
"data": {"level": 9, "score_delta": 332, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 38,
|
||||
"player": "charlie",
|
||||
"event_type": "death",
|
||||
"timestamp": "2024-01-08T02:28",
|
||||
"data": {"level": 36, "score_delta": 0, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 39,
|
||||
"player": "frank",
|
||||
"event_type": "level_up",
|
||||
"timestamp": "2024-01-27T00:05",
|
||||
"data": {"level": 49, "score_delta": 142, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 40,
|
||||
"player": "diana",
|
||||
"event_type": "death",
|
||||
"timestamp": "2024-01-16T06:55",
|
||||
"data": {"level": 26, "score_delta": -40, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 41,
|
||||
"player": "diana",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-13T08:59",
|
||||
"data": {"level": 30, "score_delta": 192, "zone": "pixel_zone_4"},
|
||||
},
|
||||
{
|
||||
"id": 42,
|
||||
"player": "frank",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-26T17:42",
|
||||
"data": {"level": 46, "score_delta": 398, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 43,
|
||||
"player": "bob",
|
||||
"event_type": "kill",
|
||||
"timestamp": "2024-01-07T01:37",
|
||||
"data": {"level": 48, "score_delta": 455, "zone": "pixel_zone_1"},
|
||||
},
|
||||
{
|
||||
"id": 44,
|
||||
"player": "frank",
|
||||
"event_type": "kill",
|
||||
"timestamp": "2024-01-02T01:37",
|
||||
"data": {"level": 31, "score_delta": 414, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 45,
|
||||
"player": "bob",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-17T02:54",
|
||||
"data": {"level": 12, "score_delta": -30, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 46,
|
||||
"player": "alice",
|
||||
"event_type": "item_found",
|
||||
"timestamp": "2024-01-28T07:25",
|
||||
"data": {"level": 8, "score_delta": 483, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 47,
|
||||
"player": "eve",
|
||||
"event_type": "level_up",
|
||||
"timestamp": "2024-01-02T19:05",
|
||||
"data": {"level": 27, "score_delta": 497, "zone": "pixel_zone_5"},
|
||||
},
|
||||
{
|
||||
"id": 48,
|
||||
"player": "eve",
|
||||
"event_type": "kill",
|
||||
"timestamp": "2024-01-30T08:13",
|
||||
"data": {"level": 43, "score_delta": 221, "zone": "pixel_zone_2"},
|
||||
},
|
||||
{
|
||||
"id": 49,
|
||||
"player": "charlie",
|
||||
"event_type": "death",
|
||||
"timestamp": "2024-01-05T21:41",
|
||||
"data": {"level": 20, "score_delta": 368, "zone": "pixel_zone_3"},
|
||||
},
|
||||
{
|
||||
"id": 50,
|
||||
"player": "alice",
|
||||
"event_type": "login",
|
||||
"timestamp": "2024-01-15T19:36",
|
||||
"data": {"level": 7, "score_delta": -25, "zone": "pixel_zone_5"},
|
||||
},
|
||||
]
|
||||
game_data_stream_processor(data)
|
||||
generator_demo()
|
||||
366
03/ex6/ft_analytics_dashboard.py
Normal file
366
03/ex6/ft_analytics_dashboard.py
Normal file
@@ -0,0 +1,366 @@
|
||||
def list_comprehension_example(
|
||||
data: dict[str, dict[str, int | str] | list[dict[str, str | int | bool]]],
|
||||
) -> None:
|
||||
print("=== List Comprehension Examples ===")
|
||||
high_score = [
|
||||
x for x in data["players"] if data["players"][x]["total_score"] > 2000
|
||||
]
|
||||
print(f"High scorers (>2000): {high_score}")
|
||||
scores_doubled = [
|
||||
data["players"][x]["total_score"] * 2 for x in data["players"]
|
||||
]
|
||||
print(f"Scores doubled: {scores_doubled}")
|
||||
active_players = [
|
||||
x
|
||||
for x in data["players"]
|
||||
if data["players"][x]["sessions_played"] > 29
|
||||
]
|
||||
print(f"Active players: {active_players}")
|
||||
|
||||
|
||||
def dict_comprehension_example(
|
||||
data: dict[str, dict[str, int | str] | list[dict[str, str | int | bool]]],
|
||||
) -> None:
|
||||
print("=== Dict Comprehension Examples ===")
|
||||
player_scores = {
|
||||
player: data["players"][player]["total_score"]
|
||||
for player in data["players"]
|
||||
}
|
||||
print(f"Player scores: {player_scores}")
|
||||
score_categories = {category["mode"]: 1 for category in data["sessions"]}
|
||||
print(f"Score categories: {score_categories}")
|
||||
achievements_count = {
|
||||
player: data["players"][player]["achievements_count"]
|
||||
for player in data["players"]
|
||||
}
|
||||
print(f"Achievement counts: {achievements_count}")
|
||||
|
||||
|
||||
def set_comprehension_example(
|
||||
data: dict[str, dict[str, int | str] | list[dict[str, str | int | bool]]],
|
||||
) -> None:
|
||||
print("=== Set Comprehension Examples ===")
|
||||
unique_player: set[str] = {
|
||||
session["player"] for session in data["sessions"]
|
||||
}
|
||||
print(f"Unique player: {unique_player}")
|
||||
unique_achievements: set[str] = {
|
||||
achievement for achievement in data["achievements"]
|
||||
}
|
||||
print(f"unique achievements: {unique_achievements}")
|
||||
available_gamemode: set[str] = {gm for gm in data["game_modes"]}
|
||||
print(f"Available gamemode: {available_gamemode}")
|
||||
|
||||
|
||||
def combined_analysis(
|
||||
data: dict[str, dict[str, int | str] | list[dict[str, str | int | bool]]],
|
||||
) -> None:
|
||||
print("=== combined Analysis ===")
|
||||
unique_player: set[str] = {
|
||||
session["player"] for session in data["sessions"]
|
||||
}
|
||||
print(f"Total player: {len(unique_player)}")
|
||||
unique_achievements: set[str] = {
|
||||
achievement for achievement in data["achievements"]
|
||||
}
|
||||
print(f"Total unique achievements: {len(unique_achievements)}")
|
||||
total_score: list[int] = [session["score"] for session in data["sessions"]]
|
||||
avg_score = sum(total_score) / len(total_score)
|
||||
print(f"Average score: {avg_score:.2f}")
|
||||
performers = {
|
||||
player: data["players"][player]["total_score"]
|
||||
for player in data["players"]
|
||||
}
|
||||
best_player = max(performers, key=performers.get)
|
||||
print(f"Top performer: {best_player}\
|
||||
({data['players'][best_player]['total_score']}\
|
||||
points, {data['players'][best_player]['achievements_count']} achievements)")
|
||||
|
||||
|
||||
def comprehension_tester(
|
||||
data: dict[str, dict[str, int | str] | list[dict[str, str | int | bool]]],
|
||||
) -> None:
|
||||
try:
|
||||
print("=== game Analytics Dashboard ===\n")
|
||||
list_comprehension_example(data)
|
||||
print()
|
||||
dict_comprehension_example(data)
|
||||
print()
|
||||
set_comprehension_example(data)
|
||||
print()
|
||||
combined_analysis(data)
|
||||
except Exception as err:
|
||||
print(err)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
data = {
|
||||
"players": {
|
||||
"alice": {
|
||||
"level": 41,
|
||||
"total_score": 2824,
|
||||
"sessions_played": 13,
|
||||
"favorite_mode": "ranked",
|
||||
"achievements_count": 5,
|
||||
},
|
||||
"bob": {
|
||||
"level": 16,
|
||||
"total_score": 4657,
|
||||
"sessions_played": 27,
|
||||
"favorite_mode": "ranked",
|
||||
"achievements_count": 2,
|
||||
},
|
||||
"charlie": {
|
||||
"level": 44,
|
||||
"total_score": 9935,
|
||||
"sessions_played": 21,
|
||||
"favorite_mode": "ranked",
|
||||
"achievements_count": 7,
|
||||
},
|
||||
"diana": {
|
||||
"level": 3,
|
||||
"total_score": 1488,
|
||||
"sessions_played": 21,
|
||||
"favorite_mode": "casual",
|
||||
"achievements_count": 4,
|
||||
},
|
||||
"eve": {
|
||||
"level": 33,
|
||||
"total_score": 1434,
|
||||
"sessions_played": 81,
|
||||
"favorite_mode": "casual",
|
||||
"achievements_count": 7,
|
||||
},
|
||||
"frank": {
|
||||
"level": 15,
|
||||
"total_score": 8359,
|
||||
"sessions_played": 85,
|
||||
"favorite_mode": "competitive",
|
||||
"achievements_count": 1,
|
||||
},
|
||||
},
|
||||
"sessions": [
|
||||
{
|
||||
"player": "bob",
|
||||
"duration_minutes": 94,
|
||||
"score": 1831,
|
||||
"mode": "competitive",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "bob",
|
||||
"duration_minutes": 32,
|
||||
"score": 1478,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "diana",
|
||||
"duration_minutes": 17,
|
||||
"score": 1570,
|
||||
"mode": "competitive",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "alice",
|
||||
"duration_minutes": 98,
|
||||
"score": 1981,
|
||||
"mode": "ranked",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "diana",
|
||||
"duration_minutes": 15,
|
||||
"score": 2361,
|
||||
"mode": "competitive",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "eve",
|
||||
"duration_minutes": 29,
|
||||
"score": 2985,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "frank",
|
||||
"duration_minutes": 34,
|
||||
"score": 1285,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "alice",
|
||||
"duration_minutes": 53,
|
||||
"score": 1238,
|
||||
"mode": "competitive",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "bob",
|
||||
"duration_minutes": 52,
|
||||
"score": 1555,
|
||||
"mode": "casual",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "frank",
|
||||
"duration_minutes": 92,
|
||||
"score": 2754,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "eve",
|
||||
"duration_minutes": 98,
|
||||
"score": 1102,
|
||||
"mode": "casual",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "diana",
|
||||
"duration_minutes": 39,
|
||||
"score": 2721,
|
||||
"mode": "ranked",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "frank",
|
||||
"duration_minutes": 46,
|
||||
"score": 329,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "charlie",
|
||||
"duration_minutes": 56,
|
||||
"score": 1196,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "eve",
|
||||
"duration_minutes": 117,
|
||||
"score": 1388,
|
||||
"mode": "casual",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "diana",
|
||||
"duration_minutes": 118,
|
||||
"score": 2733,
|
||||
"mode": "competitive",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "charlie",
|
||||
"duration_minutes": 22,
|
||||
"score": 1110,
|
||||
"mode": "ranked",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "frank",
|
||||
"duration_minutes": 79,
|
||||
"score": 1854,
|
||||
"mode": "ranked",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "charlie",
|
||||
"duration_minutes": 33,
|
||||
"score": 666,
|
||||
"mode": "ranked",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "alice",
|
||||
"duration_minutes": 101,
|
||||
"score": 292,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "frank",
|
||||
"duration_minutes": 25,
|
||||
"score": 2887,
|
||||
"mode": "competitive",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "diana",
|
||||
"duration_minutes": 53,
|
||||
"score": 2540,
|
||||
"mode": "competitive",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "eve",
|
||||
"duration_minutes": 115,
|
||||
"score": 147,
|
||||
"mode": "ranked",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "frank",
|
||||
"duration_minutes": 118,
|
||||
"score": 2299,
|
||||
"mode": "competitive",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "alice",
|
||||
"duration_minutes": 42,
|
||||
"score": 1880,
|
||||
"mode": "casual",
|
||||
"completed": False,
|
||||
},
|
||||
{
|
||||
"player": "alice",
|
||||
"duration_minutes": 97,
|
||||
"score": 1178,
|
||||
"mode": "ranked",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "eve",
|
||||
"duration_minutes": 18,
|
||||
"score": 2661,
|
||||
"mode": "competitive",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "bob",
|
||||
"duration_minutes": 52,
|
||||
"score": 761,
|
||||
"mode": "ranked",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "eve",
|
||||
"duration_minutes": 46,
|
||||
"score": 2101,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
{
|
||||
"player": "charlie",
|
||||
"duration_minutes": 117,
|
||||
"score": 1359,
|
||||
"mode": "casual",
|
||||
"completed": True,
|
||||
},
|
||||
],
|
||||
"game_modes": ["casual", "competitive", "ranked"],
|
||||
"achievements": [
|
||||
"first_blood",
|
||||
"level_master",
|
||||
"speed_runner",
|
||||
"treasure_seeker",
|
||||
"boss_hunter",
|
||||
"pixel_perfect",
|
||||
"combo_king",
|
||||
"explorer",
|
||||
],
|
||||
}
|
||||
comprehension_tester(data)
|
||||
Reference in New Issue
Block a user