-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
128 lines (110 loc) · 4.44 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import dill
import numpy as np
from dataclasses import dataclass
from typing import List, Dict, Tuple
import argparse
import time
import os
# Submission = List[Lib] # order: signup
@dataclass(frozen=True)
class LibSubmission:
id: int
books: List[int]
def serialize_lib(lib_submission: LibSubmission) -> str:
print('serializing lib')
first_line = ' '.join((str(lib_submission.id), str(len(lib_submission.books))))
print('first_line done')
second_line = ' '.join(list(map(str, lib_submission.books)))
print('second_line done')
return '\n'.join((first_line, second_line))
def write_submission(lib_submissions: List[LibSubmission], write_path) -> None:
num_libs = len(lib_submissions)
print('num_libs')
s = '\n'.join([str(num_libs), *list(map(serialize_lib, lib_submissions))])
print('s')
with open(write_path, 'w+') as f:
f.write(s)
@dataclass(frozen=True)
class Book():
idx: int
# libraries: List[int]
score: int
@dataclass(frozen=True)
class Library():
idx: int
time_to_signup: int
scan_per_day: int
books_in: List[int]
no_books: int
def parse_args() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--file', type=str, default='./data/d_tough_choices.txt', help='library file to read')
parser.add_argument('--submission', type=str, default='./submission.txt', help='file path to write our submission to')
return parser.parse_args()
def main() -> Tuple[List[Book], List[Library], int]:
args = parse_args()
if not os.path.exists(args.file.replace('.txt', '/')):
os.makedirs(args.file.replace('.txt', '/'))
start = time.time()
books, libraries, meta = read_lib(args.file)
end = time.time()
print(f'finished in {end-start} seconds.')
with open(args.file.replace('.txt', '/') + 'books.dll', 'wb') as file:
dill.dump(books, file)
with open(args.file.replace('.txt', '/') + 'libraries.dll', 'wb') as file:
dill.dump(libraries, file)
with open(args.file.replace('.txt', '/') + 'meta.dll', 'wb') as file:
dill.dump(meta, file)
else:
with open(args.file.replace('.txt', '/') + 'books.dll', 'rb') as file:
books = dill.load(file)
with open(args.file.replace('.txt', '/') + 'libraries.dll', 'rb') as file:
libraries = dill.load(file)
with open(args.file.replace('.txt', '/') + 'meta.dll', 'rb') as file:
meta = dill.load(file)
# print(libraries)
# print(books)
return books, libraries, meta
def read_lib(fpath: str) -> Tuple[List[Book], List[Library], int]:
with open(fpath) as f:
data_str = f.read()
data_lines = data_str.splitlines()
try:
data_num_lists = [list(map(int, line.split(' '))) for line in data_lines]
except ValueError:
data_num_lists = [list(map(int, line.split(' '))) for line in data_lines[:-1]]
print(f'No line provided at the end out of {len(data_lines)}')
(meta, book_scores, *lib_lines) = data_num_lists
(no_books, no_libraries, no_days) = meta
book_ids = list(range(len(book_scores)))
libraries = []
temp_id = 0
for no, line in enumerate(lib_lines):
if no % 2 == 0:
book_id = temp_id
temp_id += 1
(no_books_lib, time_to_signup, scan_per_day) = line
else:
books_in_lib = line
libraries.append(Library(idx=book_id,
time_to_signup=time_to_signup,
scan_per_day=scan_per_day,
books_in=books_in_lib,
no_books=no_books_lib))
books = []
for no, book_id in enumerate(book_ids):
# book_in_libraries = [1 if book_id in library.books_in else 0 for library in libraries]
books.append(Book(idx=book_id, score=book_scores[no]))
# print metadata
print(f'There are {len(data_lines)} lines in submission.')
print(f'There are {no_books} books.')
print(f'There are {no_libraries} libraries.')
print(f'We have {no_days} days available.')
return books, libraries, {'no_days': no_days, 'no_libraries': no_libraries, 'no_books': no_books}
# def print_lib(lib: List[List[int]]) -> None:
# for line in lib:
# for i in line:
# print(i, end=' ')
# print('')
if __name__ == '__main__':
main()