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.
136 lines
4.8 KiB
136 lines
4.8 KiB
3 years ago
|
import os, re
|
||
|
#for itm in os.listdir('mystery'):
|
||
|
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()
|
||
|
# 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)
|
||
|
wonderful_blacklist={'alice','hatter','rabbit','march mare'}
|
||
|
def check_wonders(x):
|
||
|
x=x.lower()
|
||
|
for alice in wonderful_blacklist:
|
||
|
if alice in x:
|
||
|
return False
|
||
|
return True
|
||
|
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=list(filter(lambda x: 'SEE INTER' in x, 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']
|
||
|
# else:print(people[name].addr, list(addresses)[4])
|
||
|
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
|
||
|
|
||
|
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', ' ')
|
||
|
|
||
|
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()
|