n | def process_input(): | n | def handle_input(): |
| players = {} | | player_data = {} |
| decks = {} | | deck_data = {} |
| while True: | | while True: |
n | inp = input() | n | line = input() |
| if not inp: | | if not line: |
| break | | break |
n | parse_input(inp, players, decks) | n | process_line(line, player_data, deck_data) |
| return (players, decks) | | return (player_data, deck_data) |
| | | |
n | def parse_input(line, players, decks): | n | def process_line(line, player_data, deck_data): |
| part1, part2 = line.split(' / ') | | first, second = line.split(' / ') |
| if part1.isdigit(): | | if first.isdigit(): |
| add_card_to_deck(part1, part2, decks) | | store_card_in_deck(first, second, deck_data) |
| else: | | else: |
n | add_deck_to_player(part1, part2, players) | n | assign_deck_to_player(first, second, player_data) |
| | | |
n | def add_card_to_deck(deck_num, card_name, decks): | n | def store_card_in_deck(deck_id, card_name, deck_data): |
| if deck_num not in decks: | | if deck_id not in deck_data: |
| decks[deck_num] = set() | | deck_data[deck_id] = set() |
| decks[deck_num].add(card_name) | | deck_data[deck_id].add(card_name) |
| | | |
n | def add_deck_to_player(player_name, deck_num, players): | n | def assign_deck_to_player(player_name, deck_id, player_data): |
| if player_name not in players: | | if player_name not in player_data: |
| players[player_name] = set() | | player_data[player_name] = set() |
| players[player_name].add(deck_num) | | player_data[player_name].add(deck_id) |
| | | |
n | def find_largest_pack(players, decks): | n | def identify_largest_pack(player_data, deck_data): |
| max_size = 0 | | largest_pack = 0 |
| result = [] | | top_players = [] |
| for player, player_decks in players.items(): | | for player, decks in player_data.items(): |
| unique_cards = gather_unique_cards(player_decks, decks) | | unique_cards = collect_unique_cards(decks, deck_data) |
| pack_size = len(unique_cards) | | current_pack_size = len(unique_cards) |
| if pack_size > max_size: | | if current_pack_size > largest_pack: |
| max_size = pack_size | | largest_pack = current_pack_size |
| result = [player] | | top_players = [player] |
| elif pack_size == max_size: | | elif current_pack_size == largest_pack: |
| result.append(player) | | top_players.append(player) |
| return sorted(result) | | return sorted(top_players) |
| | | |
n | def gather_unique_cards(player_decks, decks): | n | def collect_unique_cards(player_decks, deck_data): |
| unique_cards = set() | | all_cards = set() |
| for deck in player_decks: | | for deck in player_decks: |
n | if deck in decks: | n | if deck in deck_data: |
| unique_cards.update(decks[deck]) | | all_cards.update(deck_data[deck]) |
| return unique_cards | | return all_cards |
| | | |
t | def main(): | t | def run_program(): |
| players, decks = process_input() | | player_data, deck_data = handle_input() |
| result = find_largest_pack(players, decks) | | top_players = identify_largest_pack(player_data, deck_data) |
| for name in result: | | for player in top_players: |
| print(name) | | print(player) |
| main() | | run_program() |