Created
January 18, 2012 07:06
-
-
Save Artanis/1631669 to your computer and use it in GitHub Desktop.
Quick script tracking Wish Big Win Big tickets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# System Modules | |
from collections import OrderedDict, defaultdict | |
from itertools import chain | |
import json | |
# External Modules | |
# Local Modules | |
class Prize: | |
def __init__(self, name, tickets): | |
self.name = name | |
self.tickets = set(tickets) | |
find.listeners.add(self.listen) | |
def completion(self, owned_tickets): | |
owned_tickets = set(owned_tickets) | |
completed = self.tickets & owned_tickets | |
missing = completed ^ self.tickets | |
return (len(completed) / len(self.tickets), sorted(missing)) | |
def listen(self, ticket_number): | |
if ticket_number in self.tickets: | |
return self | |
else: | |
return None | |
def __str__(self): | |
return self.name | |
def __repr__(self): | |
return "Prize({0.name!r}, {0.tickets})".format(self) | |
def only(iterable): | |
iterable = list(iterable) | |
if len(iterable) != 1: | |
raise ValueError( | |
"iterable must be length 1, got length {0}".format( | |
len(iterable))) | |
return iterable[0] | |
def get_ticket(): | |
raw = input("Ticket Number: ") | |
try: | |
num = int(raw) | |
except ValueError: | |
num = None | |
return (raw, num) | |
def find(number): | |
call = (fn(number) for fn in find.listeners) | |
try: | |
prize = only(p for p in call if p is not None) | |
except ValueError: | |
print("No matching ticket found.") | |
prize = None | |
return prize | |
find.listeners = set() | |
def main(): | |
with open("prizes.json", "r") as json_prizes: | |
raw_prizes = json.loads(json_prizes.read()) | |
prizes = [Prize(**kw) for kw in raw_prizes['prizes']] | |
with open("tickets.json", "r") as json_tickets: | |
owned_tickets = json.loads(json_tickets.read()) | |
def check(ticket): | |
if ticket in owned_tickets['tickets']: | |
return False | |
else: | |
return True | |
try: | |
while True: | |
raw, ticket = get_ticket() | |
if raw in ("quit", "q"): | |
break | |
elif ticket is not None: | |
prize = find(ticket) | |
if prize is None: | |
continue | |
elif check(ticket): | |
print("New for {0}. Keeping {1}.".format(prize, ticket)) | |
owned_tickets['tickets'].append(ticket) | |
else: | |
print("Duplicate.") | |
except: | |
raise | |
finally: | |
fmt = "{0} (missing {1}; {2}%)".format | |
for p in prizes: | |
perc, missing = p.completion(owned_tickets['tickets']) | |
print(fmt(p, missing, perc*100)) | |
with open("tickets.json", "w") as json_tickets: | |
print("Writing owned tickets to file.", end='') | |
json_tickets.write(json.dumps(owned_tickets)) | |
print(".. done.") | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment