forked from andsir/the-final-cl-test
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.8 KiB
149 lines
4.8 KiB
import os |
|
import re |
|
|
|
crime_separator = '*******\nCrime' |
|
not_sus_regex = r"[Nn][o\']t[ a-z]*sus" |
|
not_sus = re.compile(not_sus_regex, re.IGNORECASE) |
|
people = dict() |
|
companies = set() |
|
wonderful_blacklist = {'alice', 'hatter', 'rabbit', 'march mare'} |
|
# in_to_cm('6\'0"') == 182.88 |
|
|
|
|
|
class Person: |
|
def __init__(self, name): |
|
n = name.strip().split() |
|
if len(n) > 2: |
|
print(name) |
|
self.first = n[0] |
|
self.last = n[1] |
|
self.memberships = set() |
|
self.gender = None |
|
self.age = None |
|
self.not_sus = None |
|
self.addr = None |
|
self.interview = None |
|
self.height = None |
|
self.weight = None |
|
self.plate = None |
|
self.make = None |
|
self.color = None |
|
|
|
def add_member(self, comp): |
|
self.memberships.add(comp) |
|
|
|
def __repr__(self): |
|
out = list() |
|
for i in sorted(filter(lambda x: x[0] != '_', dir(self))): |
|
if not callable(eval('self.' + i)): |
|
out.append(': '.join([i, str(eval('self.' + i))])) |
|
return '\n'.join(out) |
|
|
|
|
|
def in_to_cm(inch): |
|
return round(int(inch.split('\'')[0]) * 30.48 + int(inch.split('\'')[1][:-1]) * 2.54, 2) |
|
|
|
|
|
def lb_to_kg(lb): |
|
return round(int(lb.split()[0]) * 0.4536, 2) |
|
|
|
|
|
def check_wonders(x): |
|
x = x.lower() |
|
for alice in wonderful_blacklist: |
|
if alice in x: |
|
return False |
|
return True |
|
|
|
|
|
def format_output(field): |
|
if not field: |
|
return '' |
|
elif type(field) in {list, tuple}: |
|
return ', '.join(list(map(format_output, field))) |
|
elif type(field) in {set}: |
|
return ', '.join(list(map(format_output, sorted(field)))) |
|
elif type(field) is float: |
|
return str(field).replace('.', ',') |
|
else: |
|
return str(field).replace('\n', ' ') |
|
|
|
|
|
with open(r'mystery\crimescene') as f: |
|
scene = filter(lambda x: check_wonders(x), f.read().split(crime_separator)) |
|
|
|
with open(r'mystery\crimescene2', 'w') as f: |
|
t = list(sorted(scene, key=lambda x: (not 'clue' in x.lower(), x)))[:10] |
|
t = crime_separator + crime_separator.join(t) |
|
print(t.replace('\n\n\n', '\n'), file=f) |
|
|
|
addresses = dict() |
|
for streetname in os.listdir(r'mystery\streets'): |
|
with open(r'mystery\streets' + '\\' + streetname) as f: |
|
street = f.readlines() |
|
ints = set() |
|
for nr in range(len(street)): |
|
if 'SEE INTER' in street[nr]: |
|
ints.add((streetname, nr + 1, street[nr].strip().split('#')[1])) |
|
for inter in ints: |
|
intr = inter[2] |
|
with open(r'mystery\interviews\interview-' + intr) as inf: |
|
inview = inf.read().strip().lower().replace('\n', ' ') |
|
ns = bool(not_sus.findall(inview)) |
|
# if ns: print(inview) |
|
streetname = inter[0].replace('_', ' ') |
|
addresses[(streetname, str(inter[1]))] = {'ns': ns, 'interv': inview} |
|
|
|
for comp in os.listdir(r'mystery\memberships'): |
|
with open(r'mystery\memberships' + '\\' + comp) as f: |
|
for name in f: |
|
name = name.strip() |
|
if name not in people: |
|
people[name] = Person(name) |
|
people[name].add_member(comp) |
|
|
|
with open(r'mystery\people') as f: |
|
for line in f.readlines()[8:]: |
|
name, g, age, addr = line.strip().split('\t') |
|
name = name.strip() |
|
if name not in people: |
|
people[name] = Person(name) |
|
people[name].age = age.strip() |
|
people[name].gender = g.strip() |
|
people[name].addr = tuple(addr.split(', line ')) |
|
if people[name].addr in addresses: |
|
people[name].interview = addresses[people[name].addr]['interv'] |
|
people[name].not_sus = addresses[people[name].addr]['ns'] |
|
|
|
with open(r'mystery\vehicles') as f: |
|
for car in f.read().split('\n\n')[1:]: |
|
t = list(map(lambda x: x.replace('se Plate', 'te:').split(': ')[1].strip(), car.strip().split('\n'))) |
|
plate, make, color, name, hei, wei = t |
|
if name not in people: |
|
people[name] = Person(name) |
|
people[name].height = in_to_cm(hei) |
|
people[name].weight = lb_to_kg(wei) |
|
people[name].plate = plate |
|
people[name].make = make |
|
people[name].color = color |
|
|
|
f = open('people.csv', 'w') |
|
print('Full name;First;Last;G;Height;Age;Weight;Address;Sus;Make;Color;Plate;Membership;Interview', file=f) |
|
for name in sorted(people): |
|
output_row = [name] |
|
pp = people[name] |
|
output_row.append(pp.first) |
|
output_row.append(pp.last) |
|
output_row.append(pp.gender) |
|
output_row.append(pp.height) |
|
output_row.append(pp.age) |
|
output_row.append(pp.weight) |
|
output_row.append(pp.addr) |
|
output_row.append(pp.not_sus) |
|
output_row.append(pp.make) |
|
output_row.append(pp.color) |
|
output_row.append(pp.plate) |
|
output_row.append(pp.memberships) |
|
output_row.append(pp.interview) |
|
print(*list(map(format_output, output_row)), sep=';', file=f) |
|
f.close()
|
|
|