blob: 7ca6a087e7dce81220e524e52443c44051c0dde7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
;; https://adventofcode.com/2021/day/3
(func one-most-common (inp)
(>
(length
(filter (lambda (x) (eq? "1" x)) inp))
(/ (length inp) 2)))
; treating bits as a string of 1s and 0s
; note: for this problem, even if neb had byte things,
; strings would probably still be the way to go
(func bit-flip (bitstr)
(join
(map
(lambda (x) (if (eq? "0" x) "1" "0"))
(split bitstr))
""))
; 'exp' or something should be in the stdlib
(func two-n (n)
(branch
((eq? 0 n) 1)
((eq? 1 n) 2)
(#true
(* 2 (two-n (- n 1))))))
(func parse-binary (bitstr)
(parse-binary bitstr 0 0))
(func parse-binary (bitstr pos acc)
(if (eq? 0 (length bitstr))
acc
(block
(def next-int (string->int (last bitstr)))
(if (eq? 0 next-int)
(parse-binary
(most bitstr)
(+ 1 pos)
acc)
(parse-binary
(most bitstr)
(+ 1 pos)
(+ acc
(two-n pos)))))))
;(* 2 pos)))))))
(func do-the-thing (inp)
; i don't like the def/redef pattern
; this would benefit from something like "gather"
; this might also work as a map/reduce?
(def out "")
(for-count (length (first inp))
(def one?
(one-most-common
(map
(lambda (x)
(first (slice x _idx_ 1)))
inp)))
(redef out
(concat out
(if one? "1" "0"))))
(print (->string
(*
(parse-binary out)
(parse-binary (bit-flip out)))))
)
(def lines
(map split ; get all numbers as list of chars
(map strip
(read-lines "input.txt"))))
(do-the-thing lines)
|