Skip to content

Instantly share code, notes, and snippets.

@Artanis
Created January 18, 2012 07:06
Show Gist options
  • Save Artanis/1631669 to your computer and use it in GitHub Desktop.
Save Artanis/1631669 to your computer and use it in GitHub Desktop.
Quick script tracking Wish Big Win Big tickets
# 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