aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2024-12-01 06:42:16 +0100
committerMarvin Borner2024-12-01 06:42:16 +0100
commitef60008497c2db371e782297ca34bd136e4bc829 (patch)
tree8786a987902f5eb6472c48756c2df7215fb620e5
parent4f30d2364bb34c320e2e0be85eee64c2615db6de (diff)
better
-rw-r--r--2024/01/solve.bruijn26
-rwxr-xr-x2024/01/solve.py21
2 files changed, 34 insertions, 13 deletions
diff --git a/2024/01/solve.bruijn b/2024/01/solve.bruijn
new file mode 100644
index 0000000..2075668
--- /dev/null
+++ b/2024/01/solve.bruijn
@@ -0,0 +1,26 @@
+:import std/Combinator .
+:import std/Monad/Parser .
+:import std/Math N
+:import std/String S
+:import std/Char C
+
+parse some (cons <$> number <*> (spaces *> (number <* newline)))
+ number S.string→number <$> (some (satisfy C.numeric?))
+ spaces some (satisfy (C.eq? ' '))
+ newline satisfy (C.eq? '\n')
+ cons [[[0 2 [0 2 [[0]]]]]]
+
+transpose y [[rec]]
+ rec S.∅?(S.^0) [[0]] trans
+ trans [0 (S.map &[[1]] 1) (2 (S.map &[[0]] 1))]
+
+:test (transpose [0 [0 (+1) [0 (+2) [[0]]]] [0 [0 (+3) [0 (+4) [[0]]]] [[0]]]]) ([0 [0 (+1) [0 (+3) [[0]]]] [0 [0 (+2) [0 (+4) [[0]]]] [[0]]]])
+
+part1 map go
+ go &[[[0 (S.sort-asc 2) (S.sort-asc S._1)]]] → &[[S.zip-with (N.abs ∘∘ N.sub) 1 0]] → N.sum
+
+part2 [0]
+
+# main (φ (S.cons ⋔ (transpose <$> parse)) part1 part2) → [0 [0] [[1]]]
+
+main (part1 (transpose <$> parse)) → [0 [0] [[1]]]
diff --git a/2024/01/solve.py b/2024/01/solve.py
index e0c8ab0..a624499 100755
--- a/2024/01/solve.py
+++ b/2024/01/solve.py
@@ -1,22 +1,18 @@
#!/bin/env python
-# L = open("input").readlines()
+from collections import Counter
+
L = [
[int(i) for i in l.strip().split(" ")] for l in open("input").readlines()
]
-# L = [int(l.strip()) for l in open("input").readlines()]
def part1():
res = 0
- left = [l[0] for l in L]
- right = [l[1] for l in L]
- while left:
- left_min = min(range(len(left)), key=left.__getitem__)
- right_min = min(range(len(right)), key=right.__getitem__)
- res += abs(left[left_min] - right[right_min])
- del left[left_min]
- del right[right_min]
+ left = sorted(l[0] for l in L)
+ right = sorted(l[1] for l in L)
+ for i in range(len(left)):
+ res += abs(left[i] - right[i])
print(res)
@@ -24,9 +20,8 @@ def part2():
res = 0
left = [l[0] for l in L]
right = [l[1] for l in L]
- for i, l in enumerate(left):
- res += l * right.count(l)
- print(res)
+ c = Counter(right)
+ print(sum(l * c[l] for l in left))
part1()