2021-12-01 13:04:33 +01:00
|
|
|
|
#!/usr/bin/env BQN
|
|
|
|
|
|
2022-12-18 16:56:32 +01:00
|
|
|
|
⟨Xor⟩ ← •Import "../lib.bqn"
|
|
|
|
|
|
2021-12-01 13:04:33 +01:00
|
|
|
|
#
|
|
|
|
|
# Utilities
|
|
|
|
|
#
|
|
|
|
|
|
2022-12-01 13:41:49 +01:00
|
|
|
|
⟨IsAsciiNum,ReadInt,ReadDec,SplitOn,_fix⟩ ← •Import •path∾"/../lib.bqn"
|
2021-12-01 13:04:33 +01:00
|
|
|
|
|
2021-12-04 01:09:55 +01:00
|
|
|
|
ReadInput ← {•file.Lines ∾ •path‿"/input/day"‿(•Fmt 𝕩)}
|
2021-12-01 13:04:33 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 2021-12-01
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# part 1
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
day1ExampleInput ← 199‿200‿208‿210‿200‿207‿240‿269‿260‿263
|
2021-12-07 10:08:13 +01:00
|
|
|
|
day1Input ← ReadDec¨ReadInput 1
|
2021-12-01 13:04:33 +01:00
|
|
|
|
|
|
|
|
|
# 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 ← +´∘(⊢<«)+˝˘∘↕
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
! 7 = 1 PositiveDeltaCount day1ExampleInput
|
2021-12-01 13:04:33 +01:00
|
|
|
|
|
2021-12-04 01:09:55 +01:00
|
|
|
|
•Out "Day 1.1: "∾•Fmt 1 PositiveDeltaCount day1Input
|
2021-12-01 13:04:33 +01:00
|
|
|
|
|
|
|
|
|
# part 2
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
! 5 = 3 PositiveDeltaCount day1ExampleInput
|
2021-12-01 13:04:33 +01:00
|
|
|
|
|
2021-12-04 01:09:55 +01:00
|
|
|
|
•Out "Day 1.2: "∾•Fmt 3 PositiveDeltaCount day1Input
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 2021-12-02
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# part 1
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
day2ExampleInput ← ⟨
|
2021-12-04 01:09:55 +01:00
|
|
|
|
"forward 5",
|
|
|
|
|
"down 5",
|
|
|
|
|
"forward 8",
|
|
|
|
|
"up 3",
|
|
|
|
|
"down 8",
|
|
|
|
|
"forward 2",
|
|
|
|
|
⟩
|
|
|
|
|
|
|
|
|
|
day2Input ← ReadInput 2
|
|
|
|
|
|
2021-12-07 10:08:13 +01:00
|
|
|
|
ParseSubmarineCommand ← (((↕2)⊸((((-1)⊸⋆)∘(2⊸|))×(=⟜(⌊∘(÷⟜2))))∘("duf"⊸⊐)∘⊑)×ReadDec∘(IsAsciiNum/⊢))
|
2021-12-04 01:09:55 +01:00
|
|
|
|
|
|
|
|
|
SubmarineDestProduct ← {×´+´ParseSubmarineCommand¨𝕩}
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
! 150 = SubmarineDestProduct day2ExampleInput
|
2021-12-04 01:09:55 +01:00
|
|
|
|
|
|
|
|
|
•Out "Day 2.1: "∾•Fmt SubmarineDestProduct day2Input
|
|
|
|
|
|
|
|
|
|
# part 2
|
|
|
|
|
|
|
|
|
|
SubmarineAimedDestProduct ← {
|
|
|
|
|
×´+´((×´)∘(1⊸↓)≍(1⊸⊑))¨ (<0‿0‿0) (⊢∾((⊑∘⌽⊣)+(⊑⊢)))` ParseSubmarineCommand¨𝕩
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
! 900 = SubmarineAimedDestProduct day2ExampleInput
|
2021-12-04 01:09:55 +01:00
|
|
|
|
|
|
|
|
|
•Out "Day 2.2: "∾•Fmt SubmarineAimedDestProduct day2Input
|
2021-12-07 11:02:35 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 2021-12-03
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
BinTable ← '0'-˜>
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
day3ExampleInput ← BinTable ⟨
|
2021-12-07 11:02:35 +01:00
|
|
|
|
"00100",
|
|
|
|
|
"11110",
|
|
|
|
|
"10110",
|
|
|
|
|
"10111",
|
|
|
|
|
"10101",
|
|
|
|
|
"01111",
|
|
|
|
|
"00111",
|
|
|
|
|
"11100",
|
|
|
|
|
"10000",
|
|
|
|
|
"11001",
|
|
|
|
|
"00010",
|
|
|
|
|
"01010",
|
|
|
|
|
⟩
|
|
|
|
|
|
|
|
|
|
day3Input ← BinTable ReadInput 3
|
|
|
|
|
|
|
|
|
|
DeBinList ← ((2⊸×)+⊣)´⌽
|
|
|
|
|
_tableAggr ← {((÷⟜2)∘(/⟜⥊)´∘⌽∘≢𝔽(+˝))𝕩}
|
|
|
|
|
GammaRate ← < _tableAggr
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
! 22 = DeBinList GammaRate day3ExampleInput
|
|
|
|
|
! 9 = DeBinList ¬GammaRate day3ExampleInput
|
2021-12-07 11:02:35 +01:00
|
|
|
|
|
|
|
|
|
•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 ⊢
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
! 23 = OxygenGeneratorRating day3ExampleInput
|
|
|
|
|
! 10 = CO2ScrubberRating day3ExampleInput
|
2021-12-07 11:02:35 +01:00
|
|
|
|
|
|
|
|
|
•Out "Day 3.2: "∾•Fmt (OxygenGeneratorRating×CO2ScrubberRating) day3Input
|
2021-12-07 19:05:15 +01:00
|
|
|
|
|
2021-12-26 20:47:01 +01:00
|
|
|
|
#
|
|
|
|
|
# 2021-12-04
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
day4Numbers ← ReadDec¨ ',' SplitOn ⊑ReadInput 4
|
|
|
|
|
day4Boards ← ReadDec¨>˘(' '⊸SplitOn¨)> (<⟨⟩) SplitOn 2↓ReadInput 4
|
|
|
|
|
|
|
|
|
|
BoardWins ← {C ← ∨´∘(∧´˘) ⋄ (C∨C∘⍉)𝕩}
|
|
|
|
|
|
|
|
|
|
_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-24 15:34:40 +01:00
|
|
|
|
#
|
|
|
|
|
# 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 19:05:15 +01:00
|
|
|
|
#
|
|
|
|
|
# 2021-12-07
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# part 1
|
|
|
|
|
|
2021-12-24 15:34:40 +01:00
|
|
|
|
day7ExampleInput ← ⟨16,1,2,0,4,2,7,1,2,14⟩
|
|
|
|
|
day7Input ← ReadDec¨ ',' SplitOn ⊑ReadInput 7
|
2021-12-07 19:05:15 +01:00
|
|
|
|
|
|
|
|
|
PossiblePositions ← (⌊´+⟜(↕1⊸+)⌈´)
|
|
|
|
|
FuelConsumption ← +˝∘|∘(-⌜)
|
|
|
|
|
_lowestFuelPossible ← {⌊´∘(𝔽⟜PossiblePositions)˜ 𝕩}
|
|
|
|
|
|
2021-12-24 15:34:40 +01:00
|
|
|
|
! 37 = FuelConsumption _lowestFuelPossible day7ExampleInput
|
2021-12-07 19:05:15 +01:00
|
|
|
|
|
2021-12-24 15:34:40 +01:00
|
|
|
|
•Out "Day 7.1: "∾•Fmt FuelConsumption _lowestFuelPossible day7Input
|
2021-12-07 19:05:15 +01:00
|
|
|
|
|
|
|
|
|
# part 2
|
|
|
|
|
|
|
|
|
|
TriNum ← 1⊸+×÷⟜2
|
|
|
|
|
|
|
|
|
|
FuelConsumption2 ← +˝∘(TriNum¨)∘|∘(-⌜)
|
|
|
|
|
|
2021-12-24 15:34:40 +01:00
|
|
|
|
! 168 = FuelConsumption2 _lowestFuelPossible day7ExampleInput
|
2021-12-07 19:05:15 +01:00
|
|
|
|
|
2021-12-24 15:34:40 +01:00
|
|
|
|
•Out "Day 7.2: "∾•Fmt FuelConsumption2 _lowestFuelPossible day7Input
|
2021-12-09 16:51:02 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 2021-12-09
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# part 1
|
|
|
|
|
|
|
|
|
|
ParseHeightMap ← ((≠≍(≠⊑))⥊∾)∘-⟜'0'
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
day9ExampleInput ← ParseHeightMap ⟨
|
2021-12-09 16:51:02 +01:00
|
|
|
|
"2199943210",
|
|
|
|
|
"3987894921",
|
|
|
|
|
"9856789892",
|
|
|
|
|
"8767896789",
|
|
|
|
|
"9899965678"
|
|
|
|
|
⟩
|
|
|
|
|
day9Input ← ParseHeightMap ReadInput 9
|
|
|
|
|
|
|
|
|
|
Rotate ← (⍉⌽)∘⊢⍟⊣ # counter clockwise
|
|
|
|
|
LowPoints ← {∧´𝕩⊸(⊣<((-⊢) Rotate ∞⊸»˘∘Rotate˜))¨ ↕4}
|
|
|
|
|
|
|
|
|
|
RiskLevelSum ← (+´⥊)∘(1⊸+×LowPoints)
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
! 15 = RiskLevelSum day9ExampleInput
|
2021-12-09 16:51:02 +01:00
|
|
|
|
|
|
|
|
|
•Out "Day 9.1: "∾•Fmt RiskLevelSum day9Input
|
|
|
|
|
|
|
|
|
|
# part 2
|
|
|
|
|
|
|
|
|
|
NumberBasins ← ((1⊸+⊒⌾⥊)×⊢)∘LowPoints
|
|
|
|
|
Basins ← {𝕩⊸((<⟜9⊣)∧(«⌈»⌈«˘⌈»˘⌈⊢)∘⊢) _fix NumberBasins 𝕩}
|
|
|
|
|
LargestBasinsProduct ← {×´ 3↑ ∨ 1↓ ≠¨ ⊔⥊Basins 𝕩}
|
|
|
|
|
|
2021-12-13 22:35:54 +01:00
|
|
|
|
! 1134 = LargestBasinsProduct day9ExampleInput
|
2021-12-09 16:51:02 +01:00
|
|
|
|
|
|
|
|
|
•Out "Day 9.2: "∾•Fmt LargestBasinsProduct day9Input
|
2021-12-14 00:31:42 +01:00
|
|
|
|
|
2021-12-28 17:07:12 +01:00
|
|
|
|
#
|
|
|
|
|
# 2021-12-10
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
day10ExampleInput ← ⟨
|
|
|
|
|
"[({(<(())[]>[[{[]{<()<>>",
|
|
|
|
|
"[(()[<>])]({[<{<<[]>>(",
|
|
|
|
|
"{([(<{}[<>[]}>{[]{[(<()>",
|
|
|
|
|
"(((({<>}<{<{<>}{[]{[]{}",
|
|
|
|
|
"[[<[([]))<([[{}[[()]]]",
|
|
|
|
|
"[{[{({}]{}}([{[{{{}}([]",
|
|
|
|
|
"{<[[]]>}<{[{[{[]{()[[[]",
|
|
|
|
|
"[<(<(<(<{}))><([]([]()",
|
|
|
|
|
"<{([([[(<>()){}]>(<<{{",
|
|
|
|
|
"<{([{{}}[<[[[<>{}]]]>[]]",
|
|
|
|
|
⟩
|
|
|
|
|
day10Input ← ReadInput 10
|
|
|
|
|
|
|
|
|
|
# part 1
|
|
|
|
|
|
|
|
|
|
opp ← "([{<"
|
|
|
|
|
clp ← ")]}>"
|
|
|
|
|
SwapParen ← (opp∾⌽clp)⊸((⊑⊐)⊑(⌽⊣))
|
|
|
|
|
|
|
|
|
|
ParenStacks ← ((<⟨⟩)⊸(((⊑∊)⟜clp⊢)◶(∾˜⟜SwapParen)‿(1⊸↓⊣)`))
|
|
|
|
|
LegalParens ← ((1⊸↑)¨∘»∘ParenStacks ((∊⟜opp⊢)∨(≡⟜⋈)¨) ⊢)
|
|
|
|
|
|
|
|
|
|
_ScoreFor_ ← {𝕗⊸(𝕘⊸⊐⊏⊣) 𝕩}
|
|
|
|
|
|
|
|
|
|
SyntaxScore ← +´∘(0‿3‿57‿1197‿25137 _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-28 13:08:20 +01:00
|
|
|
|
#
|
|
|
|
|
# 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-14 00:31:42 +01:00
|
|
|
|
#
|
|
|
|
|
# 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
|
|
|
|
|
|
2021-12-14 01:13:28 +01:00
|
|
|
|
PerformAllFolds ← {𝕩 {(𝕨 _Fold)´𝕩}˜´ ⌽𝕨}
|
2021-12-14 00:31:42 +01:00
|
|
|
|
DotMatrix ← {
|
2021-12-16 00:44:51 +01:00
|
|
|
|
⟨width, height⟩ ← 1+⌈˝∘‿2⥊∾𝕩
|
2021-12-14 00:31:42 +01:00
|
|
|
|
{𝕩? '█';' '}¨ height‿width⥊≠¨⊔((⊣+(width⊸×)∘⊢)´)¨ 𝕩
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
•Out "Day 13.2:"
|
|
|
|
|
•Out •Fmt DotMatrix day13Folds PerformAllFolds day13Dots
|
2021-12-16 00:46:00 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 2021-12-14
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
day14Polymer ← ⊑ReadInput 14
|
|
|
|
|
day14Mapping ← 2↓ReadInput 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 (-○(lp⊸Counts))¨ removedPairs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pairCount ← lp Counts ⥊∘(⋈˘) 2↕day14Polymer
|
|
|
|
|
|
|
|
|
|
PairInsert ← {𝕩 +´ 𝕩רdeltaPairs}
|
|
|
|
|
|
|
|
|
|
pairElementCount ← (le⊸Counts)¨lp
|
|
|
|
|
|
|
|
|
|
ElementRarityDiff ← {
|
|
|
|
|
((-1)⊸⊑-⊑)∧ ⌈2÷˜ +´ pairElementCount×PairInsert⍟𝕩 pairCount
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
•Out "Day 14.1: "∾•Fmt ElementRarityDiff 10
|
|
|
|
|
•Out "Day 14.2: "∾•Fmt ElementRarityDiff 40
|
2021-12-16 13:40:12 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 2021-12-15
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
day15ExampleInput ← >⟨
|
|
|
|
|
1‿1‿6‿3‿7‿5‿1‿7‿4‿2
|
|
|
|
|
1‿3‿8‿1‿3‿7‿3‿6‿7‿2
|
|
|
|
|
2‿1‿3‿6‿5‿1‿1‿3‿2‿8
|
|
|
|
|
3‿6‿9‿4‿9‿3‿1‿5‿6‿9
|
|
|
|
|
7‿4‿6‿3‿4‿1‿7‿1‿1‿1
|
|
|
|
|
1‿3‿1‿9‿1‿2‿8‿1‿3‿7
|
|
|
|
|
1‿3‿5‿9‿9‿1‿2‿4‿2‿1
|
|
|
|
|
3‿1‿2‿5‿4‿2‿1‿6‿3‿9
|
|
|
|
|
1‿2‿9‿3‿1‿3‿8‿5‿2‿1
|
|
|
|
|
2‿3‿1‿1‿9‿4‿4‿5‿8‿1
|
|
|
|
|
⟩
|
|
|
|
|
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-24 18:11:00 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 2021-12-20
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
ParsePic ← (⋈⟜0)∘('#'⊸=)∘>
|
|
|
|
|
|
|
|
|
|
day20ExampleAlgo ← '#'="..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..###..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#..#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#......#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#.....####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.......##..####..#...#.#.#...##..#.#..###..#####........#..####......#..#"
|
|
|
|
|
day20ExamplePic ← ParsePic ⟨"#..#.", "#....", "##..#", "..#..", "..###"⟩
|
|
|
|
|
day20Input ← ReadInput 20
|
|
|
|
|
day20Algo ← '#'=⊑day20Input
|
|
|
|
|
day20Pic ← ParsePic 2↓day20Input
|
|
|
|
|
|
|
|
|
|
GrowAxis ← {(⊢ (-1)⊸⌽∘∾ (⥊⟜𝕨)∘(2˙⌾⊑)∘≢) 𝕩}
|
|
|
|
|
Grow ← {𝕨 GrowAxis 𝕨 GrowAxis˘ 𝕩}
|
|
|
|
|
|
|
|
|
|
Enhance ← {
|
|
|
|
|
inf ← 1⊑𝕩
|
|
|
|
|
npic ← ((⊑⟜𝕨)∘DebinList∘⥊)˘˘ 3‿3↕ (inf⊸Grow)⍟2 ⊑𝕩
|
|
|
|
|
ninf ← 𝕨⊑˜511×inf
|
|
|
|
|
npic⋈ninf
|
|
|
|
|
}
|
|
|
|
|
_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-26 00:18:32 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 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 ← (2⊸MoveHerd)∘(1⊸MoveHerd˘)
|
|
|
|
|
|
|
|
|
|
! 58 = MoveAllHerds _fixCount day25ExampleInput
|
|
|
|
|
•Out "Day 25.1: "∾•Fmt MoveAllHerds _fixCount day25Input
|