343b811bbc
Change-Id: I8c8b535defb42f15eafc816ebe953e51b11ea702
150 lines
3.3 KiB
BQN
Executable file
150 lines
3.3 KiB
BQN
Executable file
#!/usr/bin/env BQN
|
||
|
||
#
|
||
# Utilities
|
||
#
|
||
|
||
IsAsciiNum ← ('0'⊸≤∧≤⟜'9')
|
||
|
||
ReadInt ← {(𝕨⊸×+⊣)´∘⌽-⟜'0'𝕩} # stolen from leah2
|
||
ReadDec ← 10⊸ReadInt
|
||
|
||
ReadInput ← {•file.Lines ∾ •path‿"/input/day"‿(•Fmt 𝕩)}
|
||
|
||
SplitOn ← ((⊢ (-1˙)⍟⊣¨ +`)∘=⊔⊢)
|
||
|
||
#
|
||
# 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
|
||
|
||
#
|
||
# 2021-12-07
|
||
#
|
||
|
||
# part 1
|
||
|
||
day6ExampleData ← ⟨16,1,2,0,4,2,7,1,2,14⟩
|
||
day6Input ← ReadDec¨ ',' SplitOn ⊑ReadInput 6
|
||
|
||
PossiblePositions ← (⌊´+⟜(↕1⊸+)⌈´)
|
||
FuelConsumption ← +˝∘|∘(-⌜)
|
||
_lowestFuelPossible ← {⌊´∘(𝔽⟜PossiblePositions)˜ 𝕩}
|
||
|
||
! 37 = FuelConsumption _lowestFuelPossible day6ExampleData
|
||
|
||
•Out "Day 7.1: "∾•Fmt FuelConsumption _lowestFuelPossible day6Input
|
||
|
||
# part 2
|
||
|
||
TriNum ← 1⊸+×÷⟜2
|
||
|
||
FuelConsumption2 ← +˝∘(TriNum¨)∘|∘(-⌜)
|
||
|
||
! 168 = FuelConsumption2 _lowestFuelPossible day6ExampleData
|
||
|
||
•Out "Day 7.2: "∾•Fmt FuelConsumption2 _lowestFuelPossible day6Input
|