1111from datetime import timedelta , datetime
1212from operator import itemgetter
1313from pathlib import Path
14- from zlib import crc32
14+
15+ # from zlib import crc32
1516import sqlite3
1617import shutil
18+ import hashlib
1719
1820RED = "\033 [91m"
1921GREEN = "\033 [92m"
@@ -151,8 +153,10 @@ def run(
151153 # under macOS, the first launch of a Rust program is slower (why ???)
152154 subprocess .call (cmd + ["--help" ], stdout = subprocess .DEVNULL )
153155
156+ cmd .append (file .absolute ().as_posix ())
157+
154158 start = time .time_ns ()
155- out = subprocess .run (cmd + [ file . absolute ()] , stdout = subprocess .PIPE )
159+ out = subprocess .run (cmd , stdout = subprocess .PIPE )
156160 elapsed = time .time_ns () - start
157161 answers = " " .join (out .stdout .decode ().strip ().split ("\n " ))
158162
@@ -172,7 +176,8 @@ def run(
172176 result = {"elapsed" : elapsed , "status" : status , "answers" : answers }
173177
174178 with Path ("run.log" ).open ("at" ) as f :
175- line = f"{ datetime .now ()} { lang } { cmd } { file .absolute ()} { elapsed } { status } '{ solution or '' } ' '{ answers } '"
179+ line = f"{ datetime .now ()} { lang } { cmd } { elapsed / 1e9 } { status } '{ answers } '"
180+ line = line .replace (Path (__file__ ).parent .parent .as_posix () + "/" , "" )
176181 print (line , file = f )
177182
178183 return result
@@ -219,7 +224,7 @@ def build_all(filter_year: int):
219224 make (year , src , f"day{ day } _cpp" , "c++ -std=c++17" )
220225
221226
222- def load_data (filter_year , filter_user ):
227+ def load_data (filter_year , filter_user , filter_yearday ):
223228 inputs = defaultdict (dict )
224229 solutions = defaultdict (dict )
225230
@@ -241,13 +246,18 @@ def load_data(filter_year, filter_user):
241246 if filter_year != 0 and year != filter_year :
242247 continue
243248
249+ if filter_yearday and f"{ year } :{ day } " in filter_yearday :
250+ continue
251+
244252 key = f"{ year } :{ day } :{ user } "
245253
246254 e = check_cache (key , f , "inputs" , ("crc32" ,))
247255 if e :
248256 crc = e ["crc32" ]
249257 else :
250- crc = hex (crc32 (f .read_bytes ().strip ()) & 0xFFFFFFFF )
258+ # crc = hex(crc32(f.read_bytes().strip()) & 0xFFFFFFFF)
259+ crc = hashlib .sha256 (f .read_bytes ().strip ()).hexdigest ()
260+
251261 update_cache (key , f , "inputs" , {"crc32" : crc })
252262
253263 if crc not in inputs [year , day ]:
@@ -430,13 +440,15 @@ def install_venv(interpreter: Path):
430440
431441
432442def main ():
433- parser = argparse .ArgumentParser ()
443+ parser = argparse .ArgumentParser (formatter_class = lambda prog : argparse .HelpFormatter (prog , max_help_position = 28 ))
444+
434445 parser .add_argument ("--venv" , type = Path , help = "install virtual environment" )
435446 parser .add_argument ("-l" , "--language" , type = str , action = "append" , metavar = "LANG" , help = "filter by language" )
447+ parser .add_argument ("-x" , "--exclude" , type = str , action = "append" , metavar = "Y:D" , help = "exclude day" )
436448 parser .add_argument ("-r" , "--refresh" , action = "store_true" , help = "relaunch solutions" )
437449 parser .add_argument ("-n" , "--dry-run" , action = "store_true" , help = "do not run" )
438450 parser .add_argument ("--no-build" , action = "store_true" , help = "do not build" )
439- parser .add_argument ("-u" , "--user" , dest = "filter_user" , type = str , help = "filter by user id" )
451+ parser .add_argument ("-u" , "--user" , dest = "filter_user" , metavar = "USER" , type = str , help = "filter by user id" )
440452 parser .add_argument ("n" , type = int , nargs = "*" , help = "filter by year or year/day" )
441453
442454 args = parser .parse_args ()
@@ -459,7 +471,7 @@ def main():
459471
460472 languages = get_languages (args .language )
461473
462- inputs , sols = load_data (filter_year , args .filter_user )
474+ inputs , sols = load_data (filter_year , args .filter_user , args . exclude )
463475
464476 for year in range (2015 , 2024 ):
465477 if filter_year != 0 and year != filter_year :
0 commit comments