Compare commits

...

3 Commits

Author SHA1 Message Date
Akshay Mankar bd031debe7
nix: Add checks 2023-12-01 14:34:41 +01:00
Akshay Mankar 264846a521
README 2023-12-01 14:31:54 +01:00
Akshay Mankar db4b866c76
[bash] Solve Day 1 2023-12-01 14:31:43 +01:00
5 changed files with 183 additions and 2 deletions

26
README.org Normal file
View File

@ -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

6
answers.nix Normal file
View File

@ -0,0 +1,6 @@
{
day1 = {
part1 = "53194";
part2 = "54249";
};
}

102
bash/day1.sh Executable file
View File

@ -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

13
bash/main.sh Executable file
View File

@ -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

View File

@ -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;
});
});
}