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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#!/usr/bin/env BQN
#
# Utilities
#
IsAsciiNum ← ('0'⊸≤∧≤⟜'9')
ReadInt ← {(𝕨⊸×+⊣)´∘⌽-⟜'0'𝕩} # stolen from leah2
ReadDec ← 10⊸ReadInt
ReadInput ← {•file.Lines ∾ •path‿"/input/day"‿(•Fmt 𝕩)}
#
# 2021-12-01
#
# part 1
day1ExampleData ← 199‿200‿208‿210‿200‿207‿240‿269‿260‿263
day1Input ← ReadDec¨ReadInput 1
# NB: Because distance from the ground is never smaller than zero, it's
# no problem that nudge inserts a zero at the end of the right list
PositiveDeltaCount ← +´∘(⊢<«)+˝˘∘↕
! 7 = 1 PositiveDeltaCount day1ExampleData
•Out "Day 1.1: "∾•Fmt 1 PositiveDeltaCount day1Input
# part 2
! 5 = 3 PositiveDeltaCount day1ExampleData
•Out "Day 1.2: "∾•Fmt 3 PositiveDeltaCount day1Input
#
# 2021-12-02
#
# part 1
day2ExampleData ← ⟨
"forward 5",
"down 5",
"forward 8",
"up 3",
"down 8",
"forward 2",
⟩
day2Input ← ReadInput 2
ParseSubmarineCommand ← (((↕2)⊸((((-1)⊸⋆)∘(2⊸|))×(=⟜(⌊∘(÷⟜2))))∘("duf"⊸⊐)∘⊑)×ReadDec∘(IsAsciiNum/⊢))
SubmarineDestProduct ← {×´+´ParseSubmarineCommand¨𝕩}
! 150 = SubmarineDestProduct day2ExampleData
•Out "Day 2.1: "∾•Fmt SubmarineDestProduct day2Input
# part 2
SubmarineAimedDestProduct ← {
×´+´((×´)∘(1⊸↓)≍(1⊸⊑))¨ (<0‿0‿0) (⊢∾((⊑∘⌽⊣)+(⊑⊢)))` ParseSubmarineCommand¨𝕩
}
! 900 = SubmarineAimedDestProduct day2ExampleData
•Out "Day 2.2: "∾•Fmt SubmarineAimedDestProduct day2Input
#
# 2021-12-03
#
BinTable ← '0'-˜>
day3ExampleData ← BinTable ⟨
"00100",
"11110",
"10110",
"10111",
"10101",
"01111",
"00111",
"11100",
"10000",
"11001",
"00010",
"01010",
⟩
day3Input ← BinTable ReadInput 3
DeBinList ← ((2⊸×)+⊣)´⌽
_tableAggr ← {((÷⟜2)∘(/⟜⥊)´∘⌽∘≢𝔽(+˝))𝕩}
GammaRate ← < _tableAggr
! 22 = DeBinList GammaRate day3ExampleData
! 9 = DeBinList ¬GammaRate day3ExampleData
•Out "Day 3.1: "∾•Fmt (¬×○DeBinList⊢) GammaRate day3Input
_lifeSupportRating ← {
# Need to rename the arguments, otherwise the ternary expr becomes a function
bitPos ← 𝕨
Cmp ← 𝔽
crit ← Cmp _tableAggr 𝕩
matchPos ← bitPos ⊑˘ crit ((⥊˜⟜≢)=⊢) 𝕩
match ← matchPos/𝕩
{1=≠match?⊏match;(bitPos+1) Cmp _lifeSupportRating match}
}
OxygenGeneratorRating ← DeBinList 0 ≤_lifeSupportRating ⊢
CO2ScrubberRating ← DebinList 0 >_lifeSupportRating ⊢
! 23 = OxygenGeneratorRating day3ExampleData
! 10 = CO2ScrubberRating day3ExampleData
•Out "Day 3.2: "∾•Fmt (OxygenGeneratorRating×CO2ScrubberRating) day3Input
|