Skip to content

Commit 1a1bf87

Browse files
committed
2017
1 parent 1080e92 commit 1a1bf87

File tree

4 files changed

+136
-9
lines changed

4 files changed

+136
-9
lines changed

2017/Cargo.toml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
# http://adventofcode.com/2017
22

33
[workspace]
4-
members = ["day1", "day2", "day8", "day10", "day11", "day13", "day14", "day15", "day16", "day17", "day18", "day23"]
4+
members = [
5+
"day1",
6+
"day2",
7+
"day5",
8+
"day8",
9+
"day10",
10+
"day11",
11+
"day13",
12+
"day14",
13+
"day15",
14+
"day16",
15+
"day17",
16+
"day18",
17+
"day23",
18+
]
519

620
resolver = "2"

2017/day5/Cargo.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[package]
2+
name = "day5"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
aoc = { path = "../../aoc" }
8+
9+
[[bin]]
10+
name = "day5"
11+
path = "day5.rs"

2017/day5/day5.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//! [Day 5: A Maze of Twisty Trampolines, All Alike](https://adventofcode.com/2017/day/5)
2+
3+
struct Puzzle {
4+
jumps: Vec<i32>,
5+
}
6+
7+
impl Puzzle {
8+
fn new() -> Puzzle {
9+
Puzzle { jumps: vec![] }
10+
}
11+
12+
/// Get the puzzle input.
13+
fn configure(&mut self, path: &str) {
14+
let data = std::fs::read_to_string(path).unwrap();
15+
16+
self.jumps = data.lines().map(|s| s.parse().unwrap()).collect();
17+
}
18+
19+
/// Solve part one.
20+
fn part1(&self) -> u32 {
21+
let mut jumps = self.jumps.clone();
22+
let length = i32::try_from(jumps.len()).unwrap();
23+
let mut offset = 0;
24+
let mut n = 0;
25+
26+
while 0 <= offset && offset < length {
27+
let index = usize::try_from(offset).unwrap();
28+
29+
let jump = jumps[index];
30+
jumps[index] += 1;
31+
32+
offset += jump;
33+
n += 1;
34+
}
35+
36+
n
37+
}
38+
39+
/// Solve part two.
40+
fn part2(&self) -> u32 {
41+
let mut jumps = self.jumps.clone();
42+
let length = i32::try_from(jumps.len()).unwrap();
43+
let mut offset = 0;
44+
let mut n = 0;
45+
46+
while 0 <= offset && offset < length {
47+
let index = usize::try_from(offset).unwrap();
48+
49+
let jump = jumps[index];
50+
if jump >= 3 {
51+
jumps[index] -= 1;
52+
} else {
53+
jumps[index] += 1;
54+
}
55+
56+
offset += jump;
57+
n += 1;
58+
}
59+
60+
n
61+
}
62+
}
63+
64+
fn main() {
65+
let args = aoc::parse_args();
66+
let mut puzzle = Puzzle::new();
67+
puzzle.configure(args.path.as_str());
68+
println!("{}", puzzle.part1());
69+
println!("{}", puzzle.part2());
70+
}
71+
72+
/// Test from puzzle input
73+
#[cfg(test)]
74+
mod test {
75+
use super::*;
76+
77+
#[test]
78+
fn test01() {
79+
let mut puzzle = Puzzle::new();
80+
puzzle.configure("test.txt");
81+
assert_eq!(puzzle.part1(), 5);
82+
}
83+
84+
#[test]
85+
fn test02() {
86+
let mut puzzle = Puzzle::new();
87+
puzzle.configure("test.txt");
88+
assert_eq!(puzzle.part2(), 10);
89+
}
90+
}

scripts/runall.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
from datetime import timedelta, datetime
1212
from operator import itemgetter
1313
from pathlib import Path
14-
from zlib import crc32
14+
15+
# from zlib import crc32
1516
import sqlite3
1617
import shutil
18+
import hashlib
1719

1820
RED = "\033[91m"
1921
GREEN = "\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

432442
def 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

Comments
 (0)