Untitled

 avatar
unknown
plain_text
a month ago
3.4 kB
6
Indexable
import random
import collections


def generate_random_entries(num_entries):
    """
    Generate a list of entries

    params:
        num_entries     number of entries to return
    returns:
        entires         list of generated entries
    """
    entries = []
    for x in range(num_entries):
        entries.append(
            {
                "name": "test" + str(x),
                "num_tix_requested": random.randint(1,4)
            }
        )
    return entries


def generate_entry_places(entries):
    """
    For each entry in entries, generate a random number
    between 1 and len(entries).
    On collision, regenerate random number until no collision

    params:
        entries                     list of entries
    returns:
        ordered_placed_entries      ordered dict of entries where key
                                    is place and value is entry
    """
    placed_entries = {}
    for entry in entries:
        done = False
        while not done:
            random_place = random.randint(1, len(entries))
            if random_place not in placed_entries:
                placed_entries[random_place] = entry
                done = True
    ordered_placed_entries = collections.OrderedDict(sorted(placed_entries.items()))
    return ordered_placed_entries


def assign_tickets(available_tickets, placed_entries):
    """
    Assign tickets to entries in random order

    params:
        available_tickets       Total # of tickets available
        placed_entries          Entries in random order
    returns:
        assignments             Dictionary of entries with
                                assigned tickets
    """
    assignments = {}
    for entry in placed_entries:
        requested = placed_entries[entry]["num_tix_requested"]
        if available_tickets > 0:
            if available_tickets - requested >= 0:
                assigned = requested
                available_tickets -= assigned
                placed_entries[entry]['assigned'] = assigned
                assignments[entry] = placed_entries[entry]
            elif available_tickets - requested < 0:
                assigned = available_tickets
                placed_entries[entry]['assigned'] = assigned
                assignments[entry] = placed_entries[entry]
                available_tickets -= assigned
        else:
            break
    return assignments

# Enter inputs here
TOTAL_ENTRIES = 1000000
AVAILABLE_TICKETS = 110000

entries = generate_random_entries(TOTAL_ENTRIES)

print("\nEntries in signup order: ")
for entry in entries:
    print(f"Name: {entry['name']} | requested tickets: {entry['num_tix_requested']}")

placed_entries = generate_entry_places(entries)

print("\nEntries in randomized order: ")
for entry in placed_entries:
    print(f"Place: {entry} | Name: {placed_entries[entry]['name']} | requested tickets: {placed_entries[entry]['num_tix_requested']}")

ticket_assignments = assign_tickets(AVAILABLE_TICKETS, placed_entries)

print("\nAllocations: ")
for assignment in ticket_assignments:
    print(f"{assignment} | Entry: {ticket_assignments[assignment]['name']} | Tickets Requested: {ticket_assignments[assignment]['num_tix_requested']} | Tickets Allocated: {ticket_assignments[assignment]['assigned']}")

print(f"\nTotal entries fulfilled: {len(ticket_assignments)} / {TOTAL_ENTRIES}")
Editor is loading...
Leave a Comment