tvl-depot/users/sterni/exercises/aoc/2021/solutions.bqn
sterni ba719f8f5e feat(sterni/aoc/2022): day18 BQN solution
Change-Id: I1504cd5e443ff0b28c2d97ae357e5d92c88bba4d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7601
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
Autosubmit: sterni <sternenseemann@systemli.org>
2022-12-20 19:01:26 +00:00

484 lines
12 KiB
BQN
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env BQN
Xor •Import "../lib.bqn"
#
# Utilities
#
IsAsciiNum,ReadInt,ReadDec,SplitOn,_fix •Import •path"/../lib.bqn"
ReadInput {•file.Lines •path"/input/day"(•Fmt 𝕩)}
#
# 2021-12-01
#
# part 1
day1ExampleInput 199200208210200207240269260263
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 day1ExampleInput
•Out "Day 1.1: "•Fmt 1 PositiveDeltaCount day1Input
# part 2
! 5 = 3 PositiveDeltaCount day1ExampleInput
•Out "Day 1.2: "•Fmt 3 PositiveDeltaCount day1Input
#
# 2021-12-02
#
# part 1
day2ExampleInput
"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 day2ExampleInput
•Out "Day 2.1: "•Fmt SubmarineDestProduct day2Input
# part 2
SubmarineAimedDestProduct {
×´+´((×´)(1)(1))¨ (<000) ((()+()))` ParseSubmarineCommand¨𝕩
}
! 900 = SubmarineAimedDestProduct day2ExampleInput
•Out "Day 2.2: "•Fmt SubmarineAimedDestProduct day2Input
#
# 2021-12-03
#
BinTable '0'-˜>
day3ExampleInput 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 day3ExampleInput
! 9 = DeBinList ¬GammaRate day3ExampleInput
•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 day3ExampleInput
! 10 = CO2ScrubberRating day3ExampleInput
•Out "Day 3.2: "•Fmt (OxygenGeneratorRating×CO2ScrubberRating) day3Input
#
# 2021-12-04
#
day4Numbers ReadDec¨ ',' SplitOn ReadInput 4
day4Boards ReadDec¨>˘(' 'SplitOn¨)> (<) SplitOn 2ReadInput 4
BoardWins {C ´(´˘) (CC)𝕩}
_CallNumber {(𝕗𝕩) ((¬BoardWins))˘ 𝕨}
BoardWinScores {
𝕩 (0</×) (-») (+´)(BoardWins˘/(+´)˘(𝕨׬))¨ (<0˜𝕨) (𝕨 _CallNumber)`𝕩
}
day4WinScores day4Boards BoardWinScores day4Numbers
•Out "Day 4.1: "•Fmt day4WinScores
•Out "Day 4.2: "•Fmt day4WinScores
#
# 2021-12-06
#
day6ExampleInput 3,4,3,1,2
day6Input ReadDec¨ ',' SplitOn ReadInput 6
LanternfishPopulation {+´ (1+(×((6=))))𝕨 9¨ 𝕩}
! 26 = 18 LanternfishPopulation day6ExampleInput
! 5934 = 80 LanternfishPopulation day6ExampleInput
•Out "Day 6.1: "•Fmt 80 LanternfishPopulation day6Input
•Out "Day 6.2: "•Fmt 256 LanternfishPopulation day6Input
#
# 2021-12-07
#
# part 1
day7ExampleInput 16,1,2,0,4,2,7,1,2,14
day7Input ReadDec¨ ',' SplitOn ReadInput 7
PossiblePositions (´+(1+)´)
FuelConsumption +˝|(-)
_lowestFuelPossible {´(𝔽PossiblePositions)˜ 𝕩}
! 37 = FuelConsumption _lowestFuelPossible day7ExampleInput
•Out "Day 7.1: "•Fmt FuelConsumption _lowestFuelPossible day7Input
# part 2
TriNum 1+×÷2
FuelConsumption2 +˝(TriNum¨)|(-)
! 168 = FuelConsumption2 _lowestFuelPossible day7ExampleInput
•Out "Day 7.2: "•Fmt FuelConsumption2 _lowestFuelPossible day7Input
#
# 2021-12-09
#
# part 1
ParseHeightMap ((()))-'0'
day9ExampleInput ParseHeightMap
"2199943210",
"3987894921",
"9856789892",
"8767896789",
"9899965678"
day9Input ParseHeightMap ReadInput 9
Rotate () # counter clockwise
LowPoints {´𝕩(<((-) Rotate »˘Rotate˜))¨ 4}
RiskLevelSum (+´)(1+×LowPoints)
! 15 = RiskLevelSum day9ExampleInput
•Out "Day 9.1: "•Fmt RiskLevelSum day9Input
# part 2
NumberBasins ((1+)×)LowPoints
Basins {𝕩((<9)(«»«˘»˘)) _fix NumberBasins 𝕩}
LargestBasinsProduct {×´ 3 1 ¨ Basins 𝕩}
! 1134 = LargestBasinsProduct day9ExampleInput
•Out "Day 9.2: "•Fmt LargestBasinsProduct day9Input
#
# 2021-12-10
#
day10ExampleInput
"[({(<(())[]>[[{[]{<()<>>",
"[(()[<>])]({[<{<<[]>>(",
"{([(<{}[<>[]}>{[]{[(<()>",
"(((({<>}<{<{<>}{[]{[]{}",
"[[<[([]))<([[{}[[()]]]",
"[{[{({}]{}}([{[{{{}}([]",
"{<[[]]>}<{[{[{[]{()[[[]",
"[<(<(<(<{}))><([]([]()",
"<{([([[(<>()){}]>(<<{{",
"<{([{{}}[<[[[<>{}]]]>[]]",
day10Input ReadInput 10
# part 1
opp "([{<"
clp ")]}>"
SwapParen (oppclp)(()())
ParenStacks ((<)((()clp)(˜SwapParen)(1)`))
LegalParens ((1)¨»ParenStacks ((opp)()¨) )
_ScoreFor_ {𝕗(𝕘) 𝕩}
SyntaxScore +´(0357119725137 _ScoreFor_ (" "clp))(1(¬LegalParens/)¨)
! 26397 = SyntaxScore day10ExampleInput
•Out "Day 10.1: "•Fmt SyntaxScore day10Input
# part 2
AutocompleteScore {
Score (5×+)˜´((1+4) _ScoreFor_ clp)
# TODO(sterni): we compute ParenStacks twice here
((÷2)) Score()ParenStacks¨ (´LegalParens¨/) 𝕩
}
! 288957 = AutocompleteScore day10ExampleInput
•Out "Day 10.2: "•Fmt AutocompleteScore day10Input
#
# 2021-12-11
#
day11Input '0'-˜> ReadInput 11
day11ExampleInput >
5,4,8,3,1,4,3,2,2,3,,
2,7,4,5,8,5,4,7,1,1,,
5,2,6,4,5,5,6,1,7,3,,
6,1,4,1,3,3,6,1,4,6,,
6,3,5,7,3,8,5,4,7,8,,
4,1,6,7,5,2,4,6,4,5,,
2,1,7,6,8,4,1,7,2,1,,
6,8,8,2,8,8,1,1,3,4,,
4,8,4,6,8,4,8,5,5,4,,
5,2,8,3,7,5,1,5,2,6,,
# part 1
OctopusFlash {
((0)𝕊) 𝕩;
flashing (¬𝕨)9<𝕩
energy ((«˘»)+(»˘«)+(»˘»)+(«˘«)+(»˘)+(«˘)+«+») flashing
((𝕨flashing)𝕊)(0<+´flashing) energy+𝕩
}
OctopusStep ((9)×)OctopusFlash(1+)
OctopusFlashCount {+´0=>(OctopusStep)`(1+𝕨)<𝕩}
! 1656 = 100 OctopusFlashCount day11ExampleInput
•Out "Day 11.1: "•Fmt 100 OctopusFlashCount day11Input
# part 2
_iterCountUntil_ {
0 𝕊 𝕩;
𝔾((𝕨+1)𝕊)𝔽, 𝕨˙ 𝕩
}
OctopusAllFlashing OctopusStep _iterCountUntil_ (´(0=))
! 195 = OctopusAllFlashing day11ExampleInput
•Out "Day 11.2: "•Fmt OctopusAllFlashing day11Input
#
# 2021-12-13
#
SplitFoldingInstructions ("fold along"()¨)(0(¨/))
day13ExampleInput SplitFoldingInstructions
"6,10",
"0,14",
"9,10",
"0,3",
"10,4",
"4,11",
"6,0",
"6,12",
"4,1",
"0,13",
"10,12",
"3,4",
"3,0",
"8,4",
"1,10",
"2,14",
"8,10",
"9,0",
"",
"fold along y=7",
"fold along x=5",
day13Input SplitFoldingInstructions ReadInput 13
ParseDots ReadDec¨(','SplitOn)¨
ParseFolds ('y'ReadDec(IsAsciiNum/))¨
day13ExampleDots ParseDots day13ExampleInput
# part 1
# 𝕨=0 => x, 𝕨=1 => y
# 𝕩 is coordinate to fold around
# 𝕗 is input dot list (see ParseDots)
_Fold {((𝕩(((2×)-))1)¨(¨𝕨)) 𝕗}
! 17 = 1 day13ExampleDots _Fold 7
day13Dots ParseDots day13Input
day13Folds ParseFolds 1 day13Input
•Out "Day 13.1: "•Fmt (day13Dots _Fold)´ day13Folds
# part 2
PerformAllFolds {𝕩 {(𝕨 _Fold)´𝕩}˜´ 𝕨}
DotMatrix {
width, height 1+˝2𝕩
{𝕩? '█';' '}¨ heightwidth¨((+(width×))´)¨ 𝕩
}
•Out "Day 13.2:"
•Out •Fmt DotMatrix day13Folds PerformAllFolds day13Dots
#
# 2021-12-14
#
day14Polymer ReadInput 14
day14Mapping 2ReadInput 14
lp (2)¨ day14Mapping
le lp
# returns array as long as 𝕨 detailing how many times the element
# at any given index occurs in 𝕩.
Counts (()(/))
deltaPairs {
addedPairs ((-1)¨day14Mapping) ((0))(¨)¨ lp
removedPairs ¨ (2)¨ lp
addedPairs (-(lpCounts))¨ removedPairs
}
pairCount lp Counts (˘) 2day14Polymer
PairInsert {𝕩 +´ 𝕩רdeltaPairs}
pairElementCount (leCounts)¨lp
ElementRarityDiff {
((-1)-) 2÷˜ +´ pairElementCount×PairInsert𝕩 pairCount
}
•Out "Day 14.1: "•Fmt ElementRarityDiff 10
•Out "Day 14.2: "•Fmt ElementRarityDiff 40
#
# 2021-12-15
#
day15ExampleInput >
1163751742
1381373672
2136511328
3694931569
7463417111
1319128137
1359912421
3125421639
1293138521
2311944581
day15Input '0'-˜ (())ReadInput 15
LowestRiskLevel {
start 0˙ () 𝕩
ir (1𝕩)
Step {𝕩 𝕨 + (ir«ir»«˘»˘) 𝕩}
𝕩Step _fix start
}
! 40 = LowestRiskLevel day15ExampleInput
•Out "Day 15.1: "•Fmt LowestRiskLevel day15Input
FiveByFiveMap {(9|)(-1) (<𝕩)+ +˜5}
! 315 = LowestRiskLevel FiveByFiveMap day15ExampleInput
•Out "Day 15.2: "•Fmt LowestRiskLevel FiveByFiveMap day15Input
#
# 2021-12-20
#
ParsePic (0)('#'=)>
day20ExampleAlgo '#'="..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..###..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#..#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#......#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#.....####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.......##..####..#...#.#.#...##..#.#..###..#####........#..####......#..#"
day20ExamplePic ParsePic "#..#.", "#....", "##..#", "..#..", "..###"
day20Input ReadInput 20
day20Algo '#'=day20Input
day20Pic ParsePic 2day20Input
GrowAxis {( (-1) (𝕨)(2˙)) 𝕩}
Grow {𝕨 GrowAxis 𝕨 GrowAxis˘ 𝕩}
Enhance {
inf 1𝕩
npic ((𝕨)DebinList)˘˘ 33 (infGrow)2 𝕩
ninf 𝕨˜511×inf
npicninf
}
_EnhancedPixelCount {+´ (𝕨Enhance)𝕗 𝕩}
! 35 = day20ExampleAlgo 2 _EnhancedPixelCount day20ExamplePic
! 3351 = day20ExampleAlgo 50 _EnhancedPixelCount day20ExamplePic
•Out "Day 20.1: "•Fmt day20Algo 2 _EnhancedPixelCount day20Pic
•Out "Day 20.2: "•Fmt day20algo 50 _EnhancedPixelCount day20Pic
#
# 2021-12-25
#
day25Input ".>v" > ReadInput 25
day25ExampleInput ".>v"10"v...>>.vv>.vv>>.vv..>>.>v>...v>>v>>.>.v.v>v.vv.v..>.>>..v....vv..>.>v.v.v..>>v.v....v..v.>"
MoveHerd {(𝕩𝕩𝕨)+𝕨× (𝕨=𝕩) (Xor(1)) (0=𝕩)(-1)𝕨=𝕩}
_fixCount {
1 𝕊 𝕩;
𝕩 (𝕨+1)𝕊, 𝕨˙ 𝔽 𝕩
}
MoveAllHerds (2MoveHerd)(1MoveHerd˘)
! 58 = MoveAllHerds _fixCount day25ExampleInput
•Out "Day 25.1: "•Fmt MoveAllHerds _fixCount day25Input