2024 day 1
This commit is contained in:
parent
8cbfa778c2
commit
7431115e8e
6
2024/01/example.txt
Normal file
6
2024/01/example.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3
|
59
2024/01/flake.lock
Normal file
59
2024/01/flake.lock
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1732837521,
|
||||||
|
"narHash": "sha256-jNRNr49UiuIwaarqijgdTR2qLPifxsVhlJrKzQ8XUIE=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "970e93b9f82e2a0f3675757eb0bfc73297cc6370",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1703013332,
|
||||||
|
"narHash": "sha256-+tFNwMvlXLbJZXiMHqYq77z/RfmpfpiI3yjL6o/Zo9M=",
|
||||||
|
"path": "/nix/store/50bgi74d890mpkp90w1jwc5g0dw4dccr-source",
|
||||||
|
"rev": "54aac082a4d9bb5bbc5c4e899603abfb76a3f6d6",
|
||||||
|
"type": "path"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"tix": "tix"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1704309534,
|
||||||
|
"narHash": "sha256-U9qeMl0WBlpy335gL06WFGvPxLBTd+ToiiCHUHWrgR0=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "5007770e88c4d5f67c3790761a1125904a9ef257",
|
||||||
|
"revCount": 20,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.tristans.cloud/tristan/tix"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.tristans.cloud/tristan/tix"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
31
2024/01/flake.nix
Normal file
31
2024/01/flake.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
description = "A very basic flake";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||||
|
tix.url = "git+https://git.tristans.cloud/tristan/tix";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, tix }: let
|
||||||
|
pkgs = import nixpkgs {system = "x86_64-linux";};
|
||||||
|
p1 = import ./part1.nix pkgs;
|
||||||
|
in {
|
||||||
|
|
||||||
|
part1example = (p1 {file = ./example.txt;}).result;
|
||||||
|
part1 = (p1 {file = ./input.txt;}).result;
|
||||||
|
|
||||||
|
part2example = (p1 {file = ./example.txt;}).part2result;
|
||||||
|
part2 = (p1 {file = ./input.txt;}).part2result;
|
||||||
|
|
||||||
|
packages.x86_64-linux.watch = tix.watch {
|
||||||
|
cmd = ''
|
||||||
|
nix run .\#test --impure --extra-experimental-features pipe-operators
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
packages.x86_64-linux.test = tix.run [
|
||||||
|
./part1.test.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
1000
2024/01/input.txt
Normal file
1000
2024/01/input.txt
Normal file
File diff suppressed because it is too large
Load diff
42
2024/01/part1.nix
Normal file
42
2024/01/part1.nix
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{lib, ...}: {file}: rec {
|
||||||
|
rawContent = builtins.readFile file;
|
||||||
|
content = lib.strings.removeSuffix "\n" rawContent;
|
||||||
|
lines = lib.strings.splitString "\n" content;
|
||||||
|
getLeftAndRight = s: s
|
||||||
|
|> lib.strings.splitString " "
|
||||||
|
|> map lib.strings.toInt
|
||||||
|
;
|
||||||
|
splitLists = s: s
|
||||||
|
|> map getLeftAndRight
|
||||||
|
|> builtins.foldl'
|
||||||
|
(prev: next: {
|
||||||
|
left = prev.left ++ [(builtins.elemAt next 0)];
|
||||||
|
right = prev.right ++ [ ( builtins.elemAt next 1 ) ];})
|
||||||
|
{left = []; right = [];}
|
||||||
|
;
|
||||||
|
sortLists = l: {
|
||||||
|
left = lib.lists.sort (a: b: a < b) l.left;
|
||||||
|
right = lib.lists.sort (a: b: a < b) l.right;
|
||||||
|
};
|
||||||
|
distance = l: l
|
||||||
|
|> sortLists
|
||||||
|
|> ({left, right}: lib.zipListsWith (ln: rn: abs (ln - rn)) left right)
|
||||||
|
;
|
||||||
|
total = l: builtins.foldl' (x: y: x+y) 0 l;
|
||||||
|
abs = n: if n > 0 then n else -n;
|
||||||
|
getDiff = s: s
|
||||||
|
|> splitLists
|
||||||
|
|> distance
|
||||||
|
|> total
|
||||||
|
;
|
||||||
|
similarity = l: l
|
||||||
|
|> ({left, right}: map (ln: ln * lib.count (rn: ln == rn) right) left)
|
||||||
|
;
|
||||||
|
getSimilarity = s: s
|
||||||
|
|> splitLists
|
||||||
|
|> similarity
|
||||||
|
|> total
|
||||||
|
;
|
||||||
|
result = getDiff lines;
|
||||||
|
part2result = getSimilarity lines;
|
||||||
|
}
|
100
2024/01/part1.test.nix
Normal file
100
2024/01/part1.test.nix
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
{describe, it, ...}:
|
||||||
|
let
|
||||||
|
pkgs = import <nixpkgs> {};
|
||||||
|
part1 = import ./part1.nix pkgs;
|
||||||
|
part1example = (part1 {file = ./example.txt;});
|
||||||
|
in [
|
||||||
|
(describe "part1" [
|
||||||
|
(it "gets file content" {
|
||||||
|
expected = ''
|
||||||
|
3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3'';
|
||||||
|
actual = part1example.content;
|
||||||
|
})
|
||||||
|
(it "splits lines" {
|
||||||
|
expected = [
|
||||||
|
"3 4"
|
||||||
|
"4 3"
|
||||||
|
"2 5"
|
||||||
|
"1 3"
|
||||||
|
"3 9"
|
||||||
|
"3 3"
|
||||||
|
];
|
||||||
|
actual = part1example.lines;
|
||||||
|
})
|
||||||
|
(it "splits left and right" {
|
||||||
|
expected = [
|
||||||
|
3 4
|
||||||
|
];
|
||||||
|
actual = part1example.getLeftAndRight "3 4";
|
||||||
|
})
|
||||||
|
(it "splits list into left and right" {
|
||||||
|
expected = {
|
||||||
|
left = [ 3 4 2 1 3 3 ];
|
||||||
|
right = [ 4 3 5 3 9 3 ];
|
||||||
|
};
|
||||||
|
actual = part1example.splitLists [
|
||||||
|
"3 4"
|
||||||
|
"4 3"
|
||||||
|
"2 5"
|
||||||
|
"1 3"
|
||||||
|
"3 9"
|
||||||
|
"3 3"
|
||||||
|
];
|
||||||
|
})
|
||||||
|
(it "splits list into left and right" {
|
||||||
|
expected = {
|
||||||
|
left = [ 1 2 3 3 3 4 ];
|
||||||
|
right = [ 3 3 3 4 5 9 ];
|
||||||
|
};
|
||||||
|
actual = part1example.sortLists {
|
||||||
|
left = [ 3 4 2 1 3 3 ];
|
||||||
|
right = [ 4 3 5 3 9 3 ];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
(it "calculates the distance between each item" {
|
||||||
|
expected = [2 1 0 1 2 5];
|
||||||
|
actual = part1example.distance {
|
||||||
|
left = [ 3 4 2 1 3 3 ];
|
||||||
|
right = [ 4 3 5 3 9 3 ];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
(it "calculates the total" {
|
||||||
|
expected = 11;
|
||||||
|
actual = part1example.total [2 1 0 1 2 5];
|
||||||
|
})
|
||||||
|
(it "gets diff of list of strings" {
|
||||||
|
expected = 11;
|
||||||
|
actual = part1example.getDiff [
|
||||||
|
"3 4"
|
||||||
|
"4 3"
|
||||||
|
"2 5"
|
||||||
|
"1 3"
|
||||||
|
"3 9"
|
||||||
|
"3 3"
|
||||||
|
];
|
||||||
|
})
|
||||||
|
(it "gets similarity" {
|
||||||
|
expected = [9 4 0 0 9 9];
|
||||||
|
actual = part1example.similarity {
|
||||||
|
left = [ 3 4 2 1 3 3 ];
|
||||||
|
right = [ 4 3 5 3 9 3 ];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
(it "gets similarity of list of strings" {
|
||||||
|
expected = 31;
|
||||||
|
actual = part1example.getSimilarity [
|
||||||
|
"3 4"
|
||||||
|
"4 3"
|
||||||
|
"2 5"
|
||||||
|
"1 3"
|
||||||
|
"3 9"
|
||||||
|
"3 3"
|
||||||
|
];
|
||||||
|
})
|
||||||
|
])
|
||||||
|
]
|
10
README.md
10
README.md
|
@ -66,4 +66,14 @@ if (advent) {
|
||||||
1. [:star: :star:](https://adventofcode.com/2023/day/1 "see puzzle")
|
1. [:star: :star:](https://adventofcode.com/2023/day/1 "see puzzle")
|
||||||
2. [:star: :star:](https://adventofcode.com/2023/day/2 "see puzzle")
|
2. [:star: :star:](https://adventofcode.com/2023/day/2 "see puzzle")
|
||||||
3. [:star: :star:](https://adventofcode.com/2023/day/3 "see puzzle")
|
3. [:star: :star:](https://adventofcode.com/2023/day/3 "see puzzle")
|
||||||
|
4. [:star: :star:](https://adventofcode.com/2023/day/4 "see puzzle")
|
||||||
|
5. [:star: :star:](https://adventofcode.com/2023/day/5 "see puzzle")
|
||||||
|
6. [:star: :star:](https://adventofcode.com/2023/day/6 "see puzzle")
|
||||||
|
7. [:star: :star:](https://adventofcode.com/2023/day/7 "see puzzle")
|
||||||
|
8. [:star: :star:](https://adventofcode.com/2023/day/8 "see puzzle")
|
||||||
|
9. [:star: :star:](https://adventofcode.com/2023/day/9 "see puzzle")
|
||||||
|
10. [:star: :star:](https://adventofcode.com/2023/day/10 "see puzzle")
|
||||||
|
|
||||||
|
#### [2024](https://adventofcode.com/2024 "2024 puzzle calendar")
|
||||||
|
1. [:star: :star:](https://adventofcode.com/2024/day/1 "see puzzle")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue