parent
dd297be17d
commit
cdb12dbc28
145
aoc
Executable file
145
aoc
Executable file
@ -0,0 +1,145 @@
|
||||
#!/bin/zsh
|
||||
|
||||
# usage: source ./aoc
|
||||
|
||||
AOCTZ="America/New_York"
|
||||
AOCSOLS=$([[ $AOCSOLS == "" ]] && echo "$HOME/git/aoc" || echo $AOCSOLS)
|
||||
AOCCOOKIE=$([[ $AOCOOKIE == "" ]] && echo "/tmp/aoc_cookie.txt" || echo $AOCCOOKIE)
|
||||
AOCINPUT=$([[ $AOCINPUT == "" ]] && echo "problem.txt" || echo $AOCINPUT)
|
||||
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
pastecmd="pbpaste"
|
||||
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||
pastecmd="wl-paste"
|
||||
else
|
||||
echo "Unsupported OS"
|
||||
fi
|
||||
|
||||
exec_test() {
|
||||
bun test
|
||||
}
|
||||
|
||||
exec_part() {
|
||||
local logfile="logs/out_$1.txt"
|
||||
bun run "part_$1.ts" | tee $logfile
|
||||
echo $(cat $logfile | tail -n 1)
|
||||
}
|
||||
|
||||
get_aoc_problem_path() {
|
||||
local year=$1
|
||||
local day=$(printf %02d $2)
|
||||
|
||||
echo "aoc_$year/day-$day"
|
||||
}
|
||||
|
||||
get_problem_input() {
|
||||
local cookie=$1
|
||||
local year=$2
|
||||
local day=$3
|
||||
local out=$4
|
||||
local url="https://adventofcode.com/$year/day/$day/input"
|
||||
echo "Querying $url and saving to $out..."
|
||||
curl --silent --cookie "session=$cookie" $url > $out
|
||||
}
|
||||
|
||||
submit_problem() {
|
||||
local cookie=$1
|
||||
local year=$2
|
||||
local day=$3
|
||||
local level=$4
|
||||
local answer=$(jq -rn --arg x $5 '$x|@uri')
|
||||
local url="https://adventofcode.com/$year/day/$day/answer"
|
||||
|
||||
echo "Submitting..."
|
||||
local submission=$(curl --silent --cookie "session=$cookie" -X POST $url \
|
||||
-H "Content-Type: application/x-www-form-urlencoded" \
|
||||
-d "level=$level&answer=$answer")
|
||||
echo $submission | pcregrep -o1 -M '<article><p>([\s\S]*?)<\/p><\/article>'
|
||||
}
|
||||
|
||||
get_aoc_cookie() {
|
||||
if [[ ! -f "$AOCCOOKIE" ]]; then
|
||||
echo "Please copy your Advent of Code cookie to the clipboard, then press Enter..."
|
||||
read -r
|
||||
|
||||
echo "$(pastecmd)" > "$AOCCOOKIE"
|
||||
echo "Cookie saved to $AOCCOOKIE"
|
||||
fi
|
||||
echo $(cat $AOCCOOKIE | tail -n 1)
|
||||
}
|
||||
|
||||
aoc() {
|
||||
local argc=$#
|
||||
|
||||
if [[ $argc -eq "0" ]]; then
|
||||
echo "/==============================\\"
|
||||
echo "| simponic's bun ts aoc helper |"
|
||||
echo "\\==============================/"
|
||||
echo "+ aoc cookie: get cookie and store to '$AOCCOOKIE'"
|
||||
echo "+ aoc init <? year day>: initialize 'template/' to problem solution and"
|
||||
echo " pull input to '$AOCINPUT' (today by default)"
|
||||
echo "+ aoc test <? year day>: run 'exec_test' in aoc problem (today by default)"
|
||||
echo "+ aoc submit <1 | 2> <? year day>: submit part one or part two to aoc problem (today by default)"
|
||||
fi
|
||||
|
||||
cd $AOCSOLS
|
||||
|
||||
local prevcwd=$PWD
|
||||
local year=$(TZ="$AOCTZ" date +"%Y")
|
||||
local day=$(TZ="$AOCTZ" date +"%d")
|
||||
local curr=$(get_aoc_problem_path $year $day)
|
||||
|
||||
if [[ $1 == "init" ]]; then
|
||||
if [[ 3 == $argc ]]; then
|
||||
year=$2
|
||||
day=$3
|
||||
curr=$(get_aoc_problem_path $year $day)
|
||||
fi
|
||||
|
||||
if [[ ! -d $curr ]]; then
|
||||
mkdir -p $curr
|
||||
|
||||
cp -r template/* $curr
|
||||
get_problem_input $(get_aoc_cookie) $year $day $AOCINPUT
|
||||
|
||||
echo "Initialized $curr"
|
||||
else
|
||||
echo "Nothing to initialize"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $1 == "test" ]]; then
|
||||
if [[ 3 == $argc ]]; then
|
||||
year=$2
|
||||
day=$3
|
||||
curr=$(get_aoc_problem_path $year $day)
|
||||
fi
|
||||
if [[ ! -d $curr ]]; then
|
||||
aoc init $year $day
|
||||
fi
|
||||
|
||||
exec_test
|
||||
fi
|
||||
|
||||
if [[ $1 == "submit" ]]; then
|
||||
if [[ 4 == $argc ]]; then
|
||||
year=$3
|
||||
day=$4
|
||||
curr=$(get_aoc_problem_path $year $day)
|
||||
fi
|
||||
cd $curr
|
||||
|
||||
local level=$2
|
||||
local output=$(exec_part $level | tail -n 1)
|
||||
|
||||
echo "..====.."
|
||||
echo "Submitting Answer=($output)"
|
||||
submit_problem $(get_aoc_cookie) $year $day $level $output
|
||||
fi
|
||||
|
||||
if [[ $1 == "cookie" ]]; then
|
||||
get_aoc_cookie
|
||||
fi
|
||||
|
||||
cd $prevcwd
|
||||
}
|
File diff suppressed because it is too large
Load Diff
2000
problem.txt
Normal file
2000
problem.txt
Normal file
File diff suppressed because it is too large
Load Diff
18
template/example.test.ts
Normal file
18
template/example.test.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { expect, test } from "bun:test";
|
||||
import { main as part1 } from "./part_1";
|
||||
import { main as part2 } from "./part_2";
|
||||
|
||||
// const example = ``;
|
||||
const example = `1 2 3 4 5`.split(" ");
|
||||
|
||||
test("part1", async () => {
|
||||
const answer = 5;
|
||||
const res = await part1(example);
|
||||
expect(res).toEqual(answer);
|
||||
});
|
||||
|
||||
test("part2", async () => {
|
||||
const answer = 5 + 5;
|
||||
const res = await part2(example);
|
||||
expect(res).toEqual(answer);
|
||||
});
|
0
template/logs/.gitkeep
Normal file
0
template/logs/.gitkeep
Normal file
26
template/part_1.ts
Normal file
26
template/part_1.ts
Normal file
@ -0,0 +1,26 @@
|
||||
export const main = async (
|
||||
lines: string[]
|
||||
): Promise<number | string> => {
|
||||
const answer = lines.length;
|
||||
|
||||
// delete me!
|
||||
console.log(lines);
|
||||
|
||||
return answer;
|
||||
};
|
||||
|
||||
const isrun = process.argv.length > 1 && process.argv[1] === import.meta.path;
|
||||
if (isrun) {
|
||||
const file = Bun.file("./problem.txt");
|
||||
const text = await file.text();
|
||||
const lines = text.split("\n");
|
||||
|
||||
console.log("=== COMPUTATION ===\n");
|
||||
|
||||
const answer = await main(lines);
|
||||
|
||||
console.log("\n=== /COMPUTATION ===\n");
|
||||
|
||||
console.log("=== ANSWER TO P1 ===");
|
||||
console.log(answer);
|
||||
}
|
27
template/part_2.ts
Normal file
27
template/part_2.ts
Normal file
@ -0,0 +1,27 @@
|
||||
export const main = async (
|
||||
lines: string[]
|
||||
): Promise<number | string> => {
|
||||
const answer = lines.length;
|
||||
|
||||
// delete me!
|
||||
console.log(lines);
|
||||
|
||||
return answer + 5;
|
||||
};
|
||||
|
||||
const isrun = process.argv.length > 1 && process.argv[1] === import.meta.path;
|
||||
if (isrun) {
|
||||
const file = Bun.file("./problem.txt");
|
||||
const text = await file.text();
|
||||
const lines = text.split("\n");
|
||||
|
||||
console.log("=== COMPUTATION ===\n");
|
||||
|
||||
const answer = await main(lines);
|
||||
|
||||
console.log("\n=== /COMPUTATION ===\n");
|
||||
|
||||
console.log("=== ANSWER TO P2 ===");
|
||||
console.log(answer);
|
||||
}
|
||||
|
5
template/problem.txt
Normal file
5
template/problem.txt
Normal file
@ -0,0 +1,5 @@
|
||||
this
|
||||
file
|
||||
has
|
||||
5
|
||||
lines
|
Loading…
x
Reference in New Issue
Block a user