Compare commits
3 Commits
67d9d55cfa
...
bd031debe7
Author | SHA1 | Date |
---|---|---|
Akshay Mankar | bd031debe7 | |
Akshay Mankar | 264846a521 | |
Akshay Mankar | db4b866c76 |
|
@ -0,0 +1,26 @@
|
|||
#+TITLE: Advent of Code 2023
|
||||
#+OPTIONS: toc:nil
|
||||
|
||||
All programs read input from ~stdin~ and print output to ~stdout~. The output will be printed in this format:
|
||||
|
||||
#+BEGIN_SRC
|
||||
Part 1 Answer: <answer1>
|
||||
Part 2 Answer: <answer2>
|
||||
#+END_SRC
|
||||
|
||||
* Haskell
|
||||
|
||||
Run it like this:
|
||||
|
||||
#+BEGIN_SRC bash
|
||||
cabal run aoc2023 -- day<n> < ./input/day<n>
|
||||
#+END_SRC
|
||||
|
||||
* Bash
|
||||
|
||||
Run it like this:
|
||||
|
||||
#+BEGIN_SRC bash
|
||||
./bash/main.sh day<n> < ./input/day<n>
|
||||
#+END_SRC
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
day1 = {
|
||||
part1 = "53194";
|
||||
part2 = "54249";
|
||||
};
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
firstDigits() {
|
||||
sed 's|^[^0-9]*\([0-9]\).*|\1|'
|
||||
}
|
||||
|
||||
lastDigits() {
|
||||
sed 's|^.*\([0-9]\)[^0-9]*$|\1|'
|
||||
}
|
||||
|
||||
sumTensDigits() {
|
||||
echo $(("$(xargs -I '{}' echo '{} * 10 +') 0"))
|
||||
}
|
||||
|
||||
sumOnesDigits() {
|
||||
echo $(("$(xargs -I '{}' echo '{} +') 0"))
|
||||
}
|
||||
|
||||
detectDigits() {
|
||||
sed '
|
||||
s|zero|0|g;
|
||||
|
||||
s|twone|2|g;
|
||||
s|one|1|g;
|
||||
|
||||
s|eightwo|8|g;
|
||||
s|two|2|g;
|
||||
|
||||
s|eighthree|8|g;
|
||||
s|three|3|g;
|
||||
|
||||
s|four|4|g;
|
||||
s|five|5|g;
|
||||
s|six|6|g;
|
||||
s|seven|7|g;
|
||||
|
||||
s|nineight|9|g;
|
||||
s|eight|8|g;
|
||||
|
||||
s|nine|9|g
|
||||
'
|
||||
}
|
||||
|
||||
detectReverseDigits() {
|
||||
sed '
|
||||
s|enorez|1|g
|
||||
s|orez|0|g;
|
||||
|
||||
s|thgieno|8|g;
|
||||
s|eno|1|g;
|
||||
|
||||
s|owt|2|g;
|
||||
|
||||
s|thgieerht|8|g;
|
||||
s|eerht|3|g;
|
||||
|
||||
s|ruof|4|g;
|
||||
|
||||
s|thgievif|8|g;
|
||||
s|evif|5|g;
|
||||
|
||||
s|xis|6|g;
|
||||
|
||||
s|enineves|9|g
|
||||
s|neves|7|g;
|
||||
|
||||
s|thgie|8|g;
|
||||
|
||||
s|enin|9|g
|
||||
'
|
||||
}
|
||||
|
||||
part1 () {
|
||||
local input tensSum onesSum
|
||||
input=$(cat)
|
||||
tensSum=$(<<< "$input" firstDigits | sumTensDigits)
|
||||
onesSum=$(<<< "$input" lastDigits | sumOnesDigits)
|
||||
echo $(("$tensSum + $onesSum"))
|
||||
}
|
||||
|
||||
part2 () {
|
||||
local input tensSum onesSum
|
||||
input=$(cat)
|
||||
tensSum=$(<<< "$input" detectDigits | firstDigits | sumTensDigits)
|
||||
onesSum=$(<<< "$input" rev | detectReverseDigits | firstDigits | sumOnesDigits)
|
||||
echo $(("$tensSum + $onesSum"))
|
||||
}
|
||||
|
||||
main () {
|
||||
local input part1Answer part2Answer
|
||||
input=$(cat)
|
||||
|
||||
part1Answer=$(part1 <<< "$input")
|
||||
echo "Part 1 Answer: $part1Answer"
|
||||
|
||||
part2Answer=$(part2 <<< "$input")
|
||||
echo "Part 2 Answer: $part2Answer"
|
||||
}
|
||||
|
||||
main
|
|
@ -0,0 +1,13 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
|
||||
case "$1" in
|
||||
"day1")
|
||||
"$SCRIPT_DIR/day1.sh"
|
||||
;;
|
||||
*)
|
||||
echo "Invalid day"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
38
flake.nix
38
flake.nix
|
@ -34,6 +34,7 @@
|
|||
ghc94Pkgs = pkgs.haskell.packages.ghc94.override {
|
||||
overrides = ghcOverrides;
|
||||
};
|
||||
answers = import ./answers.nix;
|
||||
in rec {
|
||||
packages = rec {
|
||||
dev-env = ghc94Pkgs.shellFor {
|
||||
|
@ -43,10 +44,43 @@
|
|||
(pkgs.haskell-language-server.override {supportedGhcVersions = ["948"];})
|
||||
pkgs.cabal2nix
|
||||
pkgs.ormolu
|
||||
pkgs.shellcheck
|
||||
];
|
||||
};
|
||||
aoc2023 = ghc94Pkgs.aoc2023;
|
||||
aoc2023-haskell = ghc94Pkgs.aoc2023;
|
||||
aoc2023-bash =
|
||||
let bashDir = pkgs.runCommand "aoc2023-bash" {} ''
|
||||
mkdir $out
|
||||
cp -r ${./bash} $out/bin
|
||||
chmod -R +w $out
|
||||
patchShebangs $out
|
||||
'';
|
||||
in pkgs.writeShellApplication {
|
||||
name = "aoc2023";
|
||||
runtimeInputs = [ pkgs.util-linux ];
|
||||
text = ''
|
||||
${bashDir}/bin/main.sh "''${@}"
|
||||
'';
|
||||
};
|
||||
};
|
||||
checks =
|
||||
let mkCheck = (prefix: exec: day: parts: {
|
||||
name = "${prefix}-${day}";
|
||||
value = pkgs.testers.testEqualContents {
|
||||
assertion = day;
|
||||
expected = pkgs.writeText "expected" ''
|
||||
Part 1 Answer: ${parts.part1}
|
||||
Part 2 Answer: ${parts.part2}
|
||||
'';
|
||||
actual = pkgs.runCommand "actual" {} ''
|
||||
set -x
|
||||
"${exec}" "${day}" < "${./input}/${day}" >$out
|
||||
'';
|
||||
};
|
||||
});
|
||||
|
||||
in pkgs.lib.attrsets.mapAttrs' (mkCheck "haskell" "${packages.aoc2023-haskell}/bin/aoc2023") answers
|
||||
// pkgs.lib.attrsets.mapAttrs' (mkCheck "bash" "${packages.aoc2023-bash}/bin/aoc2023") answers;
|
||||
defaultPackage = packages.dev-env;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue